]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
ACPI / APEI: Switch NOTIFY_SEA to use the estatus queue
authorJames Morse <james.morse@arm.com>
Tue, 29 Jan 2019 18:48:48 +0000 (18:48 +0000)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 7 Feb 2019 22:10:45 +0000 (23:10 +0100)
Now that the estatus queue can be used by more than one notification
method, we can move notifications that have NMI-like behaviour over.

Switch NOTIFY_SEA over to use the estatus queue. This makes it behave
in the same way as x86's NOTIFY_NMI.

Remove Kconfig's ability to turn ACPI_APEI_SEA off if ACPI_APEI_GHES
is selected. This roughly matches the x86 NOTIFY_NMI behaviour, and means
each architecture has at least one user of the estatus-queue, meaning it
doesn't need guarding with ifdef.

Signed-off-by: James Morse <james.morse@arm.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/apei/Kconfig
drivers/acpi/apei/ghes.c

index 52ae5438edeb95b786ebccbcf2310fe5521870ed..6b18f8bc7be353403873df2c11ca0b72ef256eb6 100644 (file)
@@ -41,19 +41,9 @@ config ACPI_APEI_PCIEAER
          Turn on this option to enable the corresponding support.
 
 config ACPI_APEI_SEA
-       bool "APEI Synchronous External Abort logging/recovering support"
+       bool
        depends on ARM64 && ACPI_APEI_GHES
        default y
-       help
-         This option should be enabled if the system supports
-         firmware first handling of SEA (Synchronous External Abort).
-         SEA happens with certain faults of data abort or instruction
-         abort synchronous exceptions on ARMv8 systems. If a system
-         supports firmware first handling of SEA, the platform analyzes
-         and handles hardware error notifications from SEA, and it may then
-         form a HW error record for the OS to parse and handle. This
-         option allows the OS to look for such hardware error record, and
-         take appropriate action.
 
 config ACPI_APEI_MEMORY_FAILURE
        bool "APEI memory error recovering support"
index 63dcd25b09c05d25dde8c7d7c7c20baa4a5e7265..679ab0f93ee8d1ba69db0cdfaca0fbea737665de 100644 (file)
@@ -767,7 +767,6 @@ static struct notifier_block ghes_notifier_hed = {
        .notifier_call = ghes_notify_hed,
 };
 
-#ifdef CONFIG_HAVE_ACPI_APEI_NMI
 /*
  * Handlers for CPER records may not be NMI safe. For example,
  * memory_failure_queue() takes spinlocks and calls schedule_work_on().
@@ -903,7 +902,6 @@ static int ghes_in_nmi_spool_from_list(struct list_head *rcu_list)
 
        return ret;
 }
-#endif /* CONFIG_HAVE_ACPI_APEI_NMI */
 
 #ifdef CONFIG_ACPI_APEI_SEA
 static LIST_HEAD(ghes_sea);
@@ -914,16 +912,7 @@ static LIST_HEAD(ghes_sea);
  */
 int ghes_notify_sea(void)
 {
-       struct ghes *ghes;
-       int ret = -ENOENT;
-
-       rcu_read_lock();
-       list_for_each_entry_rcu(ghes, &ghes_sea, list) {
-               if (!ghes_proc(ghes))
-                       ret = 0;
-       }
-       rcu_read_unlock();
-       return ret;
+       return ghes_in_nmi_spool_from_list(&ghes_sea);
 }
 
 static void ghes_sea_add(struct ghes *ghes)
@@ -990,16 +979,15 @@ static void ghes_nmi_remove(struct ghes *ghes)
         */
        synchronize_rcu();
 }
+#else /* CONFIG_HAVE_ACPI_APEI_NMI */
+static inline void ghes_nmi_add(struct ghes *ghes) { }
+static inline void ghes_nmi_remove(struct ghes *ghes) { }
+#endif /* CONFIG_HAVE_ACPI_APEI_NMI */
 
 static void ghes_nmi_init_cxt(void)
 {
        init_irq_work(&ghes_proc_irq_work, ghes_proc_in_irq);
 }
-#else /* CONFIG_HAVE_ACPI_APEI_NMI */
-static inline void ghes_nmi_add(struct ghes *ghes) { }
-static inline void ghes_nmi_remove(struct ghes *ghes) { }
-static inline void ghes_nmi_init_cxt(void) { }
-#endif /* CONFIG_HAVE_ACPI_APEI_NMI */
 
 static int ghes_probe(struct platform_device *ghes_dev)
 {