[问题] 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