谁能解释在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_xmit
?poll
如上所述,如果这些回调访问相同的数据,是否需要用锁或其他东西保护数据?
对内核代码和/或文档的引用表示赞赏。
编辑:
register_netdev()
为了检查第一种情况,我进行了一个实验,并在调用e1000 驱动程序(内核:3.11-rc1)之前添加了 1 分钟的延迟。我还在其中添加了调试打印.probe
和.ndo_open
回调。然后我加载了 e1000.ko,并尝试在延迟结束之前访问它所服务的网络设备(事实上,NetworkManager 在我之前就这样做了),然后检查了系统日志。
结果:是的,即使“比赛窗口”通常很小,也有可能.ndo_open
在结束之前被调用。.probe
第二种情况(.ndo_start_xmit
VS NAPI poll
)对我来说仍然不清楚,感谢任何帮助。