提交 86a34ffe 编写于 作者: J James Morse 提交者: Baolin Wang

ACPI / APEI: Switch NOTIFY_SEA to use the estatus queue

fix #28612342

commit 255097c82d821bb2bb18e9c7011841ee7342840f upstream

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: NJames Morse <james.morse@arm.com>
Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: NBaolin Wang <baolin.wang@linux.alibaba.com>
Reviewed-by: NAlex Shi <alex.shi@linux.alibaba.com>
Acked-by: NCaspar Zhang <caspar@linux.alibaba.com>
Reviewed-by: Nluanshi <zhangliguang@linux.alibaba.com>
上级 73935d30
...@@ -41,19 +41,9 @@ config ACPI_APEI_PCIEAER ...@@ -41,19 +41,9 @@ config ACPI_APEI_PCIEAER
Turn on this option to enable the corresponding support. Turn on this option to enable the corresponding support.
config ACPI_APEI_SEA config ACPI_APEI_SEA
bool "APEI Synchronous External Abort logging/recovering support" bool
depends on ARM64 && ACPI_APEI_GHES depends on ARM64 && ACPI_APEI_GHES
default y 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 config ACPI_APEI_MEMORY_FAILURE
bool "APEI memory error recovering support" bool "APEI memory error recovering support"
......
...@@ -767,7 +767,6 @@ static struct notifier_block ghes_notifier_hed = { ...@@ -767,7 +767,6 @@ static struct notifier_block ghes_notifier_hed = {
.notifier_call = ghes_notify_hed, .notifier_call = ghes_notify_hed,
}; };
#ifdef CONFIG_HAVE_ACPI_APEI_NMI
/* /*
* Handlers for CPER records may not be NMI safe. For example, * Handlers for CPER records may not be NMI safe. For example,
* memory_failure_queue() takes spinlocks and calls schedule_work_on(). * 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) ...@@ -903,7 +902,6 @@ static int ghes_in_nmi_spool_from_list(struct list_head *rcu_list)
return ret; return ret;
} }
#endif /* CONFIG_HAVE_ACPI_APEI_NMI */
#ifdef CONFIG_ACPI_APEI_SEA #ifdef CONFIG_ACPI_APEI_SEA
static LIST_HEAD(ghes_sea); static LIST_HEAD(ghes_sea);
...@@ -914,16 +912,7 @@ static LIST_HEAD(ghes_sea); ...@@ -914,16 +912,7 @@ static LIST_HEAD(ghes_sea);
*/ */
int ghes_notify_sea(void) int ghes_notify_sea(void)
{ {
struct ghes *ghes; return ghes_in_nmi_spool_from_list(&ghes_sea);
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;
} }
static void ghes_sea_add(struct ghes *ghes) static void ghes_sea_add(struct ghes *ghes)
...@@ -990,16 +979,15 @@ static void ghes_nmi_remove(struct ghes *ghes) ...@@ -990,16 +979,15 @@ static void ghes_nmi_remove(struct ghes *ghes)
*/ */
synchronize_rcu(); 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) static void ghes_nmi_init_cxt(void)
{ {
init_irq_work(&ghes_proc_irq_work, ghes_proc_in_irq); 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) static int ghes_probe(struct platform_device *ghes_dev)
{ {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册