首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NAPI中断禁用和处理共享中断行

NAPI中断禁用和处理共享中断行
EN

Stack Overflow用户
提问于 2016-07-27 08:10:28
回答 1查看 2.7K关注 0票数 3

我正在尝试理解linux内核中的NAPI实现。这些是我的基本怀疑。

1) NAPI禁用进一步中断,并使用轮询处理skb

  • 是谁禁用的?
  • 中断处理程序应该禁用它吗? 如果是,那么禁用中断和处理实际轮询的SOFTIRQ net_rx_action之间的时间间隔太大了。

2)默认情况下,所有支持NAPI的驱动程序在接收到单个帧时禁用中断,并使用下半部分轮询处理剩余帧?或者只有当帧> 32 (在irq处理程序中对所有帧进行连续渐变)切换到轮询模式时,才有逻辑?

3)现在来分享IRQ -

  • 发生在其他设备中断的情况下,其他设备下半部分可能无法运行,因为这些设备不在poll_list中。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-27 18:13:56

我为理解、优化和优化Linux网络堆栈编写了一个全面的指南,它解释了所有关于网络驱动程序、NAPI等方面的内容,所以请查看它。

至于你的问题:

  1. 设备IRQ应该被驱动程序的IRQ处理程序在NAPI启用后禁用。是的,有一个时间间隔,但应该是相当小的。这是您必须做出的权衡决策的一部分:您更关心吞吐量还是延迟?根据具体情况,您可以适当地优化网络堆栈。无论如何,大多数NIC允许用户增加(或减小)跟踪传入网络数据的环形缓冲区的大小。因此,暂停是可以的,因为数据包将被排队等待稍后处理。
  2. 这取决于驱动程序,但通常大多数驱动程序将在IRQ处理程序中启用NAPI轮询模式,只要启动(通常)调用napi_schedule即可。您可以找到一个演练,说明这里为Intel igb驱动程序启用了NAPI。注意到,IRQ处理程序不一定是针对每个数据包触发的。您可以通过使用一个名为中断合并的特性来调整IRQ处理程序在大多数卡片上的触发速率。一些净捐助国可能不支持这一选择。
  3. 其他设备的IRQ处理程序将在IRQ被触发时执行,因为IRQ处理程序在CPU上具有很高的优先级。NAPI轮询循环(运行在SoftIRQ中)将在设备IRQ被处理的任何CPU上运行。因此,如果您有多个NIC和多个CPU,则可以对每个NIC的IRQ亲和力进行调优,以防止某个特定的NIC饥饿。
  4. 至于您在评论中询问的例子:

假设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。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38607348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档