[問題] non-reentrant disable_irq

看板LinuxDev作者 (茶米)時間7年前 (2018/01/01 11:44), 編輯推噓1(1011)
留言12則, 4人參與, 7年前最新討論串1/1
最近在寫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

01/01 20:06, 7年前 , 1F
我記得spin lock裡面只是最好不要sleep 因為很可能造成
01/01 20:06, 1F

01/01 20:06, 7年前 , 2F
deadlock 所以會開那個config去檢查有沒有sleep
01/01 20:06, 2F

01/01 20:07, 7年前 , 3F
而disable_irq內部的實作也會用到spin lock
01/01 20:07, 3F

01/01 20:07, 7年前 , 4F
我的意思是你只要能確定不會造成deadlock 那就算sleep也沒
01/01 20:07, 4F

01/01 20:08, 7年前 , 5F
關係 不然用atomic相關的操作去保護disable_irq_count
01/01 20:08, 5F

01/01 20:09, 7年前 , 6F
還是建議disable和enable irq要成對出現
01/01 20:09, 6F

01/01 22:12, 7年前 , 7F
因為老闆強烈要求,所以這個config檢查的東西一定要解
01/01 22:12, 7F

01/01 22:13, 7年前 , 8F
我也是千百個不願意啊!還是謝謝大大解釋!
01/01 22:13, 8F

01/01 22:13, 7年前 , 9F
在想是不是能用mutex來做?
01/01 22:13, 9F

01/07 16:16, 7年前 , 10F
不會成對是指不會用enable_irq?
01/07 16:16, 10F

01/07 16:21, 7年前 , 11F
mutex系列應該可以吧,除非你這是irq裡面用
01/07 16:21, 11F

01/07 17:15, 7年前 , 12F
請用 disable_irq_nosync
01/07 17:15, 12F
文章代碼(AID): #1QIQwdCw (LinuxDev)
文章代碼(AID): #1QIQwdCw (LinuxDev)