我正在尝试理解linux内核中的NAPI实现。这些是我的基本怀疑。
1) NAPI禁用进一步中断,并使用轮询处理skb
2)默认情况下,所有支持NAPI的驱动程序在接收到单个帧时禁用中断,并使用下半部分轮询处理剩余帧?或者只有当帧> 32 (在irq处理程序中对所有帧进行连续渐变)切换到轮询模式时,才有逻辑?
3)现在来分享IRQ -
发布于 2016-07-27 18:13:56
我为理解、优化和优化Linux网络堆栈编写了一个全面的指南,它解释了所有关于网络驱动程序、NAPI等方面的内容,所以请查看它。
至于你的问题:
napi_schedule即可。您可以找到一个演练,说明这里为Intel igb驱动程序启用了NAPI。注意到,IRQ处理程序不一定是针对每个数据包触发的。您可以通过使用一个名为中断合并的特性来调整IRQ处理程序在大多数卡片上的触发速率。一些净捐助国可能不支持这一选择。假设NIC 1和NIC 2共享IRQ线,假设NIC 1是低负载,NIC 2高负载和NIC 1接收中断,NIC 1的驱动程序将禁用中断直到它的软IRQ被处理,说时间间隔作为t1。所以对于时间来说,t1 NIC 2中断是太禁用了,对吗?
这取决于驱动程序,但在正常情况下,NIC 1只在执行IRQ处理程序时禁用中断。对napi_schedule的调用告诉softirq代码,如果它还没有启动,它应该开始运行。softirq代码异步运行,因此NIC 1不会等待软be被处理。
现在,就共享IRQ而言:这同样取决于设备和驱动程序。驱动程序应该以能够处理共享IRQ的方式编写。如果驱动程序禁用正在共享的IRQ,则共享该IRQ的所有设备都不会收到中断。这会很糟糕的。某些设备解决这一问题的一种方法是允许驱动程序对特定寄存器进行读写,从而导致该特定设备停止产生中断。这是一个首选的解决方案,因为它不会阻止生成相同IRQ的其他设备。
当NAPI禁用IRQ时,意味着驱动程序要求NIC硬件停止发送IRQ。因此,同一行上的其他IRQ(对于其他设备)仍将继续被处理。下面是一个例子,说明Intel igb驱动程序如何通过写入寄存器来关闭设备的IRQ。
https://stackoverflow.com/questions/38607348
复制相似问题