作者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/cn.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