ACPI / APEI: Switch NOTIFY_SEA to use the estatus queue
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>
This commit is contained in:
parent
9c9d080513
commit
255097c82d
|
@ -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"
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue