Linux kernel free_netdev和锁定

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

在调用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 *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内核开发人员)在评论中推荐它,如果你认为你负担得起。