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

Linux kernel 为什么在重置中断关联时调用mdelay(1)?,linux-kernel,interrupt,Linux Kernel,Interrupt,我正试图更改导致cpu性能下降的代码,但遇到了一些我不完全理解的问题: 从cpu联机掩码中移除内核后发生的事情之一是重置中断相关性。 这是在中的fixup_irqs()函数中完成的。 该函数重置中断相关性,然后调用mdelay(1)(只需等待1毫秒),最后处理可能“丢失”的中断 我的问题是:为什么需要调用mdelay(1)?没有它会发生什么? 我的猜测是APIC中的重新路由需要时间才能生效。。。但我相信有一个更令人信服的解释 谢谢 在螺母外壳中,fixup_irq()中有一个争用条件-函数首先检

我正试图更改导致cpu性能下降的代码,但遇到了一些我不完全理解的问题:

从cpu联机掩码中移除内核后发生的事情之一是重置中断相关性。 这是在中的fixup_irqs()函数中完成的。 该函数重置中断相关性,然后调用mdelay(1)(只需等待1毫秒),最后处理可能“丢失”的中断

我的问题是:为什么需要调用mdelay(1)?没有它会发生什么? 我的猜测是APIC中的重新路由需要时间才能生效。。。但我相信有一个更令人信服的解释


谢谢

在螺母外壳中,fixup_irq()中有一个争用条件-函数首先检查所有路由到离线CPU的irq,并告诉硬件将它们路由到其他地方

问题是,改变中断路由的过程不是原子的,也不是瞬时的。在PIC芯片上改变路由的事务可能与发送中断的事务竞争——这可能需要一些周期才能到达,因此您可能会以以下方式结束:

  • 告诉APIC将中断发送给其他CPU,而不是我
  • 打断 因此,代码的作用基本上是:

  • 告诉APIC将中断发送给其他CPU,而不是我
  • 请稍等。足够使中断重新路由保证完成。(如何知道等待的时间足够多?可能是APIC规范中记录的,也可能是一些英特尔VLSI工程师向他们的Linux员工透露的内部知识-我不知道:-)
  • 通过读取发送中断时锁定的APIC上的寄存器来检查是否发生中断,如果发现任何中断,则将其作为IPI发送到适当的目标
  • 现在我们知道,我们不会受到任何干扰

  • 如果你幸运的话,可以在2.6.12之后添加,如果你做了一个
    git责备
    并找到导致延迟的提交,提交消息中可能会有一个解释。@Shahbaz,是的,这里有一个可能的解释:5231a68614b9。@AndyShevchenko,如果你是说,那么我认为它不会给出解释。此提交仅删除围绕mdelay(1)的中断启用/禁用。也就是说,mdelay以前就在那里……的确——听起来很合理。但如果是这样的话——发送虚假中断如何提供这种方法的替代方案?正如代码中的注释所述:
    我们可以删除mdelay(),然后将虚假中断发送到以前由该cpu处理的所有IRQ的新cpu目标。
    但是-什么可以保证发送虚假中断所需的时间比APIC重新路由所需的时间更长?为什么我们不可能发送虚假的中断,APIC不会完成重新路由,而另一个中断将被发送到原始cpu,因此保持未处理…@NoamShalev,我不知道。要么是因为APIC是如何构建的,这是安全的,要么是因为一些深层次的内部原因,或者是我的猜测,这是错误的,但是编写代码的人没有考虑它,竞争条件窗口太小,他在测试中没有看到它,因为上游代码确实执行了mdelay(),他从未发现…:-)