Linux kernel free_netdev和锁定
在调用free_netdev之前是否需要解锁net_设备结构?我遇到的代码执行以下操作:Linux kernel free_netdev和锁定,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,在调用free_netdev之前是否需要解锁net_设备结构?我遇到的代码执行以下操作: static void delete_dev(struct net_device *dev) { ASSERT_RTNL(); ... unregister_netdevice(dev); ... rtnl_unlock(); free_netdev(dev); rtnl_lock(); } int foo() { struct net_device *de
static void delete_dev(struct net_device *dev)
{
ASSERT_RTNL();
...
unregister_netdevice(dev);
...
rtnl_unlock();
free_netdev(dev);
rtnl_lock();
}
int foo()
{
struct net_device *dev;
rtnl_lock();
...
delete_dev(dev);
rtnl_unlock();
return 0;
}
这样做对吗?谢谢。您不应该再次解锁锁rtnl 原因如下:
free\u netdev
一节中没有一个词是关于需要锁的。然而,unregister\u netdevice
需要持有锁,并且它已被包装在unregister\u netdev
函数中的API中,该函数在文档中有说明
无论如何,如果您查看一些流行的驱动程序来源,您将看到:
6432 static void __devexit e1000_remove(struct pci_dev *pdev)
6433 {
...
6459 unregister_netdev(netdev);
6460
6461 if (pci_dev_run_wake(pdev))
6462 pm_runtime_get_noresume(&pdev->dev);
6463
6464 /*
6465 * Release control of h/w to f/w. If f/w is AMT enabled, this
6466 * would have already happened in close and is redundant.
6467 */
6468 e1000e_release_hw_control(adapter);
6469
6470 e1000e_reset_interrupt_capability(adapter);
6471 kfree(adapter->tx_ring);
6472 kfree(adapter->rx_ring);
6473
6474 iounmap(adapter->hw.hw_addr);
6475 if (adapter->hw.flash_address)
6476 iounmap(adapter->hw.flash_address);
6477 pci_release_selected_regions(pdev,
6478 pci_select_bars(pdev, IORESOURCE_MEM));
6479
6480 free_netdev(netdev);
6481
6482 /* AER disable */
6483 pci_disable_pcie_error_reporting(pdev);
6484
6485 pci_disable_device(pdev);
6486 }
正如您所看到的,没有使用解锁锁
此外,他们使用unregister\u netdev
功能,这样它只会被锁定在unregister\u netdevice
自身内部,所有几十次去初始化都会被锁定。因此,考虑使用简单的<代码> unReavestyNETDEV>代码>(NETDEV内核开发人员)在评论中推荐它,如果你认为你负担得起。