igb in linux-3.18.0: some potential bugs
Subsystems (3)
PATCH 1/1 igb in linux-3.18.0: some potential bugs
I have actually tested igb driver on the real hardware(Intel 82575EB PCI-E Gigabit Ethernet Controller), and find some potential bugs:
The target file is drivers/net/ethernet/intel/igb/igb_main.c
(1) In the normal process of igb, pci_enable_pcie_error_reporting and pci_disable_pcie_error_reporting is called in pairs in igb_probe and igb_remove. However, when pci_enable_pcie_error_reporting has been called and alloc_etherdev_mqs in igb_probe is failed, "err_alloc_etherdev" segment in igb_probe is executed immediately to exit, but pci_disable_pcie_error_reporting is not called.
(2) The same situation happens when pci_iomap in igb_probe is failed.
(3) The same situation happens when igb_sw_init in igb_probe is failed.
(4) The same situation happens when register_netdev in igb_probe is failed.
(5) The same situation happens when igb_init_i2c in igb_probe is failed.
(6) The function kcalloc is called by igb_sw_init when initializing the ethernet card driver, but kfree is not called when register_netdev in igb_probe is failed, which may cause memory leak.
(7) The same situation happens when igb_init_i2c in igb_probe is failed.
(8) The same situation happens when kzalloc in igb_alloc_q_vector is failed.
(9) The same situation happens when igb_alloc_q_vector in igb_alloc_q_vectors is failed.
(10) When igb_init_i2c in igb_probe is failed, igb_enable_sriov is called in igb_probe_vfs, but igb_disable_sriov is not called.
(11) The same situation with [10] happens when register_netdev in igb_probe is failed.
Meanwhile, I also write the patch to fix the bugs. I have run the patch on the hardware, it can work normally and fix the above bugs.
(quoted diff) +0 -0
b/drivers/net/ethernet/intel/igb/igb_main.c
index 487cd9c..cd9364a 100644
drivers/net/ethernet/intel/igb/igb_main.c +0 -0
@@ -179,6 +179,7 @@ static void igb_check_vf_rate_limit(struct igb_adapter
*);
#ifdef CONFIG_PCI_IOV
static int igb_vf_configure(struct igb_adapter *adapter, int vf); static int igb_pci_enable_sriov(struct pci_dev *dev, int num_vfs);
+static int igb_disable_sriov(struct pci_dev *pdev);
#endif
#ifdef CONFIG_PM
@@ -2653,17 +2654,22 @@ err_register:
igb_release_hw_control(adapter); memset(&adapter->i2c_adap, 0, sizeof(adapter->i2c_adap));
err_eeprom:
+#ifdef CONFIG_PCI_IOV
+ igb_disable_sriov(pdev);
+#endif
if (!igb_check_reset_block(hw))
igb_reset_phy(hw);
if (hw->flash_address)
iounmap(hw->flash_address);
err_sw_init:
+ kfree(adapter->shadow_vfta);
igb_clear_interrupt_scheme(adapter);
pci_iounmap(pdev, hw->hw_addr);
err_ioremap:
free_netdev(netdev);
err_alloc_etherdev:
+ pci_disable_pcie_error_reporting(pdev);
pci_release_selected_regions(pdev,
pci_select_bars(pdev, IORESOURCE_MEM));
err_pci_reg:
Thanks!
Quoted 39 lines · Jia-Ju Bai
I have actually tested igb driver on the real hardware(Intel 82575EB PCI-E
Gigabit Ethernet Controller), and find some potential bugs:
The target file isdrivers/net/ethernet/intel/igb/igb_main.c(1) In the normal process of igb,
pci_enable_pcie_error_reportingandpci_disable_pcie_error_reportingis called in pairs inigb_probeandigb_remove. However, whenpci_enable_pcie_error_reportinghas been called
andalloc_etherdev_mqsinigb_probeis failed, "err_alloc_etherdev" segment
inigb_probeis executed immediately to exit, butpci_disable_pcie_error_reportingis not called.
(2) The same situation happens whenpci_iomapinigb_probeis failed.
(3) The same situation happens whenigb_sw_initinigb_probeis failed.
(4) The same situation happens whenregister_netdevinigb_probeis failed.
(5) The same situation happens whenigb_init_i2cinigb_probeis failed.(6) The function kcalloc is called by
igb_sw_initwhen initializing the
ethernet card driver, but kfree is not called whenregister_netdevinigb_probeis failed, which may cause memory leak.
(7) The same situation happens whenigb_init_i2cinigb_probeis failed.
(8) The same situation happens when kzalloc inigb_alloc_q_vectoris failed.
(9) The same situation happens whenigb_alloc_q_vectorinigb_alloc_q_vectorsis failed.(10) When
igb_init_i2cinigb_probeis failed,igb_enable_sriovis called inigb_probe_vfs, butigb_disable_sriovis not called.
(11) The same situation with [10] happens whenregister_netdevinigb_probe
is failed.
Quoted 3 lines
Meanwhile, I also write the patch to fix the bugs. I have run the patch on
the hardware, it can work normally and fix the above bugs.
Was this a bug you actually saw? Or a theoretical bug based on code review?
I do not mind adding this to my queue so that we can review and test the patch, although this will cause a fair amount of regression testing.
Thank for the reply!
For the first reply:
I let some functions fail on purpose to test error handling code, and then run the driver in reality as well as monitor the function calls in runtime. The results are in my report.
For the second reply:
I admit you are right, and my code style need to be improved.
Quoted 30 lines · Jia-Ju Bai
I have actually tested igb driver on the real hardware(Intel 82575EB PCI-E Gigabit Ethernet Controller), and find some potential bugs:
The target file isdrivers/net/ethernet/intel/igb/igb_main.c(1) In the normal process of igb,
pci_enable_pcie_error_reportingandpci_disable_pcie_error_reportingis called in pairs inigb_probeandigb_remove. However, whenpci_enable_pcie_error_reportinghas been called andalloc_etherdev_mqsinigb_probeis failed, "err_alloc_etherdev"
segment
inigb_probeis executed immediately to exit, butpci_disable_pcie_error_reportingis not called.
(2) The same situation happens whenpci_iomapinigb_probeis failed.
(3) The same situation happens whenigb_sw_initinigb_probeis failed.
(4) The same situation happens whenregister_netdevinigb_probeis failed.
(5) The same situation happens whenigb_init_i2cinigb_probeis failed.(6) The function kcalloc is called by
igb_sw_initwhen initializing the ethernet card driver, but kfree is not called whenregister_netdevinigb_probeis failed, which may cause memory leak.
(7) The same situation happens whenigb_init_i2cinigb_probeis failed.
(8) The same situation happens when kzalloc inigb_alloc_q_vectoris failed.
(9) The same situation happens whenigb_alloc_q_vectorinigb_alloc_q_vectorsis failed.
Quoted 7 lines
(10) When
igb_init_i2cinigb_probeis failed,igb_enable_sriovis called inigb_probe_vfs, butigb_disable_sriovis not called.
(11) The same situation with [10] happens whenregister_netdevinigb_probeis failed.Meanwhile, I also write the patch to fix the bugs. I have run the patch on the hardware, it can work normally and fix the above bugs.
Was this a bug you actually saw? Or a theoretical bug based on code review?
I do not mind adding this to my queue so that we can review and test the patch, although this will cause a fair amount of regression testing. 【来自网易邮箱的超大附件】
邮件带有附件预览链接,若您转发或回复此邮件时不希望对方预览附件,建议您手动删除链接。
signature.asc
下载: http://u.163.com/t/HnVMNHn21
------------------------------------------------------------------------------
Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
from Actuate! Instantly Supercharge Your Business Reports and Dashboards
with Interactivity, Sharing, Native Excel Exports, App Integration & more
Get technology previously reserved for billion-dollar corporations, FREE
http://pubads.g.doubleclick.net/gampad/clk?id=164703151&iu=/4140/ostg.clktrk
_______________________________________________
E1000-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/e1000-devel
To learn more about Intel® Ethernet, visit http://communities.intel.com/community/wired