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