您不应再一次解锁锁定 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 内核开发人员)在对其源代码的评论中推荐的简单方法。