1

free_netdevを呼び出す前にnet_device構造のロックを解除する必要がありますか?私が遭遇したコードは次のことを行います。

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

これは物事を行うための正しい方法ですか?ありがとう。

4

1 に答える 1

3

rtnl をもう一度ロック解除してはいけません。

理由は次のとおりです。Network Drivers APIfree_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 を使用することを検討してください。

于 2012-11-05T11:30:29.907 に答える