[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <Zs4ZdAtnm2UEr5cd@zx2c4.com>
Date: Tue, 27 Aug 2024 20:22:44 +0200
From: "Jason A. Donenfeld" <Jason@...c4.com>
To: Eric Biggers <ebiggers@...nel.org>
Cc: Christophe Leroy <christophe.leroy@...roup.eu>,
Michael Ellerman <mpe@...erman.id.au>,
Nicholas Piggin <npiggin@...il.com>,
Naveen N Rao <naveen@...nel.org>, Andy Lutomirski <luto@...nel.org>,
Thomas Gleixner <tglx@...utronix.de>,
Ingo Molnar <mingo@...hat.com>, Borislav Petkov <bp@...en8.de>,
Dave Hansen <dave.hansen@...ux.intel.com>, x86@...nel.org,
"H. Peter Anvin" <hpa@...or.com>, Theodore Ts'o <tytso@....edu>,
Arnd Bergmann <arnd@...db.de>,
Andrew Morton <akpm@...ux-foundation.org>,
Steven Rostedt <rostedt@...dmis.org>,
Masami Hiramatsu <mhiramat@...nel.org>,
Mathieu Desnoyers <mathieu.desnoyers@...icios.com>,
Vincenzo Frascino <vincenzo.frascino@....com>,
Shuah Khan <shuah@...nel.org>, linuxppc-dev@...ts.ozlabs.org,
linux-kernel@...r.kernel.org, linux-fsdevel@...r.kernel.org,
linux-arch@...r.kernel.org, linux-mm@...ck.org,
linux-trace-kernel@...r.kernel.org, linux-kselftest@...r.kernel.org
Subject: Re: [PATCH v2 05/17] vdso: Avoid call to memset() by getrandom
On Tue, Aug 27, 2024 at 11:08:19AM -0700, Eric Biggers wrote:
> On Thu, Aug 22, 2024 at 09:13:13AM +0200, Christophe Leroy wrote:
> > With the current implementation, __cvdso_getrandom_data() calls
> > memset(), which is unexpected in the VDSO.
> >
> > Rewrite opaque data initialisation to avoid memset().
> >
> > Signed-off-by: Christophe Leroy <christophe.leroy@...roup.eu>
> > ---
> > lib/vdso/getrandom.c | 15 ++++++++++-----
> > 1 file changed, 10 insertions(+), 5 deletions(-)
> >
> > diff --git a/lib/vdso/getrandom.c b/lib/vdso/getrandom.c
> > index cab153c5f9be..4a56f45141b4 100644
> > --- a/lib/vdso/getrandom.c
> > +++ b/lib/vdso/getrandom.c
> > @@ -4,6 +4,7 @@
> > */
> >
> > #include <linux/minmax.h>
> > +#include <linux/array_size.h>
> > #include <vdso/datapage.h>
> > #include <vdso/getrandom.h>
> > #include <vdso/unaligned.h>
> > @@ -74,11 +75,15 @@ __cvdso_getrandom_data(const struct vdso_rng_data *rng_info, void *buffer, size_
> > u32 counter[2] = { 0 };
> >
> > if (unlikely(opaque_len == ~0UL && !buffer && !len && !flags)) {
> > - *(struct vgetrandom_opaque_params *)opaque_state = (struct vgetrandom_opaque_params) {
> > - .size_of_opaque_state = sizeof(*state),
> > - .mmap_prot = PROT_READ | PROT_WRITE,
> > - .mmap_flags = MAP_DROPPABLE | MAP_ANONYMOUS
> > - };
> > + struct vgetrandom_opaque_params *params = opaque_state;
> > + int i;
> > +
> > + params->size_of_opaque_state = sizeof(*state);
> > + params->mmap_prot = PROT_READ | PROT_WRITE;
> > + params->mmap_flags = MAP_DROPPABLE | MAP_ANONYMOUS;
> > + for (i = 0; i < ARRAY_SIZE(params->reserved); i++)
> > + params->reserved[i] = 0;
> > +
> > return 0;
> > }
>
> Is there a compiler flag that could be used to disable the generation of calls
> to memset?
Apparently not: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90701
-ffreestanding disables the most but still can generate calls to memcpy
and memset, and the bug was closed as "RESOLVED INVALID". Surprising,
but maybe it's one of those "functions are part of language" things.
Powered by blists - more mailing lists