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 编辑
void handle_level_irq(unsigned int irq, struct irq_desc *desc)
{
raw_spin_lock(&desc->lock);
mask_ack_irq(desc);
if (unlikely(irqd_irq_inprogress(&desc->irq_data)))
if (!irq_check_poll(desc))
goto out_unlock;
desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING);
kstat_incr_irqs_this_cpu(irq, desc);
/*
* If its disabled or no action available
* keep it masked and get out of here
*/
if (unlikely(!desc->action || irqd_irq_disabled(&desc->irq_data)))
goto out_unlock;
handle_irq_event(desc);
if (!irqd_irq_disabled(&desc->irq_data) && !(desc->istate & IRQS_ONESHOT))
unmask_irq(desc);
out_unlock:
raw_spin_unlock(&desc->lock);
}
复制代码
这个函数里有这样的逻辑:
获取自旋锁
屏蔽中断线(包括应答)
查看是否禁用中断线(如果禁用直接解锁退出)
恢复屏蔽的中断线
释放自旋锁
有三个问题:
1. 根据上边的逻辑屏蔽中断线与禁止中断线是两回事吧 他们有什么区别呢(屏蔽中断线作用于中断控制器 关中断作用于cpu的IF标记 禁用中断线要怎么理解)
2. 可能的中断线被禁用的时间点 (上边的执行逻辑作用于自旋锁上 理论上此时不应该有其他cpu禁用中断线 在中断被触发时 应该也不会禁用中断线 那禁用中断线就是在这两个时间点之间?)
3. 既然可以屏蔽中短线 为什么还要禁用中断线(在中断的处理逻辑中 我只看到了判断是否禁用 没有看到禁用或者启用的动作)
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2