作者davidwangs (茶米)
看板LinuxDev
標題[問題] non-reentrant disable_irq
時間Mon Jan 1 11:44:35 2018
最近在寫device driver,有需要去disable_irq,但和enable_irq不會成對
所以用了一個disable_irq_count來避免reentrance
又為了保護disable_irq_count,使用了spin_lock
後來打開CONFIG_DEBUG_ATOMIC_SLEEP才發現
disable_irq會sleep,所以不能用在spin_lock內
所以想請教一下要用什麼方式才能保護好disable_irq_count,
讓disable_irq只會執行一次
code:
void disableInterrupt() {
spin_lock_saveirq(&lock, flag);
if(disable_irq_count == 0) {
disable_irq(irq);
disable_irq_count++;
}
spin_lock_irqrestore(&lock, flag);
}
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.231.136.142
※ 文章網址: https://webptt.com/m.aspx?n=bbs/LinuxDev/M.1514778279.A.33A.html
1F:→ galic: 我記得spin lock裡面只是最好不要sleep 因為很可能造成 01/01 20:06
2F:→ galic: deadlock 所以會開那個config去檢查有沒有sleep 01/01 20:06
3F:→ galic: 而disable_irq內部的實作也會用到spin lock 01/01 20:07
4F:→ galic: 我的意思是你只要能確定不會造成deadlock 那就算sleep也沒 01/01 20:07
5F:→ galic: 關係 不然用atomic相關的操作去保護disable_irq_count 01/01 20:08
6F:→ galic: 還是建議disable和enable irq要成對出現 01/01 20:09
7F:→ davidwangs: 因為老闆強烈要求,所以這個config檢查的東西一定要解 01/01 22:12
8F:→ davidwangs: 我也是千百個不願意啊!還是謝謝大大解釋! 01/01 22:13
9F:→ davidwangs: 在想是不是能用mutex來做? 01/01 22:13
10F:推 michael0728n: 不會成對是指不會用enable_irq? 01/07 16:16
11F:→ michael0728n: mutex系列應該可以吧,除非你這是irq裡面用 01/07 16:21
12F:→ ericwan: 請用 disable_irq_nosync 01/07 17:15