看板 LinuxDev 關於我們 聯絡資訊
最近在寫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://www.ptt.cc/bbs/LinuxDev/M.1514778279.A.33A.html
galic: 我記得spin lock裡面只是最好不要sleep 因為很可能造成 01/01 20:06
galic: deadlock 所以會開那個config去檢查有沒有sleep 01/01 20:06
galic: 而disable_irq內部的實作也會用到spin lock 01/01 20:07
galic: 我的意思是你只要能確定不會造成deadlock 那就算sleep也沒 01/01 20:07
galic: 關係 不然用atomic相關的操作去保護disable_irq_count 01/01 20:08
galic: 還是建議disable和enable irq要成對出現 01/01 20:09
davidwangs: 因為老闆強烈要求,所以這個config檢查的東西一定要解 01/01 22:12
davidwangs: 我也是千百個不願意啊!還是謝謝大大解釋! 01/01 22:13
davidwangs: 在想是不是能用mutex來做? 01/01 22:13
michael0728n: 不會成對是指不會用enable_irq? 01/07 16:16
michael0728n: mutex系列應該可以吧,除非你這是irq裡面用 01/07 16:21
ericwan: 請用 disable_irq_nosync 01/07 17:15