同步访问 net_device 结构的最佳原因是什么?

What is the best why to synchronize access to net_device structures?

我正在使用 linux 内核版本 2.6。 我想同步访问 单个 net_device 结构。 在内核代码中寻找答案时,我遇到了与此问题相关的两种同步机制:

  1. dev_base_lock锁.

  2. rtnl_lock()函数。

我的问题是:

  1. 两者有什么区别?

  2. 使用上述方法有什么经验法则吗?

  3. 我应该使用其中哪一个来同步访问单个 net_device 结构?

谢谢!

可以参考<<了解linux网络内部>>

中的“8.15.锁定”一章

dev_base 列表和两个哈希表 dev_name_headdev_name_indexdev_base_lock 保护。但是,该锁仅用于序列化对列表和表的访问,而不用于序列化对 net_device 数据结构内容的更改。 net_device 内容更改由路由网络link 信号量 (rtnl_sem) 处理,信号量分别通过 rtnl_lockrtnl_unlock 获取和释放。[ *] 此信号量用于序列化对 net_device 个实例的更改,来自:

  • 运行时事件

    例如,当link状态改变时(例如,网线被插入或拔出),内核 需要通过修改dev->flags来改变设备状态。

  • 配置更改

    当用户使用来自 net-tools 包的 ifconfig 和 route 或来自 IPROUTE2 包的 ip 等命令应用配置更改时,内核会通过 ioctl 命令和 Netlink 套接字得到通知,分别。通过这些接口调用的例程必须使用锁。

[*] 也可以使用其他例程来获取和释放信号量。有关详细信息,请参阅 include/linux/rtnetlink.h。