1

在调用 free_netdev 之前是否需要解锁 net_device 结构?我遇到的代码执行以下操作:

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;
}

这是做事情的正确方法吗?谢谢。

4

1 回答 1

3

您不应再一次解锁锁定 rtnl。

原因如下:Network Drivers API中没有free_netdev关于需要锁的部分。然而,unregister_netdevice 需要持有锁并且它已经被包装在API中的unregister_netdev函数中,这在文档中有所说明。

无论如何,如果您查看一些流行的驱动程序的来源,例如 e1000e,您会看到:

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_netdev函数,因此它只会被锁定在unregister_netdevice自身内部,并且那里的所有数十个反初始化都将在锁定之外。因此,如果您认为自己负担得起,请考虑使用他们unregister_netdev netdev 内核开发人员)在对其源代码的评论中推荐的简单方法。

于 2012-11-05T11:30:29.907 回答