加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-13 23:26:18 所属栏目:Linux 来源:网络整理
导读:我正在尝试更改导致cpu的代码,并进入我不完全理解的东西: 从cpu_online_mask中删除核心后发生的事情之一是重置中断关联. 这是在/arch/x86/kernel/irq.c中找到的fixup_irqs()函数中完成的. 该函数重置中断关联,然后调用mdelay(1)(它只等待1毫秒),最后转向处
我正在尝试更改导致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发送到正确的目标.>现在我们知道没有中断会真正传达给我们.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读