From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
To: Dave Hansen <dave.hansen@intel.com>,
Dmitry Vyukov <dvyukov@google.com>,
peterz@infradead.org, boqun.feng@gmail.com, tglx@linutronix.de,
mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com,
hpa@zytor.com, aruna.ramakrishna@oracle.com, elver@google.com
Cc: "Paul E. McKenney" <paulmck@kernel.org>,
x86@kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 3/4] rseq: Make rseq work with protection keys
Date: Fri, 21 Feb 2025 16:11:14 -0500 [thread overview]
Message-ID: <eb087edd-4ff5-40f8-afcb-e4d94fb2a7ba@efficios.com> (raw)
In-Reply-To: <c793e1d0-e508-4cf5-a18b-29d30d5e401f@intel.com>
On 2025-02-21 15:50, Dave Hansen wrote:
> On 2/21/25 12:05, Mathieu Desnoyers wrote:
>> On 2025-02-21 14:48, Dave Hansen wrote:
>>> On 2/21/25 11:38, Mathieu Desnoyers wrote:
>>>> I agree that switching to permissive key in the fast path would be
>>>> simpler. AFAIU, the switch_to_permissive_pkey_reg() is only a pkey
>>>> read when the key is already permissive.
>>>
>>> Unfortunately, on x86, PKRU is almost never in its permissive state. We
>>> chose a policy (stored in the global init_pkru_value variable) that
>>> allows R/W access to pkey 0, but disables access to everything else.
>>> It's 0xfffffff5, IIRC.
>>>
>>> This ensures deny-by-default behavior and ensures that threads cloned
>>> off long ago don't have a dangerous PKRU value for newly-allocated and
>>> pkey-protected memory.
>>>
>>> If I had a time machine, it'd be interesting to go back and try to make
>>> PKRU's default value be all 0's and also represent the logically most
>>> restrictive value.
>>
>> Can we assume (or require) that struct rseq and struct rseq_cs reside in
>> pkey-0 memory ?
>
> Maybe. Signal stacks are _practically_ only able to use pkey-0. You can
> technically protect them with anything you want and then WRPKRU as the
> first instruction once you hop into the signal handler (since
> instruction fetches aren't affected by x86 pkeys), but I seriously doubt
> anybody would go to the trouble.
And that would not work on arm64, AFAIU arm64 POR_EL0 also applies to
instruction fetches, which somewhat prevents what can be done for signal
handlers if the code intends to be portable.
>
>> In that case, we could add something to the pkey API that switches to a
>> permissive state only if pkey 0 cannot be accessed.
>>
>> Therefore it would only trigger a pkey read in the common case, and
>> issue a pkey write only if pkey 0 is not accessible.
> I think that's a sane policy. An rseq access can happen at any time
> (from the app's perspective) so the access would theoretically be done
> with a random PKRU value from a random point in the thread's lifetime.
>
> But it is a different policy that we've chosen with signals and "remote"
> accesses, which is to just ignore pkeys entirely.
>
> I don't have a strong opinion. It's hard to balance performance and
> consistency with the other ABI here.
Because the rseq return to userspace handler is called on every return
to userspace after a task is scheduled back after preemption, I am
concerned about the overhead that would be added by a WRPKRU on the
fast-path, given that it acts as as barrier against speculation. Issuing
WRPKRU only after checking that pkey-0 is not accessible appears to be
moving the overhead to a much less common case.
And perhaps if we end up observing that for some reasons either the
sigframe and/or "remote" pkey accesses really must use pkey-0 as well
to work in real-life, then we could make them require pkey-0. That's
of course assuming it would cause no observable ABI breakage.
Once advantage here would be to speed up signal handler delivery.
I have no clue what a "remote" pkey access is. Is this the io_uring
use-case ?
Thanks,
Mathieu
--
Mathieu Desnoyers
EfficiOS Inc.
https://www.efficios.com
next prev parent reply other threads:[~2025-02-21 21:11 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <cover.1739790300.git.dvyukov@google.com>
2025-02-17 11:07 ` [PATCH 1/4] pkeys: add API to switch to permissive pkey register Dmitry Vyukov
2025-02-17 20:03 ` Mathieu Desnoyers
2025-02-17 20:08 ` Mathieu Desnoyers
2025-02-17 20:09 ` Mathieu Desnoyers
2025-02-21 17:01 ` Dave Hansen
2025-02-24 13:25 ` Dmitry Vyukov
2025-02-25 16:15 ` Dave Hansen
2025-02-25 21:56 ` Dmitry Vyukov
2025-02-26 10:00 ` Dmitry Vyukov
2025-02-26 17:21 ` Dave Hansen
2025-02-27 13:58 ` Dmitry Vyukov
2025-02-21 17:37 ` Dave Hansen
2025-02-17 11:07 ` [PATCH 2/4] x86/signal: Use switch_to_permissive_pkey_reg() helper Dmitry Vyukov
2025-02-21 16:26 ` Dave Hansen
2025-02-24 13:13 ` Dmitry Vyukov
2025-02-17 11:07 ` [PATCH 3/4] rseq: Make rseq work with protection keys Dmitry Vyukov
2025-02-17 20:21 ` Mathieu Desnoyers
2025-02-18 7:55 ` Dmitry Vyukov
2025-02-18 14:57 ` Mathieu Desnoyers
2025-02-18 15:10 ` Dmitry Vyukov
2025-02-18 15:27 ` Mathieu Desnoyers
2025-02-18 15:37 ` Dmitry Vyukov
2025-02-21 11:22 ` Dmitry Vyukov
2025-02-21 19:41 ` Mathieu Desnoyers
2025-02-21 17:17 ` Dave Hansen
2025-02-21 19:38 ` Mathieu Desnoyers
2025-02-21 19:48 ` Dave Hansen
2025-02-21 20:05 ` Mathieu Desnoyers
2025-02-21 20:50 ` Dave Hansen
2025-02-21 21:11 ` Mathieu Desnoyers [this message]
2025-02-21 21:36 ` Mathieu Desnoyers
2025-02-21 21:45 ` Dave Hansen
2025-02-24 13:35 ` Dmitry Vyukov
2025-02-21 21:40 ` Dave Hansen
2025-02-17 11:07 ` [PATCH 4/4] selftests/rseq: Add test for rseq+pkeys Dmitry Vyukov
2025-02-17 20:23 ` Mathieu Desnoyers
2025-02-21 17:24 ` Dave Hansen
2025-02-24 13:22 ` Dmitry Vyukov
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=eb087edd-4ff5-40f8-afcb-e4d94fb2a7ba@efficios.com \
--to=mathieu.desnoyers@efficios.com \
--cc=aruna.ramakrishna@oracle.com \
--cc=boqun.feng@gmail.com \
--cc=bp@alien8.de \
--cc=dave.hansen@intel.com \
--cc=dave.hansen@linux.intel.com \
--cc=dvyukov@google.com \
--cc=elver@google.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=paulmck@kernel.org \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=x86@kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.