From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
To: Eric Dumazet <edumazet@google.com>
Cc: Eric Dumazet <eric.dumazet@gmail.com>,
David Laight <David.Laight@aculab.com>,
Ingo Molnar <mingo@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
paulmck <paulmck@kernel.org>, Boqun Feng <boqun.feng@gmail.com>,
Arjun Roy <arjunroy@google.com>,
linux-kernel <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v2 3/3] rseq: optimise rseq_get_rseq_cs() and clear_rseq_cs()
Date: Tue, 13 Apr 2021 13:20:54 -0400 (EDT) [thread overview]
Message-ID: <989543379.72506.1618334454075.JavaMail.zimbra@efficios.com> (raw)
In-Reply-To: <CANn89iKnQ7KeCo0os0c67GMgEkmrRqhmGhug-xL-Mx5BhR+BkQ@mail.gmail.com>
----- On Apr 13, 2021, at 1:07 PM, Eric Dumazet edumazet@google.com wrote:
> On Tue, Apr 13, 2021 at 7:01 PM Eric Dumazet <edumazet@google.com> wrote:
>>
>> On Tue, Apr 13, 2021 at 6:57 PM Eric Dumazet <edumazet@google.com> wrote:
>> >
>> > On Tue, Apr 13, 2021 at 6:54 PM Mathieu Desnoyers
>> > <mathieu.desnoyers@efficios.com> wrote:
>> > >
>> > > ----- On Apr 13, 2021, at 12:22 PM, Eric Dumazet eric.dumazet@gmail.com wrote:
>> > >
>> > > > From: Eric Dumazet <edumazet@google.com>
>> > > >
>> > > > Commit ec9c82e03a74 ("rseq: uapi: Declare rseq_cs field as union,
>> > > > update includes") added regressions for our servers.
>> > > >
>> > > > Using copy_from_user() and clear_user() for 64bit values
>> > > > is suboptimal.
>> > > >
>> > > > We can use faster put_user() and get_user().
>> > > >
>> > > > 32bit arches can be changed to use the ptr32 field,
>> > > > since the padding field must always be zero.
>> > > >
>> > > > v2: added ideas from Peter and Mathieu about making this
>> > > > generic, since my initial patch was only dealing with
>> > > > 64bit arches.
>> > >
>> > > Ah, now I remember the reason why reading and clearing the entire 64-bit
>> > > is important: it's because we don't want to allow user-space processes to
>> > > use this change in behavior to figure out whether they are running on a
>> > > 32-bit or in a 32-bit compat mode on a 64-bit kernel.
>> > >
>> > > So although I'm fine with making 64-bit kernels faster, we'll want to keep
>> > > updating the entire 64-bit ptr field on 32-bit kernels as well.
>> > >
>> > > Thanks,
>> > >
>> >
>> > So... back to V1 then ?
>>
>> Or add more stuff as in :
>
> diff against v2, WDYT ?
I like this approach slightly better, because it moves the preprocessor ifdefs into
rseq_get_rseq_cs and clear_rseq_cs, while keeping the same behavior for a 32-bit
process running on native 32-bit kernel and as compat task on a 64-bit kernel.
That being said, I don't expect anyone to care much about performance of 32-bit
kernels, so we could use copy_from_user() on 32-bit kernels to remove special-cases
in 32-bit specific code. This would eliminate the 32-bit specific "padding" read, and
let the TASK_SIZE comparison handle the check for both 32-bit and 64-bit kernels.
As for clear_user(), I wonder whether we could simply keep using it, but change the
clear_user() macro to figure out that it can use a faster 8-byte put_user ? I find it
odd that performance optimizations which would be relevant elsewhere creep into the
rseq code.
Thanks,
Mathieu
>
> diff --git a/kernel/rseq.c b/kernel/rseq.c
> index
> f2eee3f7f5d330688c81cb2e57d47ca6b843873e..537b1f684efa11069990018ffa3642c209993011
> 100644
> --- a/kernel/rseq.c
> +++ b/kernel/rseq.c
> @@ -136,6 +136,10 @@ static int rseq_get_cs_ptr(struct rseq_cs __user **uptrp,
> {
> u32 ptr;
>
> + if (get_user(ptr, &rseq->rseq_cs.ptr.padding))
> + return -EFAULT;
> + if (ptr)
> + return -EINVAL;
> if (get_user(ptr, &rseq->rseq_cs.ptr.ptr32))
> return -EFAULT;
> *uptrp = (struct rseq_cs __user *)ptr;
> @@ -150,8 +154,9 @@ static int rseq_get_rseq_cs(struct task_struct *t,
> struct rseq_cs *rseq_cs)
> u32 sig;
> int ret;
>
> - if (rseq_get_cs_ptr(&urseq_cs, t->rseq))
> - return -EFAULT;
> + ret = rseq_get_cs_ptr(&urseq_cs, t->rseq);
> + if (ret)
> + return ret;
> if (!urseq_cs) {
> memset(rseq_cs, 0, sizeof(*rseq_cs));
> return 0;
> @@ -237,7 +242,8 @@ static int clear_rseq_cs(struct task_struct *t)
> #ifdef CONFIG_64BIT
> return put_user(0UL, &t->rseq->rseq_cs.ptr64);
> #else
> - return put_user(0UL, &t->rseq->rseq_cs.ptr.ptr32);
> + return put_user(0UL, &t->rseq->rseq_cs.ptr.ptr32) |
> + put_user(0UL, &t->rseq->rseq_cs.ptr.padding);
> #endif
> }
--
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
next prev parent reply other threads:[~2021-04-13 17:20 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-13 16:22 [PATCH v2 0/3] rseq: minor optimizations Eric Dumazet
2021-04-13 16:22 ` [PATCH v2 1/3] rseq: optimize rseq_update_cpu_id() Eric Dumazet
2021-04-13 16:22 ` [PATCH v2 2/3] rseq: remove redundant access_ok() Eric Dumazet
2021-04-13 16:22 ` [PATCH v2 3/3] rseq: optimise rseq_get_rseq_cs() and clear_rseq_cs() Eric Dumazet
2021-04-13 16:54 ` Mathieu Desnoyers
2021-04-13 16:57 ` Eric Dumazet
2021-04-13 17:01 ` Eric Dumazet
2021-04-13 17:07 ` Eric Dumazet
2021-04-13 17:20 ` Mathieu Desnoyers [this message]
2021-04-13 17:33 ` Eric Dumazet
2021-04-13 18:00 ` Mathieu Desnoyers
2021-04-13 18:22 ` Eric Dumazet
2021-04-13 18:35 ` Arjun Roy
2021-04-13 21:19 ` David Laight
2021-04-13 22:03 ` Arjun Roy
2021-04-14 7:55 ` David Laight
2021-04-14 16:00 ` Eric Dumazet
2021-04-14 16:08 ` David Laight
2021-04-14 16:10 ` Eric Dumazet
2021-04-14 17:15 ` Arjun Roy
2021-04-14 17:35 ` Eric Dumazet
2021-04-14 20:15 ` Arjun Roy
2021-04-14 20:25 ` Eric Dumazet
2021-04-14 20:35 ` Arjun Roy
2021-04-13 19:13 ` Mathieu Desnoyers
2021-04-13 17:06 ` Mathieu Desnoyers
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=989543379.72506.1618334454075.JavaMail.zimbra@efficios.com \
--to=mathieu.desnoyers@efficios.com \
--cc=David.Laight@aculab.com \
--cc=arjunroy@google.com \
--cc=boqun.feng@gmail.com \
--cc=edumazet@google.com \
--cc=eric.dumazet@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=paulmck@kernel.org \
--cc=peterz@infradead.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.