为什么在重置中断关联时会调用mdelay(1)?

时间:2015-01-20 16:23:58

标签: linux-kernel interrupt

我正在尝试更改导致cpu的代码,并进入我不完全理解的内容:

从cpu_online_mask中删除核心后发生的一件事是重置中断关联。 这是在/arch/x86/kernel/irq.c中的fixup_irqs()函数中完成的。 该函数重置中断关联,然后调用mdelay(1)(只等待1毫秒),最后转向处理可能“丢失”的中断。

我的问题是:为什么需要调用mdelay(1)?没有它会发生什么? 我的猜测是,APIC重新路由需要时间才能生效......但我确信对此有更有说服力的解释。

谢谢!

1 个答案:

答案 0 :(得分:1)

在一个坚果壳中,fixup_irq()中存在竞争条件 - 该函数首先遍历所有路由到离线CPU的IRQ,并告诉HW将它们路由到其他地方。

问题是,更改此中断路由的过程不是原子的或瞬时的。更改PIC芯片上的路由的事务可能会与发送中断的事务竞争 - 这可能需要一些周期才能到达,因此您可能会最终得到:

  1. 告诉APIC向其他CPU发送中断,而不是我。
  2. 中断<!/ LI>

    所以代码的作用基本上是:

    1. 告诉APIC向其他CPU发送中断而不是我。
    2. 等一下。这样就可以保证中断重新路由完成。 (如何知道有多少时间足以等待?也许它记录在APIC规范中,也许是英特尔VLSI工程师向他们的Linux人员透露的内部知识 - 我不知道: - )
    3. 通过读取发送中断时锁存的APIC上的寄存器来检查是否发生了中断,如果发现中断,请将其作为IPI发送到正确的目标。
    4. 现在我们知道没有中断会真正传达给我们。