From: Michael Ellerman <mpe@ellerman.id.au>
To: Christophe Leroy <christophe.leroy@csgroup.eu>,
Samuel Holland <samuel@sholland.org>,
Nicholas Piggin <npiggin@gmail.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>,
Kees Cook <keescook@chromium.org>,
Russell Currey <ruscur@russell.cc>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linuxppc-dev@lists.ozlabs.org" <linuxppc-dev@lists.ozlabs.org>
Subject: Re: [PATCH] powerpc: Save AMR/IAMR when switching tasks
Date: Wed, 21 Sep 2022 23:00:16 +1000 [thread overview]
Message-ID: <87a66s287z.fsf@mpe.ellerman.id.au> (raw)
In-Reply-To: <9a433048-ab0d-6d57-7aa8-c9acbe7b7a99@csgroup.eu>
Christophe Leroy <christophe.leroy@csgroup.eu> writes:
> Le 19/09/2022 à 14:37, Michael Ellerman a écrit :
>> Christophe Leroy <christophe.leroy@csgroup.eu> writes:
>>> Le 16/09/2022 à 07:05, Samuel Holland a écrit :
>>>> With CONFIG_PREEMPT=y (involuntary preemption enabled), it is possible
>>>> to switch away from a task inside copy_{from,to}_user. This left the CPU
>>>> with userspace access enabled until after the next IRQ or privilege
>>>> level switch, when AMR/IAMR got reset to AMR_KU[AE]P_BLOCKED. Then, when
>>>> switching back to the original task, the userspace access would fault:
>>>
>>> This is not supposed to happen. You never switch away from a task
>>> magically. Task switch will always happen in an interrupt, that means
>>> copy_{from,to}_user() get interrupted.
>>
>> Unfortunately this isn't true when CONFIG_PREEMPT=y.
>
> Argh, yes, I wrote the above with the assumption that we properly follow
> the main principles that no complex fonction is to be used while KUAP is
> open ... Which is apparently not true here. x86 would have detected it
> with objtool, but we don't have it yet in powerpc.
Yes and yes :/
>> We can switch away without an interrupt via:
>> __copy_tofrom_user()
>> -> __copy_tofrom_user_power7()
>> -> exit_vmx_usercopy()
>> -> preempt_enable()
>> -> __preempt_schedule()
>> -> preempt_schedule()
>> -> preempt_schedule_common()
>> -> __schedule()
>
>
> Should we use preempt_enable_no_resched() to avoid that ?
Good point :)
...
>>
>> Still I think it might be our best option for an easy fix.
>
> Wouldn't it be even easier and less abusive to use
> preemt_enable_no_resched() ? Or is there definitively a good reason to
> resched after a VMX copy while we don't with regular copies ?
I don't think it's important to reschedule there. I guess it means
another task that wants to preempt will have to wait a little longer,
but I doubt it's measurable.
One reason to do the KUAP lock is it also protects us from running
disable_kernel_altivec() with KUAP unlocked.
That in turn calls into msr_check_and_clear() and
__msr_check_and_clear(), none of which is a problem per-se, but we'd
need to make that all notrace to be 100% safe.
At the moment we're running that all with KUAP unlocked anyway, so using
preempt_enable_no_resched() would fix the actual bug and is much nicer
than my patch, so we should probably do that.
We can look at making disable_kernel_altivec() etc. notrace as a
follow-up.
cheers
next prev parent reply other threads:[~2022-09-21 13:00 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-16 5:05 [PATCH] powerpc: Save AMR/IAMR when switching tasks Samuel Holland
2022-09-17 8:16 ` Christophe Leroy
2022-09-17 18:38 ` Samuel Holland
2022-09-18 8:21 ` Christophe Leroy
2022-09-19 12:37 ` Michael Ellerman
2022-09-19 13:39 ` Christophe Leroy
2022-09-21 13:00 ` Michael Ellerman [this message]
2022-09-21 3:33 ` Samuel Holland
2022-09-21 5:17 ` Christophe Leroy
2022-10-26 4:27 ` Samuel Holland
2022-11-14 12:14 ` Christophe Leroy
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=87a66s287z.fsf@mpe.ellerman.id.au \
--to=mpe@ellerman.id.au \
--cc=christophe.leroy@csgroup.eu \
--cc=ebiederm@xmission.com \
--cc=keescook@chromium.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=npiggin@gmail.com \
--cc=ruscur@russell.cc \
--cc=samuel@sholland.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