Re: [PATCH v7 22/25] ACPI / APEI: Kick the memory_failure() queue for synchronous errors
From: James Morse <james.morse@arm.com>
Date: 2018-12-10 19:15:25
Also in:
kvmarm, linux-acpi, linux-mm
Hi Xie XiuQi, On 05/12/2018 02:02, Xie XiuQi wrote:
On 2018/12/4 2:06, James Morse wrote:quoted
memory_failure() offlines or repairs pages of memory that have been discovered to be corrupt. These may be detected by an external component, (e.g. the memory controller), and notified via an IRQ. In this case the work is queued as not all of memory_failure()s work can happen in IRQ context. If the error was detected as a result of user-space accessing a corrupt memory location the CPU may take an abort instead. On arm64 this is a 'synchronous external abort', and on a firmware first system it is replayed using NOTIFY_SEA. This notification has NMI like properties, (it can interrupt IRQ-masked code), so the memory_failure() work is queued. If we return to user-space before the queued memory_failure() work is processed, we will take the fault again. This loop may cause platform firmware to exceed some threshold and reboot when Linux could have recovered from this error. If a ghes notification type indicates that it may be triggered again when we return to user-space, use the task-work and notify-resume hooks to kick the relevant memory_failure() queue before returning
quoted
@@ -407,7 +447,22 @@ static void ghes_handle_memory_failure(struct acpi_hest_generic_data *gdata, int if (flags != -1) memory_failure_queue(pfn, flags);We may need to take MF_ACTION_REQUIRED flags for memory_failure() in SEA condition.
Hmmm, I'd forgotten about the extra flags. They're only used by x86's do_machine_check(), which knows more about what is going on. I agree we do know it should be a 'MF_ACTION_REQUIRED' for Synchronous-external-abort, but I'd really like all the notifications to behave in the same way as we can't change which notification firmware uses. (This ghes_is_synchronous() affects when memory_failure() runs, not what it does.) What happens if we miss MF_ACTION_REQUIRED? Surely the page still gets unmapped as its PG_Poisoned, an AO signal may be pending, but if user-space touches the page it will get an AR signal. Is this just about removing an extra AO signal to user-space? If we do need this, I'd like to pick it up from the CPER records, as x86's NOTIFY_NMI looks like it covers both AO/AR cases. (as does NOTIFY_SDEI). The Master/Target abort or Invalid-address types in the memory-error-section CPER records look like the best bet.
And there is no return value check for memory_failure() in memory_failure_work_func(), I'm not sure whether we need to check the return value.
What would we do if it fails? The reasons look fairly broad, -EBUSY can mean "(page) still referenced by [..] users", 'thp split failed' or 'page already poisoned'. I don't think the behaviour or return-codes are consistent enough to use.
If the recovery fails here, we need to take other actions, such as force to send a SIGBUS signal.
We don't do this today. If it fixes some mis-behaviour, and we can key it from something in the CPER records then I'm all ears! Thanks, James _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel