----- On Apr 13, 2021, at 12:57 PM, Eric Dumazet eduma...@google.com wrote:
> On Tue, Apr 13, 2021 at 6:54 PM Mathieu Desnoyers > <mathieu.desnoy...@efficios.com> wrote: >> >> ----- On Apr 13, 2021, at 12:22 PM, Eric Dumazet eric.duma...@gmail.com >> wrote: >> >> > From: Eric Dumazet <eduma...@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 ? In terms of behavior, yes. And it's probably the "easy" fix, but I hate that it adds lots of preprocessor ifdefs into the rseq code. But this would require auditing get_user()/put_user() for each architecture supported by rseq to ensure they support 8-byte load/store. And it would become an added burden on architecture maintainers wishing to add rseq support for their architecture. One alternative would be to implement rseq_get_user_u64 and rseq_put_user_u64 wrappers as static functions within rseq.c to hide the preprocessor ifdeffery from the higher-level code. I try very hard to avoid mixing preprocessor ifdefs with C code logic whenever I can. Thanks, Mathieu -- Mathieu Desnoyers EfficiOS Inc. http://www.efficios.com