2012-11-01 9 views
1

est-il nécessaire de débloquer la structure net_device avant d'appeler free_netdev? Le code que j'ai rencontré est le suivant:free_netdev et le verrouillage

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

Est-ce la bonne façon de faire les choses? Merci.

Répondre

3

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.

Questions connexes