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

时间:2015-08-13 07:48:29

标签: linux-kernel network-programming linux-device-driver

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

  1. dev_base_lock 锁定。

  2. rtnl_lock()函数。

  3. 我的问题是:

    1. 两者有什么区别?

    2. 是否有使用上述其中一项的拇指规则?

    3. 我应该使用哪一个来同步对单个net_device的访问 结构
    4. 谢谢!

1 个答案:

答案 0 :(得分:2)

您可以参考<< 中的“8.15。锁定”一章。了解linux网络内部>>

dev_base列表和两个哈希表dev_name_headdev_name_indexdev_base_lock保护。但是,该锁只用于序列化对列表和表的访问,而不是序列化对net_device数据结构内容的更改。 net_device内容更改由Routing Netlink信号量(rtnl_sem)处理,该信号量分别与rtnl_lockrtnl_unlock一起获取和释放。[*]此信号量用于序列化对net_device实例的更改:

  • 运行时事件

    例如,当链接状态改变时(例如,插入或拔出网络电缆),内核 需要通过修改dev->标志来更改设备状态。

  • 配置更改

    当用户使用netconfig工具包中的ifconfig和route等命令或IPROUTE2包中的ip应用配置更改时,内核将分别通过ioctl命令和Netlink套接字通知。通过这些接口调用的例程必须使用锁。

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