[問題] non-reentrant disable_irq

作者: davidwangs (茶米)   2018-01-01 11:44:35
最近在寫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);
}
謝謝
作者: galic (嘎利)   2018-01-01 20:06:00
我記得spin lock裡面只是最好不要sleep 因為很可能造成deadlock 所以會開那個config去檢查有沒有sleep而disable_irq內部的實作也會用到spin lock我的意思是你只要能確定不會造成deadlock 那就算sleep也沒關係 不然用atomic相關的操作去保護disable_irq_count還是建議disable和enable irq要成對出現
作者: davidwangs (茶米)   2018-01-01 22:12:00
因為老闆強烈要求,所以這個config檢查的東西一定要解我也是千百個不願意啊!還是謝謝大大解釋!在想是不是能用mutex來做?
作者: michael0728n (蒜˙遠古)   2018-01-07 16:16:00
不會成對是指不會用enable_irq?mutex系列應該可以吧,除非你這是irq裡面用
作者: ericwan (萬修)   2018-01-07 17:15:00
請用 disable_irq_nosync

Links booklink

Contact Us: admin [ a t ] ucptt.com