Vous ne devez pas déverrouiller-verrouiller rtnl encore une fois.
Voici pourquoi: il n'y a pas de mot dans Network Drivers API dans la section free_netdev
sur le verrou requis. Néanmoins, unregister_netdevice
doit être verrouillé et il a été enveloppé dans API dans la fonction unregister_netdev
, ce qui est indiqué dans le document.
Quoi qu'il en soit, si vous regardez dans certaines sources de conduire populaire, e1000e for example, vous verrez ceci:
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 }
Comme vous pouvez le voir, il n'y a pas de verrouillage déverrouillage prise.
En outre, ils utilisent unregister_netdev
fonction de sorte qu'il serait seulement verrouillé à l'intérieur de unregister_netdevice
lui-même, et toutes les douzaines de désinitialisations qu'il irait à l'extérieur du verrou. Par conséquent, pensez à utiliser unregister_netdev
simple comme ils (développeurs de noyau netdev) recommandent dans les commentaires à source, si vous pensez que vous pouvez vous permettre que.