]> Pileus Git - ~andy/linux/commitdiff
e1000e: Avoid kernel crash during shutdown
authorLi Zhang <zhlcindy@gmail.com>
Tue, 13 Aug 2013 18:42:58 +0000 (18:42 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Thu, 22 Aug 2013 09:33:20 +0000 (02:33 -0700)
While doing shutdown on the PCI device, the corresponding callback
function e1000e_shutdown() is trying to clear those correctable
errors on the upstream P2P bridge. Unfortunately, we don't have
the upstream P2P bridge under some cases (e.g. PCI-passthrou for
KVM on Power). That leads to kernel crash eventually.

The patch adds one more check on that to avoid kernel crash.

Signed-off-by: Li Zhang <zhlcindy@gmail.com>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/e1000e/netdev.c

index 59c0c54137979ad119ec2363cfd5d53f66ad5a31..e87e9b01f404446dfca553146fa4734c2af45f79 100644 (file)
@@ -5999,11 +5999,18 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool runtime)
         * correctable error when the MAC transitions from D0 to D3.  To
         * prevent this we need to mask off the correctable errors on the
         * downstream port of the pci-e switch.
+        *
+        * We don't have the associated upstream bridge while assigning
+        * the PCI device into guest. For example, the KVM on power is
+        * one of the cases.
         */
        if (adapter->flags & FLAG_IS_QUAD_PORT) {
                struct pci_dev *us_dev = pdev->bus->self;
                u16 devctl;
 
+               if (!us_dev)
+                       return 0;
+
                pcie_capability_read_word(us_dev, PCI_EXP_DEVCTL, &devctl);
                pcie_capability_write_word(us_dev, PCI_EXP_DEVCTL,
                                           (devctl & ~PCI_EXP_DEVCTL_CERE));