Skip to content

Commit 6f6cfa5

Browse files
mrutland-armctmarinas
authored andcommitted
arm64: mm: use die_kernel_fault() in do_mem_abort()
If we take an unhandled fault from EL1, either: a) The xFSC handler calls die_kernel_fault() directly. In this case, die_kernel_fault() calls: pr_alert(..., msg, addr); mem_abort_decode(esr); show_pte(addr); die(); bust_spinlocks(0); do_exit(SIGKILL); b) The xFSC handler returns to do_mem_abort(), indicating failure. In this case, do_mem_abort() calls: pr_alert(..., addr); mem_abort_decode(esr); show_pte(addr); arm64_notify_die() { die(); } This inconstency is unfortunatem, and in theory in case (b) registered notifiers can prevent us from terminating the faulting thread by returning NOTIFY_STOP, whereupon we'll end up returning from the fault, replaying, and almost certainly get stuck in a livelock spewing errors into dmesg. We don't expect notifers to fix things up, since we dump state to dmesg before invoking them, so it would be more sensible to consistently terminate the thread in this case. This patch has do_mem_abort() call die_kernel_fault() for unhandled faults taken from EL1. Where we would previously have logged a messafe of the form: | Unhandled fault at ${ADDR} ... we will now log a message of the form: | Unable to handle kernel ${FAULT_NAME} at virtual address ${ADDR} ... and we will consistently terminate the thread from which the fault was taken. Signed-off-by: Mark Rutland <[email protected]> Cc: Will Deacon <[email protected]> Tested-by: Andrey Konovalov <[email protected]> Acked-by: Will Deacon <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Catalin Marinas <[email protected]>
1 parent d58071a commit 6f6cfa5

File tree

1 file changed

+2
-5
lines changed

1 file changed

+2
-5
lines changed

arch/arm64/mm/fault.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -813,11 +813,8 @@ void do_mem_abort(unsigned long far, unsigned int esr, struct pt_regs *regs)
813813
if (!inf->fn(far, esr, regs))
814814
return;
815815

816-
if (!user_mode(regs)) {
817-
pr_alert("Unhandled fault at 0x%016lx\n", addr);
818-
mem_abort_decode(esr);
819-
show_pte(addr);
820-
}
816+
if (!user_mode(regs))
817+
die_kernel_fault(inf->name, addr, esr, regs);
821818

822819
/*
823820
* At this point we have an unrecognized fault type whose tag bits may

0 commit comments

Comments
 (0)