]> xenbits.xensource.com Git - legacy/linux-2.6.18-xen.git/commitdiff
pci: fix pcie-aer recovery mechanism defects.
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 8 Jun 2009 11:23:24 +0000 (12:23 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 8 Jun 2009 11:23:24 +0000 (12:23 +0100)
When aer error happening, if the device is not hided or assigned,
exit. If the device is assigned yet not connected by PV guest or is
owned by HVM guest, kill the guest. [sh_info is NULL]

Signed-Off-By: Liping Ke <liping.ke@intel.com>
Signed-Off-By: Yunhong Jiang <yunhong.jiang@intel.com>
drivers/xen/pciback/pci_stub.c

index 6345b3968aa43ac43f71f7a9b9ccddc7f1677f32..c481a73fe6091fc0379e100a13e09dd258977c13 100644 (file)
@@ -629,12 +629,22 @@ static pci_ers_result_t pciback_slot_reset(struct pci_dev *dev)
                                dev->bus->number,
                                PCI_SLOT(dev->devfn),
                                PCI_FUNC(dev->devfn));
-       if ( !psdev || !psdev->pdev || !psdev->pdev->sh_info )
+
+       if ( !psdev || !psdev->pdev )
        {
                dev_err(&dev->dev, 
-                       "pciback device is not found/in use/connected!\n");
+                       "pciback device is not found/assigned\n");
                goto end;
        }
+
+       if ( !psdev->pdev->sh_info )
+       {
+               dev_err(&dev->dev, "pciback device is not connected or owned"
+                       " by HVM, kill it\n");
+               kill_domain_by_device(psdev);
+               goto release;
+       }
+
        if ( !test_bit(_XEN_PCIB_AERHANDLER, 
                (unsigned long *)&psdev->pdev->sh_info->flags) ) {
                dev_err(&dev->dev, 
@@ -679,12 +689,22 @@ static pci_ers_result_t pciback_mmio_enabled(struct pci_dev *dev)
                                dev->bus->number,
                                PCI_SLOT(dev->devfn),
                                PCI_FUNC(dev->devfn));
-       if ( !psdev || !psdev->pdev || !psdev->pdev->sh_info)
+
+       if ( !psdev || !psdev->pdev )
        {
                dev_err(&dev->dev, 
-                       "pciback device is not found/in use/connected!\n");
+                       "pciback device is not found/assigned\n");
                goto end;
        }
+
+       if ( !psdev->pdev->sh_info )
+       {
+               dev_err(&dev->dev, "pciback device is not connected or owned"
+                       " by HVM, kill it\n");
+               kill_domain_by_device(psdev);
+               goto release;
+       }
+
        if ( !test_bit(_XEN_PCIB_AERHANDLER, 
                (unsigned long *)&psdev->pdev->sh_info->flags) ) {
                dev_err(&dev->dev, 
@@ -729,12 +749,22 @@ static pci_ers_result_t pciback_error_detected(struct pci_dev *dev,
                                dev->bus->number,
                                PCI_SLOT(dev->devfn),
                                PCI_FUNC(dev->devfn));
-       if ( !psdev || !psdev->pdev || !psdev->pdev->sh_info)
+
+       if ( !psdev || !psdev->pdev )
        {
                dev_err(&dev->dev, 
-                       "pciback device is not found/in use/connected!\n");
+                       "pciback device is not found/assigned\n");
                goto end;
        }
+
+       if ( !psdev->pdev->sh_info )
+       {
+               dev_err(&dev->dev, "pciback device is not connected or owned"
+                       " by HVM, kill it\n");
+               kill_domain_by_device(psdev);
+               goto release;
+       }
+
        /*Guest owns the device yet no aer handler regiested, kill guest*/
        if ( !test_bit(_XEN_PCIB_AERHANDLER, 
                (unsigned long *)&psdev->pdev->sh_info->flags) ) {
@@ -775,13 +805,22 @@ static void pciback_error_resume(struct pci_dev *dev)
                                dev->bus->number,
                                PCI_SLOT(dev->devfn),
                                PCI_FUNC(dev->devfn));
-       if ( !psdev || !psdev->pdev || !psdev->pdev->sh_info)
+
+       if ( !psdev || !psdev->pdev )
        {
                dev_err(&dev->dev, 
-                       "pciback device is not found/in use/connected!\n");
+                       "pciback device is not found/assigned\n");
                goto end;
        }
 
+       if ( !psdev->pdev->sh_info )
+       {
+               dev_err(&dev->dev, "pciback device is not connected or owned"
+                       " by HVM, kill it\n");
+               kill_domain_by_device(psdev);
+               goto release;
+       }
+
        if ( !test_bit(_XEN_PCIB_AERHANDLER, 
                (unsigned long *)&psdev->pdev->sh_info->flags) ) {
                dev_err(&dev->dev,