rtnl をもう一度ロック解除してはいけません。
理由は次のとおりです。Network Drivers APIのfree_netdev
セクションに、ロックが必要であるという言葉がありません。それにもかかわらず、unregister_netdevice
ロックを保持する必要がありunregister_netdev
、ドキュメントに記載されているように関数内の API にラップされています。
とにかく、いくつかの一般的なドライバーのソース、たとえば 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
、そこにある数十の初期化解除がすべてロックの外に出ます。したがって、余裕があると思われる場合は、そのsourceunregister_netdev
へのコメントで彼ら (netdev カーネル開発者) が推奨するように simple を使用することを検討してください。