war*_*ker 6 linux networking linux-kernel
在linux中,当网卡收到一个数据包时,会触发一个硬中断,然后在中断回调函数中,它会引发一个NET_RX_SOFTIRQ,这个softirq会和hard irq在同一个cpu上运行吗?
小智 8
中断请求 (IRQ) 是在硬件级别发送的服务请求。中断可以通过专用硬件线路发送,也可以通过硬件总线作为信息包(消息信号中断,或 MSI)发送。启用中断后,收到 IRQ 会提示切换到中断上下文。内核中断调度代码检索 IRQ 编号及其关联的已注册中断服务程序 (ISR) 列表,并依次调用每个 ISR。ISR 确认中断并忽略来自同一 IRQ 的冗余中断,然后将延迟处理程序排队以完成中断处理并阻止 ISR 忽略未来的中断。
IRQ 有一个关联的“affinity”属性,smp_affinity,它定义了允许为该 IRQ 执行 ISR 的 CPU 内核。此属性可用于通过将中断关联和应用程序的线程关联分配给一个或多个特定 CPU 内核来提高应用程序性能。这允许在指定的中断和应用程序线程之间共享缓存线。
# cat /proc/irq/32/smp_affinity
f
Run Code Online (Sandbox Code Playgroud)
smp_affinity 的默认值是 f,这意味着可以在系统中的任何 CPU 上为 IRQ 提供服务。将此值设置为 1,如下所示,意味着只有 CPU 0 可以服务此中断:
# echo 1 >/proc/irq/32/smp_affinity
# cat /proc/irq/32/smp_affinity
1
Run Code Online (Sandbox Code Playgroud)
在支持中断控制的系统上,修改 IRQ 的 smp_affinity 会设置硬件,以便在硬件级别做出使用特定 CPU 服务中断的决定,而无需内核干预。
Redhat 的 DOC 中提供了更多详细信息 - 4.3 中断和 IRQ 调整