arm64: acpi: Make apei_claim_sea() synchronise with APEI's irq work
APEI is unable to do all of its error handling work in nmi-context, so it defers non-fatal work onto the irq_work queue. arch_irq_work_raise() sends an IPI to the calling cpu, but this is not guaranteed to be taken before returning to user-space. Unless the exception interrupted a context with irqs-masked, irq_work_run() can run immediately. Otherwise return -EINPROGRESS to indicate ghes_notify_sea() found some work to do, but it hasn't finished yet. With this apei_claim_sea() returning '0' means this external-abort was also notification of a firmware-first RAS error, and that APEI has processed the CPER records. Signed-off-by:James Morse <james.morse@arm.com> Reviewed-by:
Punit Agrawal <punit.agrawal@arm.com> Tested-by:
Tyler Baicar <tbaicar@codeaurora.org> Acked-by:
Catalin Marinas <catalin.marinas@arm.com> CC: Xie XiuQi <xiexiuqi@huawei.com> CC: gengdongjiu <gengdongjiu@huawei.com> --- Changes since v7: * Added Catalin's ack, then: * Added __irq_enter()/exit() calls so if we interrupted preemptible code, the preempt count matches what other irq-work expects. * Changed the 'if (!arch_irqs_disabled_flags(interrupted_flags))' test to be safe before/after Julien's PMR series. Changes since v6: * Added pr_warn() for the EINPROGRESS case so panic-tracebacks show 'APEI was here'. * Tinkered with the commit message Changes since v2: * Removed IS_ENABLED() check, done by the caller unless we have a dummy definition.
Loading
Please register or sign in to comment