运维开发网

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

运维开发网 https://www.qedev.com 2020-06-15 14:45 出处:网络
我正在尝试更改导致cpu的代码,并进入我不完全理解的东西: 从cpu_online_mask中删除核心后发生的事情之一是重置中断关联.这是在/arch/x86/kernel/irq.c中找到的fixup_irqs()函数中完成的.该函数重置中断关联,然后
我正在尝试更改导致cpu的代码,并进入我不完全理解的东西:

从cpu_online_mask中删除核心后发生的事情之一是重置中断关联.

这是在/arch/x86/kernel/irq.c中找到的fixup_irqs()函数中完成的.

该函数重置中断关联,然后调用mdelay(1)(它只等待1毫秒),最后转向处理可能“丢失”的中断.

我的问题是:为什么要调用mdelay(1)是必要的?没有它会发生什么?

我的猜测是,APIC重新路由需要时间才能生效……但我确信对此有更有说服力的解释.

谢谢!

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

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

>告诉APIC向其他CPU发送中断,而不是我.

>中断!

那么代码的作用基本上是:

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

0

精彩评论

暂无评论...
验证码 换一张
取 消