5

谁能解释在Linux网络驱动程序中的以下两种情况下是否需要额外的同步,例如锁定?我对内核 2.6.32 和更新版本感兴趣。

1. .probe VS .ndo_open

在 PCI 网卡的驱动程序中,net_device实例通常在.probe()回调中注册。假设驱动程序在 中指定.ndo_open回调net_device_ops,执行其他必要的操作,然后调用register_netdev()

.ndo_open内核是否可以在回调register_netdev()结束之后但之前调用该.probe回调?我想它是,但可能是,有一个更强有力的保证,确保设备可以在.probe结束之前打开?

换句话说,如果.probe回调访问,例如,net_device 结构的私有部分,register_netdev()并且ndo_open回调也访问该部分,我是否需要使用锁或其他方式来同步这些访问?

2. .ndo_start_xmit VS NAPI 轮询

是否有任何保证,对于给定的网络设备,驱动程序提供的.ndo_start_xmit回调和 NAPIpoll回调永远不会同时执行?

我知道它.ndo_start_xmit至少在禁用 BH 的情况下执行,并poll在 softirq 中运行,因此在 BH 上下文中运行。但这只会在本地 CPU 上序列化这些回调的执行。同一网络设备是否可以在不同的 CPU 上同时执行.ndo_start_xmitpoll

如上所述,如果这些回调访问相同的数据,是否需要用锁或其他东西保护数据?

对内核代码和/或文档的引用表示赞赏。

编辑:

register_netdev()为了检查第一种情况,我进行了一个实验,并在调用e1000 驱动程序(内核:3.11-rc1)之前添加了 1 分钟的延迟。我还在其中添加了调试打印.probe.ndo_open回调。然后我加载了 e1000.ko,并尝试在延迟结束之前访问它所服务的网络设备(事实上,NetworkManager 在我之前就这样做了),然后检查了系统日志。

结果:是的,即使“比赛窗口”通常很小,也有可能.ndo_open在结束之前被调用。.probe

第二种情况(.ndo_start_xmitVS NAPI poll)对我来说仍然不清楚,感谢任何帮助。

4

1 回答 1

4

写“.ndo_start_xmit VS NAPI poll”qs,这就是我的想法:在 NET_TX_SOFTIRQ 上下文中调用网络驱动程序的 start-xmit 方法 - 它本身在 softirq ctx 中。NAPI 接收轮询方法也是如此,但当然是在 NET_RX_SOFTIRQ 上下文中。

现在这两个软中断将在任何本地核心上相互锁定 - 而不是竞争。但是按照设计意图,softirq 肯定可以在 SMP 上并行运行;因此,谁能说这两种方法,“.ndo_start_xmit VS NAPI poll”,在两个单独的软中断上下文中运行,永远不会竞争?IOW,我想它可能会发生。安全起见,使用自旋锁来保护全局数据。

此外,随着现代 TCP 卸载技术变得越来越流行,GSO 也/可以在任何时候调用。!

于 2013-08-01T10:58:36.767 回答