[問題] spinlock問題

作者: gn00618777 (非常念舊)   2023-01-30 22:25:19
板友們晚安
我想請教一個Linux Kernel的問題,但看了Linux板,感覺不是在討論code。
所以我就來這裡發文看看。若我在這邊發文不適合可以在下面回文,我會
再刪除,謝謝。
我在【知乎】這個平台看到有關於spin_lock_irq()的介紹
https://reurl.cc/eWe4lb
裡面有個圖關於spin_lock_irq(&lock1)後再一次spin_lock_irq(&lock2)
緊接著spin_unlock_irq(&lock2)後,CPU發生了interrupt,若好死不死
這ISR內要執行lock1所保護的critical section,由於前面已有task獲取
到lock1的鎖了,ISR內鐵定拿不到lock1便會deadlock.
其實我不太知道為何deadlock的原因。查了網路上的說明更加混亂了...
這有兩種deadlock的原因請問是哪一種呢?
1.ISR內因獲得不到鎖所以永久的spin,所以先前拿到鎖的task也因此無法解鎖.
2.先前拿到鎖的task在被中斷後狀態變成TASK_INTERRUPT,schedual無法再調度
task使之有機會解鎖,這意味著ISR內不會永久spin,且有一定的時間霸佔CPU?
希望能有kernel高手能解答小弟疑惑@@,謝謝。
作者: wulouise (在線上!=在電腦前)   2023-01-30 22:36:00
ISR lock要等被interrupt的task unlock->可是cpu不會切永遠等不到task unlock-> deadlock
作者: saxontai (黑暗,點綴孤零零的星)   2023-01-30 22:52:00
有LinuxDev版。
作者: KaiNBD   2023-01-30 23:27:00
原因如樓上,另外這主要是說明 spin_lock_irqsave 的需求因 lock_irq 沒有處理 nested,導致 unlock_irq(&lock2)時就立即 enable IRQ,因此進入 deadlock 狀態。修正上述: 有機會進入 deadlock 狀態改用 lock_irqsave 後才能在 unlock 時回復先前 IRQ 狀態而非無腦啟用 IRQ。進而解決了誤啟用 IRQ 導致的 deadlock
作者: gn00618777 (非常念舊)   2023-01-31 21:10:00
請問原因是我列的第一種情況嗎? ^^" 再確認一下
作者: dces4212 (flawless)   2023-02-02 19:50:00
你這句「schedual無法再調度task使之有機會解鎖」是啥意思?沒法被排程的話,給定task怎麼解開原先獲得的鎖?
作者: gn00618777 (非常念舊)   2023-02-02 21:37:00
我的意思是想說第2, ISR不會霸佔CPU, OS透過schedual讓其他task使用CPU,只是不會給有lock的task。因為也是從網路上看的,我也不知道是不是第2點而造成deadlock
作者: lc85301 (pomelocandy)   2023-02-04 10:01:00
ISR 霸佔 CPU 的理由是,interrupt 會設定較高的優先權優先處理,但 ISR 又卡死在搶佔 lock 的工作時間到了 timer interrupt 跳起來,CPU 進到 schedulerscheduler 會選定優先權高的程序,也就是 ISR 繼續執行
作者: gn00618777 (非常念舊)   2023-02-08 21:33:00
因為查了資料,ISR並不是process,也就不會被schedualhttps://reurl.cc/QW1lpb
作者: lc85301 (pomelocandy)   2023-02-08 22:42:00
這樣說有道理,應該說 ISR 是中斷處理,除非有權限更高的interrupt,否則它不會被 timer interrupt 打斷所以一但 ISR 在等待某個資源解鎖,CPU 就直接卡死在那裡

Links booklink

Contact Us: admin [ a t ] ucptt.com