Chinaunix

标题: IRQD_IRQ_MAKSED 和 IRQD_IRQ_DISABLED 的区别 [打印本页]

作者: zhangku0    时间: 2018-05-20 08:14
标题: IRQD_IRQ_MAKSED 和 IRQD_IRQ_DISABLED 的区别
本帖最后由 zhangku0 于 2018-05-20 08:21 编辑
  1. void handle_level_irq(unsigned int irq, struct irq_desc *desc)
  2. {
  3.     raw_spin_lock(&desc->lock);
  4.     mask_ack_irq(desc);

  5.     if (unlikely(irqd_irq_inprogress(&desc->irq_data)))
  6.     if (!irq_check_poll(desc))
  7.     goto out_unlock;

  8.     desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING);
  9.     kstat_incr_irqs_this_cpu(irq, desc);

  10.         /*
  11.          * If its disabled or no action available
  12.          * keep it masked and get out of here
  13.          */
  14.     if (unlikely(!desc->action || irqd_irq_disabled(&desc->irq_data)))
  15.         goto out_unlock;

  16.     handle_irq_event(desc);

  17.     if (!irqd_irq_disabled(&desc->irq_data) && !(desc->istate & IRQS_ONESHOT))
  18.         unmask_irq(desc);
  19.     out_unlock:
  20.     raw_spin_unlock(&desc->lock);
  21. }
复制代码
这个函数里有这样的逻辑:

获取自旋锁
屏蔽中断线(包括应答)
查看是否禁用中断线(如果禁用直接解锁退出)
恢复屏蔽的中断线
释放自旋锁

有三个问题:
1. 根据上边的逻辑屏蔽中断线与禁止中断线是两回事吧 他们有什么区别呢(屏蔽中断线作用于中断控制器 关中断作用于cpu的IF标记 禁用中断线要怎么理解)
2. 可能的中断线被禁用的时间点 (上边的执行逻辑作用于自旋锁上 理论上此时不应该有其他cpu禁用中断线 在中断被触发时 应该也不会禁用中断线 那禁用中断线就是在这两个时间点之间?)
3. 既然可以屏蔽中短线 为什么还要禁用中断线(在中断的处理逻辑中 我只看到了判断是否禁用 没有看到禁用或者启用的动作)











欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2