你不應該再解鎖一次rtnl。
這是爲什麼:在Network Drivers API的free_netdev
部分中沒有關於所需鎖的部分。儘管如此,unregister_netdevice
需要鎖定,並且它已被包裝在文檔中陳述的unregister_netdev
函數的API中。
無論如何,如果你看看一些流行的駕駛人士,e1000e for example,你會看到:
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內核開發人員)在其評論中推薦source,,如果您認爲您可以負擔得起。