我试图找出Linux net_device_ops是否由调用者序列化,或者实现这些操作的驱动程序是否必须处理序列化(或者它们可以同时调用)。
例如,对于相同的驱动程序实例,在驱动程序完成当前的ndo_start_xmit调用之前,ndo_start_xmit再次被调用(例如在不同的CPU上)?
我搜索了其他net_device驱动程序是如何做到的,但看起来他们认为ndo_start_xmit序列化是由调用者完成的(如果我错了请纠正我)。
但是我也搜索了调用者是否使用了spinlock或其他锁定机制,但我找不到一个。如果存在这样的(调用者)锁定机制,请指向执行此操作的代码。
答案 0 :(得分:0)
在大多数情况下,调用者应该负责序列化,net_device_ops
通常实现为不知道锁定。但是,可能您仍然可能会在某些驱动程序中为内部目的找到 ndo_start_xmit
内部某种锁定 - 例如,驱动程序需要在任一回调中访问其自己的全局数据/计数器。
dev_queue_xmit()
可能是一个非常雄辩的例子,可以观察锁定可能存在的位置。实际上,在这种情况下,上层呼叫者保持锁定。您可能会发现查看dev_hard_start_xmit()
内核函数中的corresponding place会很有帮助。如您所见,锁定是在之前调用xmit_one()
function,然后调用netdev_start_xmit()
function。它可以很容易地进一步跟踪,也就是说,您可能会看到ndo_start_xmit
code调用驱动程序提供的array
。
此外,可能值得阅读 Linux设备驱动程序,第3版书籍,即section 17.5中的 17.5.1 段落即可。我希望你觉得它很有帮助。