- 论坛徽章:
- 0
|
关于问题1
- #define IRQ_DISABLED 0x00000200
- #define IRQ_PENDING 0x00000400
- #define IRQ_MASKED 0x00008000
复制代码 为什么需要并上IRQ_DISABLED? 大虾能否说详细点,我看了很久确实不知道问什么。
关于问题2
重新看了一下free_irq, 我想应该这样解释。
当A cpu在执行 handle_IRQ_event(irq, action)时,是没有加任何锁得。这时 B cpu可以有机会正在释放该中断,free_irq将会按下面的代码顺序执行:
- raw_spin_lock_irqsave(&desc->lock, flags);
- 。。。。
- action_ptr = &desc->action;
- for (;;) {
- action = *action_ptr;
- if (!action) {
- WARN(1, "Trying to free already-free IRQ %d\n", irq);
- raw_spin_unlock_irqrestore(&desc->lock, flags);
- return NULL;
- }
- if (action->dev_id == dev_id)
- break;
- action_ptr = &action->next;
- }
- 。。。。。。。
- *action_ptr = action->next;
- 。。。。。。。
- raw_spin_unlock_irqrestore(&desc->lock, flags);
- 。。。。。。。。
- synchronize_irq(irq);
复制代码 当b释放锁后,一直处在无限循环中,等待a把最后一个中断执行完,然后清除IRQ_INPROGRESS.
当a获得锁后,发现action被注销,屏蔽掉该中断,跳出循环。清除IRQ_INPROGRESS.
无限循环中的b检测到IRQ_INPROGRESS标志清除,退出循环。
还有unlikely的意思,应该是告诉编译器对这段不常执行的代码进行分支优化吧。
ps:问题1,真的没想通,再请大虾详解!!! |
|