]> git.karo-electronics.de Git - linux-beck.git/commitdiff
powerpc/eeh: Don't propagate error to guest
authorGavin Shan <gwshan@linux.vnet.ibm.com>
Thu, 3 Mar 2016 23:53:12 +0000 (10:53 +1100)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 8 Mar 2016 22:58:25 +0000 (09:58 +1100)
When EEH error happened to the parent PE of those PEs that have
been passed through to guest, the error is propagated to guest
domain and the VFIO driver's error handlers are called. It's not
correct as the error in the host domain shouldn't be propagated
to guests and affect them.

This adds one more limitation when calling EEH error handlers.
If the PE has been passed through to guest, the error handlers
won't be called.

Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
Reviewed-by: Russell Currey <ruscur@russell.cc>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/kernel/eeh_driver.c

index c0fe7a6be2c92190bae0c22a7f0dc8f70f990536..6c59de8b928066f580748fb8b0c4c2c4e5a3e81d 100644 (file)
@@ -195,7 +195,7 @@ static void *eeh_report_error(void *data, void *userdata)
        enum pci_ers_result rc, *res = userdata;
        struct pci_driver *driver;
 
-       if (!dev || eeh_dev_removed(edev))
+       if (!dev || eeh_dev_removed(edev) || eeh_pe_passed(edev->pe))
                return NULL;
        dev->error_state = pci_channel_io_frozen;
 
@@ -237,7 +237,7 @@ static void *eeh_report_mmio_enabled(void *data, void *userdata)
        enum pci_ers_result rc, *res = userdata;
        struct pci_driver *driver;
 
-       if (!dev || eeh_dev_removed(edev))
+       if (!dev || eeh_dev_removed(edev) || eeh_pe_passed(edev->pe))
                return NULL;
 
        driver = eeh_pcid_get(dev);
@@ -277,7 +277,7 @@ static void *eeh_report_reset(void *data, void *userdata)
        enum pci_ers_result rc, *res = userdata;
        struct pci_driver *driver;
 
-       if (!dev || eeh_dev_removed(edev))
+       if (!dev || eeh_dev_removed(edev) || eeh_pe_passed(edev->pe))
                return NULL;
        dev->error_state = pci_channel_io_normal;
 
@@ -336,7 +336,7 @@ static void *eeh_report_resume(void *data, void *userdata)
        bool was_in_error;
        struct pci_driver *driver;
 
-       if (!dev || eeh_dev_removed(edev))
+       if (!dev || eeh_dev_removed(edev) || eeh_pe_passed(edev->pe))
                return NULL;
        dev->error_state = pci_channel_io_normal;
 
@@ -375,7 +375,7 @@ static void *eeh_report_failure(void *data, void *userdata)
        struct pci_dev *dev = eeh_dev_to_pci_dev(edev);
        struct pci_driver *driver;
 
-       if (!dev || eeh_dev_removed(edev))
+       if (!dev || eeh_dev_removed(edev) || eeh_pe_passed(edev->pe))
                return NULL;
        dev->error_state = pci_channel_io_perm_failure;