我正在尝试更改导致cpu的代码,并进入我不完全理解的内容:
从cpu_online_mask中删除核心后发生的一件事是重置中断关联。 这是在/arch/x86/kernel/irq.c中的fixup_irqs()函数中完成的。 该函数重置中断关联,然后调用mdelay(1)(只等待1毫秒),最后转向处理可能“丢失”的中断。
我的问题是:为什么需要调用mdelay(1)?没有它会发生什么? 我的猜测是,APIC重新路由需要时间才能生效......但我确信对此有更有说服力的解释。
谢谢!
答案 0 :(得分:1)
在一个坚果壳中,fixup_irq()中存在竞争条件 - 该函数首先遍历所有路由到离线CPU的IRQ,并告诉HW将它们路由到其他地方。
问题是,更改此中断路由的过程不是原子的或瞬时的。更改PIC芯片上的路由的事务可能会与发送中断的事务竞争 - 这可能需要一些周期才能到达,因此您可能会最终得到:
所以代码的作用基本上是: