2012-11-01 55 views
1

是否需要在調用free_netdev之前解鎖net_device結構?我遇到的代碼有以下幾種:free_netdev和鎖定

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

這是正確的做事方式嗎?謝謝。

回答

3

你不應該再解鎖一次rtnl。

這是爲什麼:在Network Drivers APIfree_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,,如果您認爲您可以負擔得起