3

我试图找出 Linux net_device_ops 是否由调用者序列化,或者实现这些操作的驱动程序必须处理序列化(或者它们可以同时调用)。

例如,对于相同的驱动程序实例,在驱动程序完成当前的 ndo_start_xmit 调用之前,是否可以再次调用 ndo_start_xmit(例如在不同的 CPU 上)?

我搜索了其他 net_device 驱动程序是如何执行此操作的,但看起来他们假设 ndo_start_xmit 序列化是由调用者完成的(如果我错了,请纠正我)。

但是我也搜索了调用者是否使用自旋锁或其他锁机制,但我找不到。如果存在这样的(调用者)锁定机制,请指出执行此操作的代码。

4

1 回答 1

1

在大多数情况下,应该由调用者负责序列化,并且net_device_ops通常实现为不知道锁。但是,您仍然可能会发现某些驱动程序出于内部目的在内部 进行了某种锁定- 例如,驱动程序可能需要在任一回调中访问其自己的全局数据/计数器。net_device_ops

ndo_start_xmit确实,这可能是一个非常有说服力的例子来观察锁定可能存在的位置。在这种情况下,实际上,上层调用者持有一个锁。您可能会发现查看内核函数中的相应位置会有所帮助。如您所见,锁是在调用函数dev_queue_xmit()之前获得的,该函数又调用函数。进一步跟踪很容易,即您可以观察到驱动程序提供的代码调用。dev_hard_start_xmit() xmit_one() netdev_start_xmit() ndo_start_xmit

此外,可能值得一读Linux Device Drivers, 3rd Edition书,即第17.5节中的第17.5.1 。我希望你觉得这对你有帮助。

于 2017-09-20T21:36:38.657 回答