- 论坛徽章:
- 0
|
原帖由 OstrichFly 于 2008-6-11 10:09 发表 ![]()
谢谢!
我理解了你说的“IPI在开中断以后才会被提交,即在spin_lock_irqrestore(&(irq_desc.lock), flags);之后”。
但严格来说,提交IPI应该是在spin_lock_irqrestore(&(irq_desc.lock), flags)内部,中断 ...
呵呵,看LZ用了好多“飞快的”这样的形容词,以前我也会对有些看似不大可能的问题用这种词假设。
其实不一定要“飞快的”,很多情况都可以使处理IPI的CPU“慢下来”,例如在关中断这个期间,一个比IPI优先级更高的中断发生了(当然,比IPI优先级更高的中断都是关不掉的),就会先去处理这个中断。实际上这个比IPI优先级更高的,又可以被屏蔽的中断也只有IPI本身了。linux一共使用了三种IPI:RESCHEDULE IPI、INVALIDATE_TLB_VECTOR IPI、CALL_FUNCTION IPI。其中CALL_FUNCTION IPI是种通用IPI,也就是一个CPU通知另一个CPU干个啥事儿(本版另一个帖子问CPU的通讯方式,这就是一种),resend_irq用的就是这种。例如在中断关闭期间,其它CPU发送了一个INVALIDATE_TLB_VECTOR IPI给该CPU,则开中断后会先执行它,resend_irq就被推后了,这时其它CPU有大把的时间来做disable/enable的工作。其次,即使执行resend_irq的IPI时,其它CPU也有机会做disable/enable的,处理并发情况不能假设谁执行的快或慢。
此外,目前的kernel已经倾向于使用过tasklet来做resend_irq了,那其它CPU就更有机会在该CPU执行resend_irq前做disable/enable的工作。
UP当然没有这个考虑,大部分复杂性都是SMP引入的 |
|