From: Nicholas Piggin <npiggin@gmail.com>
To: linuxppc-dev@lists.ozlabs.org
Cc: Guenter Roeck <linux@roeck-us.net>, Nicholas Piggin <npiggin@gmail.com>
Subject: [PATCH 3/3] powerpc: fix reschedule bug in KUAP-unlocked user copy
Date: Fri, 14 Oct 2022 01:16:47 +1000 [thread overview]
Message-ID: <20221013151647.1857994-3-npiggin@gmail.com> (raw)
In-Reply-To: <20221013151647.1857994-1-npiggin@gmail.com>
schedule must not be explicitly called while KUAP is unlocked, because
the AMR register will not be saved across the context switch on 64s
(preemption is allowed because that is driven by interrupts which do
save the AMR).
exit_vmx_usercopy() runs inside an unlocked user access region, and it
calls preempt_enable() which will call schedule() if need_resched() was
set while non-preemptible. This can cause tasks to run unprotected when
the should not, and can cause the user copy to be improperly blocked
when scheduling back to it.
Fix this by avoiding the explicit resched for preempt kernels by
generating an interrupt to reschedule the context if need_resched() got
set.
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
arch/powerpc/lib/vmx-helper.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/arch/powerpc/lib/vmx-helper.c b/arch/powerpc/lib/vmx-helper.c
index f76a50291fd7..d491da8d1838 100644
--- a/arch/powerpc/lib/vmx-helper.c
+++ b/arch/powerpc/lib/vmx-helper.c
@@ -36,7 +36,17 @@ int exit_vmx_usercopy(void)
{
disable_kernel_altivec();
pagefault_enable();
- preempt_enable();
+ preempt_enable_no_resched();
+ /*
+ * Must never explicitly call schedule (including preempt_enable())
+ * while in a kuap-unlocked user copy, because the AMR register will
+ * not be saved and restored across context switch. However preempt
+ * kernels need to be preempted as soon as possible if need_resched is
+ * set and we are preemptible. The hack here is to schedule a
+ * decrementer to fire here and reschedule for us if necessary.
+ */
+ if (IS_ENABLED(CONFIG_PREEMPT) && need_resched())
+ set_dec(1);
return 0;
}
--
2.37.2
next prev parent reply other threads:[~2022-10-13 15:19 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-13 15:16 [PATCH 1/3] powerpc/64s: Disable preemption in hash lazy mmu mode Nicholas Piggin
2022-10-13 15:16 ` [PATCH 2/3] powerpc/64s: Fix hash__change_memory_range preemption warning Nicholas Piggin
2022-10-14 0:17 ` Guenter Roeck
2022-10-13 15:16 ` Nicholas Piggin [this message]
2022-10-13 19:58 ` [PATCH 3/3] powerpc: fix reschedule bug in KUAP-unlocked user copy Guenter Roeck
2022-10-14 0:18 ` Guenter Roeck
2022-10-13 15:29 ` [PATCH 1/3] powerpc/64s: Disable preemption in hash lazy mmu mode Christophe Leroy
2022-10-14 0:17 ` Guenter Roeck
2022-10-28 11:49 ` Michael Ellerman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221013151647.1857994-3-npiggin@gmail.com \
--to=npiggin@gmail.com \
--cc=linux@roeck-us.net \
--cc=linuxppc-dev@lists.ozlabs.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).