gpt4 book ai didi

networking - Linux网络驱动程序中的并发: probe() VS ndo_open(), ndo_start_xmit() VS NAPI poll()

转载 作者:行者123 更新时间:2023-12-03 04:47:18 30 4
gpt4 key购买 nike

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

1。 .probe VS .ndo_open

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

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

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

2。 .ndo_start_xmit VS NAPI 民意调查

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

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

如上所述,如果这些回调访问相同的数据,是否需要用锁什么的来保护数据?

感谢对内核代码和/或文档的引用。

编辑:

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

结果:是的,.ndo_open甚至可以在.probe结束之前被调用,尽管“竞赛窗口”通常相当小。

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

最佳答案

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

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

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

关于networking - Linux网络驱动程序中的并发: probe() VS ndo_open(), ndo_start_xmit() VS NAPI poll(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17899396/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com