Commit 7b9acbb6 authored by Max Filippov's avatar Max Filippov
Browse files

xtensa: fix uaccess-related livelock in do_page_fault

If a uaccess (e.g. get_user()) triggers a fault and there's a
fault signal pending, the handler will return to the uaccess without
having performed a uaccess fault fixup, and so the CPU will immediately
execute the uaccess instruction again, whereupon it will livelock
bouncing between that instruction and the fault handler.

https://lore.kernel.org/lkml/20210121123140.GD48431@C02TD0UTHF1T.local/



Cc: stable@vger.kernel.org
Reported-by: default avatarMark Rutland <mark.rutland@arm.com>
Signed-off-by: default avatarMax Filippov <jcmvbkbc@gmail.com>
parent ab5eb336
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -112,8 +112,11 @@ void do_page_fault(struct pt_regs *regs)
	 */
	fault = handle_mm_fault(vma, address, flags, regs);

	if (fault_signal_pending(fault, regs))
	if (fault_signal_pending(fault, regs)) {
		if (!user_mode(regs))
			goto bad_page_fault;
		return;
	}

	if (unlikely(fault & VM_FAULT_ERROR)) {
		if (fault & VM_FAULT_OOM)