调用者是否将Linux内核的net_device_ops序列化

我试图找出Linux net_device_ops是否由调用者序列化,或者执行这些操作的驱动程序必须关心序列化(或者可以同时调用)。

例如,在驱动程序完成当前的ndo_start_xmit调用之前,可以为同一个驱动程序实例再次调用ndo_start_xmit(例如在不同的CPU上)?

我search了其他net_device驱动程序如何做这个,但它看起来像他们认为ndo_start_xmit序列化是由调用者完成(请纠正我,如果我错了)。

不过,我也search来电者是否使用和自旋锁或另一个锁机制,但我找不到一个。 如果存在这样的(主叫)locking机制,请将其指向执行此操作的代码。

    在大多数情况下,调用者应该注意序列化,而net_device_ops通常以不知道锁的方式实现。 不过,有些驱动程序为了内部目的可能还会 net_device_ops 内部找到某种类型的锁,例如,驱动程序需要在任一回调中访问自己的全局数据/计数器。

    确实, ndo_start_xmit可能是一个相当有说服力的例子,可以观察锁定可能驻留的位置。 在这种情况下,实际上,锁由上层呼叫者保持。 您可能会发现查看dev_queue_xmit()内核函数中的相应位置很有帮助。 正如你看到的那样,在那里调用dev_hard_start_xmit() 函数 ,然后调用xmit_one() 函数 。 很容易跟踪它,也就是说,您可能会观察到驱动程序提供的调用ndo_start_xmit netdev_start_xmit() 代码 。

    另外,可能还需要阅读Linux设备驱动程序第3版 ,即17.5 中的第17.5.1 节 。 我希望你觉得这对你有帮助。