簡體   English   中英

spin_lock_bh()如何工作?

[英]How does spin_lock_bh() work?

我有一個我正在使用的設備驅動程序,它在ISR(更具體地說是ISR的下半部分)和read()調用之間有一個共享資源。

ISR只是調用schedule_work()來讓下半部分完成繁重的工作。 資源在read() (即用戶上下文)和實現下半部分的函數之間共享,這就是我使用spin_lock_bh()鎖定的原因。

我不明白的是鎖定的機制。 假設有人持有鎖定,當ISR命中schedule_work()時會發生什么(即,在我們持有鎖定時觸發硬件中斷)? 工作是否仍然安排好,然后在以后運行或者是否會被丟棄? 換句話說......實際上“鎖定”或阻止了什么(即工作隊列或工作的執行)? 工作隊列是否得到更新?

為了對比我的問題,我理解如果我使用spin_lock_irqsave() ,ISR將在持有鎖時被禁用,所以我不會首先得到schedule_work() ,但考慮到如何共享資源,我不要認為我需要或想要在持有鎖時禁用硬件中斷。

如果ISR可能由不禁用中斷的代碼保留,則ISR不能等待鎖定。 那會導致僵局。 spin_lock_irqsave首先禁用中斷,保存先前的狀態,然后進行鎖定。 恢復以相反的順序撤消此操作。

下半部分仍然是一個中斷。 spin_lock_bh通過禁用下半部分執行然后獲取鎖定來執行等效操作。 這可以防止下半部分執行我們的read代碼。

鎖可防止多個線程執行鎖定的代碼。 只有在握住鎖的情況下操作才能保護工作隊列。

spin_lock_bh禁用softirqs(bh是一個古老的術語,實際上指的是softirqs)。 但是,使用schedule_work觸發的work_queues實際上並不在softirq中運行,而是在專用線程中運行,因此處理上下文。

因此,您的驅動程序只需要簡單的spin_lock()來防止並發read()調用。

在訪問與“上半部分”共享的資源時,可能需要禁用中斷,但這不是您的問題的范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM