]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
s390/pci: Use pci_uevent_ers() in PCI recovery
authorNiklas Schnelle <schnelle@linux.ibm.com>
Thu, 7 Aug 2025 13:55:39 +0000 (15:55 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Nov 2025 20:37:01 +0000 (15:37 -0500)
[ Upstream commit dab32f2576a39d5f54f3dbbbc718d92fa5109ce9 ]

Issue uevents on s390 during PCI recovery using pci_uevent_ers() as done by
EEH and AER PCIe recovery routines.

Signed-off-by: Niklas Schnelle <schnelle@linux.ibm.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Lukas Wunner <lukas@wunner.de>
Link: https://patch.msgid.link/20250807-add_err_uevents-v5-2-adf85b0620b0@linux.ibm.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
arch/s390/pci/pci_event.c
drivers/pci/pci-driver.c
include/linux/pci.h

index da0de34d2e5cacf153ee72cd5349574fc048e097..27db1e72c623f8a289cae457e87f0a9896ed241d 100644 (file)
@@ -88,6 +88,7 @@ static pci_ers_result_t zpci_event_notify_error_detected(struct pci_dev *pdev,
        pci_ers_result_t ers_res = PCI_ERS_RESULT_DISCONNECT;
 
        ers_res = driver->err_handler->error_detected(pdev,  pdev->error_state);
+       pci_uevent_ers(pdev, ers_res);
        if (ers_result_indicates_abort(ers_res))
                pr_info("%s: Automatic recovery failed after initial reporting\n", pci_name(pdev));
        else if (ers_res == PCI_ERS_RESULT_NEED_RESET)
@@ -244,6 +245,7 @@ static pci_ers_result_t zpci_event_attempt_error_recovery(struct pci_dev *pdev)
                ers_res = PCI_ERS_RESULT_RECOVERED;
 
        if (ers_res != PCI_ERS_RESULT_RECOVERED) {
+               pci_uevent_ers(pdev, PCI_ERS_RESULT_DISCONNECT);
                pr_err("%s: Automatic recovery failed; operator intervention is required\n",
                       pci_name(pdev));
                status_str = "failed (driver can't recover)";
@@ -253,6 +255,7 @@ static pci_ers_result_t zpci_event_attempt_error_recovery(struct pci_dev *pdev)
        pr_info("%s: The device is ready to resume operations\n", pci_name(pdev));
        if (driver->err_handler->resume)
                driver->err_handler->resume(pdev);
+       pci_uevent_ers(pdev, PCI_ERS_RESULT_RECOVERED);
 out_unlock:
        device_unlock(&pdev->dev);
        zpci_report_status(zdev, "recovery", status_str);
index 6405acdb5d0f38ad599e5743c0da59a822272899..302d61783f6c04d9bbb32fd061bebca7673cfc80 100644 (file)
@@ -1582,7 +1582,7 @@ static int pci_uevent(const struct device *dev, struct kobj_uevent_env *env)
        return 0;
 }
 
-#if defined(CONFIG_PCIEAER) || defined(CONFIG_EEH)
+#if defined(CONFIG_PCIEAER) || defined(CONFIG_EEH) || defined(CONFIG_S390)
 /**
  * pci_uevent_ers - emit a uevent during recovery path of PCI device
  * @pdev: PCI device undergoing error recovery
index 59876de13860dbe50ee6c207cd57e54f51a11079..7735acf6f349052c8b6f51cd4657c08e9022d2ae 100644 (file)
@@ -2764,7 +2764,7 @@ static inline bool pci_is_thunderbolt_attached(struct pci_dev *pdev)
        return false;
 }
 
-#if defined(CONFIG_PCIEPORTBUS) || defined(CONFIG_EEH)
+#if defined(CONFIG_PCIEPORTBUS) || defined(CONFIG_EEH) || defined(CONFIG_S390)
 void pci_uevent_ers(struct pci_dev *pdev, enum  pci_ers_result err_type);
 #endif