]> 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:34:12 +0000 (15:34 -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 eda9b1b02c34cfb90578053583899d0876c028ac..a2519ce2e4f1ad4aa28291d4cdc6ef036b2b2a82 100644 (file)
@@ -90,6 +90,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)
@@ -219,6 +220,7 @@ static pci_ers_result_t zpci_event_attempt_error_recovery(struct pci_dev *pdev)
                ers_res = zpci_event_do_reset(pdev, driver);
 
        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));
                goto out_unlock;
@@ -227,6 +229,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);
 
index 0c3aa91d1aee0fcdcf5c3c23a2338424c90022ad..7e9b6e4d4695064a508af024daa7cca2c40cb6d8 100644 (file)
@@ -1586,7 +1586,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 452a3dca28eaa05e82135ee5174dee580310fded..242ee3843e10e9d1c36497a7e3f5cd88069dc46e 100644 (file)
@@ -2707,7 +2707,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