All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Jason A. Donenfeld" <Jason@zx2c4.com>
To: Nick Desaulniers <ndesaulniers@google.com>
Cc: Nathan Chancellor <nathan@kernel.org>,
	Andy Lutomirski <luto@kernel.org>,
	Thomas Gleixner <tglx@kernel.org>, Theodore Ts'o <tytso@mit.edu>,
	Vincenzo Frascino <vincenzo.frascino@arm.com>,
	Bill Wendling <morbo@google.com>,
	Justin Stitt <justinstitt@google.com>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Will Deacon <will@kernel.org>,
	Mark Rutland <mark.rutland@arm.com>,
	Huacai Chen <chenhuacai@kernel.org>,
	WANG Xuerui <kernel@xen0n.name>,
	Madhavan Srinivasan <maddy@linux.ibm.com>,
	Michael Ellerman <mpe@ellerman.id.au>,
	Nicholas Piggin <npiggin@gmail.com>,
	"Christophe Leroy (CS GROUP)" <chleroy@kernel.org>,
	Paul Walmsley <pjw@kernel.org>,
	Palmer Dabbelt <palmer@dabbelt.com>,
	Albert Ou <aou@eecs.berkeley.edu>,
	Alexandre Ghiti <alex@ghiti.fr>,
	Heiko Carstens <hca@linux.ibm.com>,
	Vasily Gorbik <gor@linux.ibm.com>,
	Alexander Gordeev <agordeev@linux.ibm.com>,
	Christian Borntraeger <borntraeger@linux.ibm.com>,
	Sven Schnelle <svens@linux.ibm.com>,
	Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
	Dave Hansen <dave.hansen@linux.intel.com>,
	"H. Peter Anvin" <hpa@zytor.com>,
	x86@kernel.org, linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, loongarch@lists.linux.dev,
	linuxppc-dev@lists.ozlabs.org, linux-riscv@lists.infradead.org,
	linux-s390@vger.kernel.org, llvm@lists.linux.dev
Subject: Re: [PATCH v2] random: vDSO: Avoid call to memset() when zeroing reserved in __cvdso_getrandom_data()
Date: Sat, 26 Sep 2026 12:02:26 +0200	[thread overview]
Message-ID: <areYMjNcaqe86ds4@zx2c4.com> (raw)
In-Reply-To: <CAKwvOdmNZL3eFvV3v77GXDzL+XLgz+BT9TA=my0yTnbsHqVeSg@mail.gmail.com>

On Fri, Sep 25, 2026 at 03:00:46PM -0700, Nick Desaulniers wrote:
> On Fri, Sep 25, 2026 at 2:56 PM Nick Desaulniers
> <ndesaulniers@google.com> wrote:
> >
> > On Fri, Sep 25, 2026 at 2:53 PM Nick Desaulniers
> > <ndesaulniers@google.com> wrote:
> > >
> > > On Fri, Sep 25, 2026 at 2:46 PM Nathan Chancellor <nathan@kernel.org> wrote:
> > > >
> > > > After a recent change in LLVM [1], builds with the random vDSO
> > > > implementation, such as PowerPC and RISC-V, fail when checking the vDSO:
> > > >
> > > >   arch/powerpc/kernel/vdso/vdso32.so.dbg: dynamic relocations are not supported
> > > >   arch/riscv/kernel/vdso/vdso.so.dbg: dynamic relocations are not supported
> > > >
> > > > memset() is now generated when zeroing params->reserved for some builds
> > > > because LLVM has an optimization (now run in more instances) that can
> > > > recognize at compile time when it is assigning a static value to a
> > > > contiguous area of memory and turn that into a call to memset(). Both
> > > > clang and GCC assume memset() is always available [2].
> > > >
> > > > clang provides a builtin, __builtin_memset_inline [3][4], that can be
> > > > used to ensure an external function call is not generated when zeroing
> > > > this memory. Use it when it is available.
> > > >
> > > > While GCC has no issues with the current code, it has generated memset()
> > > > before, as seen in commit b7bad082e113 ("random: vDSO: avoid call to out
> > > > of line memset()"). GCC 14 provides '-finline-stringops=memset' [5][6]
> > > > with a similar guarantee to the clang builtin, so use it and
> > > > __builtin_memset() when available.
> > > >
> > > > If no option is available, provide a simple memset_inline() like the one
> > > > from lib/string.c to avoid adding an ugly ifdef.
> > > >
> > > > Link: https://github.com/llvm/llvm-project/commit/90cebef1411617fc3eedd359bdf00cb44b1c2439 [1]
> > > > Link: https://gcc.gnu.org/onlinedocs/gcc-16.2.0/gcc/Standards.html#index-ffreestanding [2]
> > > > Link: https://github.com/llvm/llvm-project/commit/38637ee477541370a90b37f149069d8e5c0c2efd [3]
> > > > Link: https://clang.llvm.org/docs/LanguageExtensions.html#guaranteed-inlined-memset [4]
> > > > Link: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=1ff6d9f7428b0668cd8ab0b3e3ab94f1d733124d [5]
> > > > Link: https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-finline-stringops [6]
> > > > Suggested-by: "Jason A. Donenfeld" <Jason@zx2c4.com>
> > > > Suggested-by: Nick Desaulniers <ndesaulniers@google.com>
> > > > Signed-off-by: Nathan Chancellor <nathan@kernel.org>
> > > > ---
> > > > Changes in v2:
> > > > - Switch approach entirely (Jason, Nick)
> > > >   - clang: use __builtin_memset_inline() to avoid external call
> > > >   - GCC 14+: use __builtin_memset + -finline-stringops=memset (hence the
> > > >     massive CC list increase)
> > > >   - GCC < 14: no issues currently but avoid ifdef with simple memset
> > > >     implementation
> > > > - Link to v1: https://patch.msgid.link/20260916-vdso-getrandom-avoid-memset-llvm-24-v1-1-80a92f2e225a@kernel.org
> > > > ---
> > > >  arch/arm64/kernel/vdso/Makefile     |  2 +-
> > > >  arch/loongarch/vdso/Makefile        |  1 +
> > > >  arch/powerpc/kernel/vdso/Makefile   |  1 +
> > > >  arch/riscv/kernel/vdso/Makefile     |  1 +
> > > >  arch/s390/kernel/vdso/Makefile      |  1 +
> > > >  arch/x86/entry/vdso/vdso64/Makefile |  2 +-
> > > >  init/Kconfig                        |  7 +++++++
> > > >  lib/vdso/getrandom.c                | 19 +++++++++++++++++--
> > > >  8 files changed, 30 insertions(+), 4 deletions(-)
> > > >
> > > > diff --git a/arch/arm64/kernel/vdso/Makefile b/arch/arm64/kernel/vdso/Makefile
> > > > index 7dec05dd33b7..f6619e1cb2ce 100644
> > > > --- a/arch/arm64/kernel/vdso/Makefile
> > > > +++ b/arch/arm64/kernel/vdso/Makefile
> > > > @@ -41,7 +41,7 @@ CC_FLAGS_REMOVE_VDSO := $(CC_FLAGS_FTRACE) -Os $(CC_FLAGS_SCS) \
> > > >                         $(CC_FLAGS_LTO) $(CC_FLAGS_CFI) \
> > > >                         -Wmissing-prototypes -Wmissing-declarations
> > > >
> > > > -CC_FLAGS_ADD_VDSO := -O2 -mcmodel=tiny -fasynchronous-unwind-tables
> > > > +CC_FLAGS_ADD_VDSO := -O2 -mcmodel=tiny -fasynchronous-unwind-tables $(CONFIG_CC_OPT_INLINE_MEMSET)
> > > >
> > > >  CFLAGS_REMOVE_vgettimeofday.o = $(CC_FLAGS_REMOVE_VDSO)
> > > >  CFLAGS_REMOVE_vgetrandom.o = $(CC_FLAGS_REMOVE_VDSO)
> > > > diff --git a/arch/loongarch/vdso/Makefile b/arch/loongarch/vdso/Makefile
> > > > index 9c9181bb4071..0b84892d084b 100644
> > > > --- a/arch/loongarch/vdso/Makefile
> > > > +++ b/arch/loongarch/vdso/Makefile
> > > > @@ -16,6 +16,7 @@ ccflags-vdso := \
> > > >         $(filter -m64,$(KBUILD_CFLAGS)) \
> > > >         $(filter -march=%,$(KBUILD_CFLAGS)) \
> > > >         $(filter -m%-float,$(KBUILD_CFLAGS)) \
> > > > +       $(CONFIG_CC_OPT_INLINE_MEMSET) \
> > > >         $(CLANG_FLAGS) \
> > > >         -D__VDSO__
> > > >
> > > > diff --git a/arch/powerpc/kernel/vdso/Makefile b/arch/powerpc/kernel/vdso/Makefile
> > > > index 368759f81708..0d1a49529885 100644
> > > > --- a/arch/powerpc/kernel/vdso/Makefile
> > > > +++ b/arch/powerpc/kernel/vdso/Makefile
> > > > @@ -43,6 +43,7 @@ ccflags-y := -fno-common -fno-builtin -DBUILD_VDSO
> > > >  ccflags-y += $(DISABLE_LATENT_ENTROPY_PLUGIN)
> > > >  ccflags-y += $(call cc-option, -fno-stack-protector)
> > > >  ccflags-y += -DDISABLE_BRANCH_PROFILING
> > > > +ccflags-y += $(CONFIG_CC_OPT_INLINE_MEMSET)
> > > >  ccflags-y += -ffreestanding -fasynchronous-unwind-tables
> > > >  ccflags-remove-y := $(CC_FLAGS_FTRACE)
> > > >  ldflags-y := -Wl,--hash-style=both -nostdlib -shared -z noexecstack $(CLANG_FLAGS)
> > > > diff --git a/arch/riscv/kernel/vdso/Makefile b/arch/riscv/kernel/vdso/Makefile
> > > > index 8dbf2532a573..c023046a3fd7 100644
> > > > --- a/arch/riscv/kernel/vdso/Makefile
> > > > +++ b/arch/riscv/kernel/vdso/Makefile
> > > > @@ -36,6 +36,7 @@ endif
> > > >  ccflags-y := -fno-stack-protector
> > > >  ccflags-y += -DDISABLE_BRANCH_PROFILING
> > > >  ccflags-y += -fno-builtin
> > > > +ccflags-y += $(CONFIG_CC_OPT_INLINE_MEMSET)
> > > >  ccflags-y += $(KBUILD_BASE_ISA)$(CFI_MARCH)
> > > >  ccflags-y += $(CFI_FULL)
> > > >  asflags-y += $(KBUILD_BASE_ISA)$(CFI_MARCH)
> > > > diff --git a/arch/s390/kernel/vdso/Makefile b/arch/s390/kernel/vdso/Makefile
> > > > index 35c834b895ec..54bcf2984ca1 100644
> > > > --- a/arch/s390/kernel/vdso/Makefile
> > > > +++ b/arch/s390/kernel/vdso/Makefile
> > > > @@ -29,6 +29,7 @@ KBUILD_CFLAGS_VDSO := $(filter-out -munaligned-symbols,$(KBUILD_CFLAGS_VDSO))
> > > >  KBUILD_CFLAGS_VDSO := $(filter-out -fno-asynchronous-unwind-tables,$(KBUILD_CFLAGS_VDSO))
> > > >  KBUILD_CFLAGS_VDSO += -fPIC -fno-common -fno-builtin -fasynchronous-unwind-tables
> > > >  KBUILD_CFLAGS_VDSO += -fno-stack-protector $(DISABLE_KSTACK_ERASE)
> > > > +KBUILD_CFLAGS_VDSO += $(CONFIG_CC_OPT_INLINE_MEMSET)
> > > >  ldflags-y := -shared -soname=linux-vdso.so.1 \
> > > >              --hash-style=both --build-id=sha1 \
> > > >              $(call ld-option, --eh-frame-hdr) -T
> > > > diff --git a/arch/x86/entry/vdso/vdso64/Makefile b/arch/x86/entry/vdso/vdso64/Makefile
> > > > index 7c0790065b5e..c2353a065279 100644
> > > > --- a/arch/x86/entry/vdso/vdso64/Makefile
> > > > +++ b/arch/x86/entry/vdso/vdso64/Makefile
> > > > @@ -14,7 +14,7 @@ vobjs-$(CONFIG_X86_SGX)                       += vsgx.o
> > > >  vobjs-$(CONFIG_FUTEX_ROBUST_UNLOCK)    += vfutex.o
> > > >
> > > >  # Compilation flags
> > > > -flags-y                                := -DBUILD_VDSO64 -m64 -mcmodel=small
> > > > +flags-y                                := -DBUILD_VDSO64 -m64 -mcmodel=small $(CONFIG_CC_OPT_INLINE_MEMSET)
> > > >
> > > >  # The location of this include matters!
> > > >  include $(src)/../common/Makefile.include
> > > > diff --git a/init/Kconfig b/init/Kconfig
> > > > index 8583d9f06c52..ff3f8475dd2f 100644
> > > > --- a/init/Kconfig
> > > > +++ b/init/Kconfig
> > > > @@ -173,6 +173,13 @@ config CC_HAS_ALLOC_TOKEN
> > > >  config CC_HAS_MULTIDIMENSIONAL_NONSTRING
> > > >         def_bool $(success,echo 'char tag[][4] __attribute__((__nonstring__)) = { };' | $(CC) $(CLANG_FLAGS) -x c - -c -o /dev/null -Werror)
> > > >
> > > > +config CC_HAS_OPT_INLINE_MEMSET
> > > > +       def_bool $(cc-option,-finline-stringops=memset)
> > > > +
> > > > +config CC_OPT_INLINE_MEMSET
> > > > +       string
> > > > +       default "-finline-stringops=memset" if CC_HAS_OPT_INLINE_MEMSET
> > > > +
> > > >  config LD_CAN_USE_KEEP_IN_OVERLAY
> > > >         # ld.lld prior to 21.0.0 did not support KEEP within an overlay description
> > > >         # https://github.com/llvm/llvm-project/pull/130661
> > > > diff --git a/lib/vdso/getrandom.c b/lib/vdso/getrandom.c
> > > > index 2851afa9154f..f5cad5641985 100644
> > > > --- a/lib/vdso/getrandom.c
> > > > +++ b/lib/vdso/getrandom.c
> > > > @@ -29,6 +29,22 @@
> > > >         }                                                                       \
> > > >  } while (0)
> > > >
> > > > +#if __has_builtin(__builtin_memset_inline)
> > > > +#define memset_inline(dst, value, size) __builtin_memset_inline(dst, value, size)
> > > > +#elif IS_ENABLED(CONFIG_CC_HAS_OPT_INLINE_MEMSET)
> > > > +#define memset_inline(dst, value, size) __builtin_memset(dst, value, size)
> > > > +#else
> > > > +static inline void *memset_inline(void *dst, int value, size_t size)
> > > > +{
> > > > +       char *d = dst;
> > > > +
> > > > +       while (size--)
> > > > +               *d++ = value;
> > > > +
> > > > +       return d;
> > > > +}
> > > > +#endif
> > >
> > > Does this work?
> > > https://godbolt.org/z/Tx6EaGMfb
> >
> > Hmmm...possibly.
> > https://godbolt.org/z/ec9rzd9Yf
> > I don't get it...
> 
> Just keep it under 2 pages, it will be fine:
> https://godbolt.org/z/qqoMqfxev

https://godbolt.org/z/9W9f5a7Wx

Apparently not on RISCV, which is what prompted this patch in the first
place. So I suspect Nathan's v2 here is the way to go.

Jason

_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv

WARNING: multiple messages have this Message-ID (diff)
From: "Jason A. Donenfeld" <Jason@zx2c4.com>
To: Nick Desaulniers <ndesaulniers@google.com>
Cc: Nathan Chancellor <nathan@kernel.org>,
	Andy Lutomirski <luto@kernel.org>,
	Thomas Gleixner <tglx@kernel.org>, Theodore Ts'o <tytso@mit.edu>,
	Vincenzo Frascino <vincenzo.frascino@arm.com>,
	Bill Wendling <morbo@google.com>,
	Justin Stitt <justinstitt@google.com>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Will Deacon <will@kernel.org>,
	Mark Rutland <mark.rutland@arm.com>,
	Huacai Chen <chenhuacai@kernel.org>,
	WANG Xuerui <kernel@xen0n.name>,
	Madhavan Srinivasan <maddy@linux.ibm.com>,
	Michael Ellerman <mpe@ellerman.id.au>,
	Nicholas Piggin <npiggin@gmail.com>,
	"Christophe Leroy (CS GROUP)" <chleroy@kernel.org>,
	Paul Walmsley <pjw@kernel.org>,
	Palmer Dabbelt <palmer@dabbelt.com>,
	Albert Ou <aou@eecs.berkeley.edu>,
	Alexandre Ghiti <alex@ghiti.fr>,
	Heiko Carstens <hca@linux.ibm.com>,
	Vasily Gorbik <gor@linux.ibm.com>,
	Alexander Gordeev <agordeev@linux.ibm.com>,
	Christian Borntraeger <borntraeger@linux.ibm.com>,
	Sven Schnelle <svens@linux.ibm.com>,
	Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
	Dave Hansen <dave.hansen@linux.intel.com>,
	"H. Peter Anvin" <hpa@zytor.com>,
	x86@kernel.org, linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, loongarch@lists.linux.dev,
	linuxppc-dev@lists.ozlabs.org, linux-riscv@lists.infradead.org,
	linux-s390@vger.kernel.org, llvm@lists.linux.dev
Subject: Re: [PATCH v2] random: vDSO: Avoid call to memset() when zeroing reserved in __cvdso_getrandom_data()
Date: Sat, 26 Sep 2026 12:02:26 +0200	[thread overview]
Message-ID: <areYMjNcaqe86ds4@zx2c4.com> (raw)
In-Reply-To: <CAKwvOdmNZL3eFvV3v77GXDzL+XLgz+BT9TA=my0yTnbsHqVeSg@mail.gmail.com>

On Fri, Sep 25, 2026 at 03:00:46PM -0700, Nick Desaulniers wrote:
> On Fri, Sep 25, 2026 at 2:56 PM Nick Desaulniers
> <ndesaulniers@google.com> wrote:
> >
> > On Fri, Sep 25, 2026 at 2:53 PM Nick Desaulniers
> > <ndesaulniers@google.com> wrote:
> > >
> > > On Fri, Sep 25, 2026 at 2:46 PM Nathan Chancellor <nathan@kernel.org> wrote:
> > > >
> > > > After a recent change in LLVM [1], builds with the random vDSO
> > > > implementation, such as PowerPC and RISC-V, fail when checking the vDSO:
> > > >
> > > >   arch/powerpc/kernel/vdso/vdso32.so.dbg: dynamic relocations are not supported
> > > >   arch/riscv/kernel/vdso/vdso.so.dbg: dynamic relocations are not supported
> > > >
> > > > memset() is now generated when zeroing params->reserved for some builds
> > > > because LLVM has an optimization (now run in more instances) that can
> > > > recognize at compile time when it is assigning a static value to a
> > > > contiguous area of memory and turn that into a call to memset(). Both
> > > > clang and GCC assume memset() is always available [2].
> > > >
> > > > clang provides a builtin, __builtin_memset_inline [3][4], that can be
> > > > used to ensure an external function call is not generated when zeroing
> > > > this memory. Use it when it is available.
> > > >
> > > > While GCC has no issues with the current code, it has generated memset()
> > > > before, as seen in commit b7bad082e113 ("random: vDSO: avoid call to out
> > > > of line memset()"). GCC 14 provides '-finline-stringops=memset' [5][6]
> > > > with a similar guarantee to the clang builtin, so use it and
> > > > __builtin_memset() when available.
> > > >
> > > > If no option is available, provide a simple memset_inline() like the one
> > > > from lib/string.c to avoid adding an ugly ifdef.
> > > >
> > > > Link: https://github.com/llvm/llvm-project/commit/90cebef1411617fc3eedd359bdf00cb44b1c2439 [1]
> > > > Link: https://gcc.gnu.org/onlinedocs/gcc-16.2.0/gcc/Standards.html#index-ffreestanding [2]
> > > > Link: https://github.com/llvm/llvm-project/commit/38637ee477541370a90b37f149069d8e5c0c2efd [3]
> > > > Link: https://clang.llvm.org/docs/LanguageExtensions.html#guaranteed-inlined-memset [4]
> > > > Link: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=1ff6d9f7428b0668cd8ab0b3e3ab94f1d733124d [5]
> > > > Link: https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-finline-stringops [6]
> > > > Suggested-by: "Jason A. Donenfeld" <Jason@zx2c4.com>
> > > > Suggested-by: Nick Desaulniers <ndesaulniers@google.com>
> > > > Signed-off-by: Nathan Chancellor <nathan@kernel.org>
> > > > ---
> > > > Changes in v2:
> > > > - Switch approach entirely (Jason, Nick)
> > > >   - clang: use __builtin_memset_inline() to avoid external call
> > > >   - GCC 14+: use __builtin_memset + -finline-stringops=memset (hence the
> > > >     massive CC list increase)
> > > >   - GCC < 14: no issues currently but avoid ifdef with simple memset
> > > >     implementation
> > > > - Link to v1: https://patch.msgid.link/20260916-vdso-getrandom-avoid-memset-llvm-24-v1-1-80a92f2e225a@kernel.org
> > > > ---
> > > >  arch/arm64/kernel/vdso/Makefile     |  2 +-
> > > >  arch/loongarch/vdso/Makefile        |  1 +
> > > >  arch/powerpc/kernel/vdso/Makefile   |  1 +
> > > >  arch/riscv/kernel/vdso/Makefile     |  1 +
> > > >  arch/s390/kernel/vdso/Makefile      |  1 +
> > > >  arch/x86/entry/vdso/vdso64/Makefile |  2 +-
> > > >  init/Kconfig                        |  7 +++++++
> > > >  lib/vdso/getrandom.c                | 19 +++++++++++++++++--
> > > >  8 files changed, 30 insertions(+), 4 deletions(-)
> > > >
> > > > diff --git a/arch/arm64/kernel/vdso/Makefile b/arch/arm64/kernel/vdso/Makefile
> > > > index 7dec05dd33b7..f6619e1cb2ce 100644
> > > > --- a/arch/arm64/kernel/vdso/Makefile
> > > > +++ b/arch/arm64/kernel/vdso/Makefile
> > > > @@ -41,7 +41,7 @@ CC_FLAGS_REMOVE_VDSO := $(CC_FLAGS_FTRACE) -Os $(CC_FLAGS_SCS) \
> > > >                         $(CC_FLAGS_LTO) $(CC_FLAGS_CFI) \
> > > >                         -Wmissing-prototypes -Wmissing-declarations
> > > >
> > > > -CC_FLAGS_ADD_VDSO := -O2 -mcmodel=tiny -fasynchronous-unwind-tables
> > > > +CC_FLAGS_ADD_VDSO := -O2 -mcmodel=tiny -fasynchronous-unwind-tables $(CONFIG_CC_OPT_INLINE_MEMSET)
> > > >
> > > >  CFLAGS_REMOVE_vgettimeofday.o = $(CC_FLAGS_REMOVE_VDSO)
> > > >  CFLAGS_REMOVE_vgetrandom.o = $(CC_FLAGS_REMOVE_VDSO)
> > > > diff --git a/arch/loongarch/vdso/Makefile b/arch/loongarch/vdso/Makefile
> > > > index 9c9181bb4071..0b84892d084b 100644
> > > > --- a/arch/loongarch/vdso/Makefile
> > > > +++ b/arch/loongarch/vdso/Makefile
> > > > @@ -16,6 +16,7 @@ ccflags-vdso := \
> > > >         $(filter -m64,$(KBUILD_CFLAGS)) \
> > > >         $(filter -march=%,$(KBUILD_CFLAGS)) \
> > > >         $(filter -m%-float,$(KBUILD_CFLAGS)) \
> > > > +       $(CONFIG_CC_OPT_INLINE_MEMSET) \
> > > >         $(CLANG_FLAGS) \
> > > >         -D__VDSO__
> > > >
> > > > diff --git a/arch/powerpc/kernel/vdso/Makefile b/arch/powerpc/kernel/vdso/Makefile
> > > > index 368759f81708..0d1a49529885 100644
> > > > --- a/arch/powerpc/kernel/vdso/Makefile
> > > > +++ b/arch/powerpc/kernel/vdso/Makefile
> > > > @@ -43,6 +43,7 @@ ccflags-y := -fno-common -fno-builtin -DBUILD_VDSO
> > > >  ccflags-y += $(DISABLE_LATENT_ENTROPY_PLUGIN)
> > > >  ccflags-y += $(call cc-option, -fno-stack-protector)
> > > >  ccflags-y += -DDISABLE_BRANCH_PROFILING
> > > > +ccflags-y += $(CONFIG_CC_OPT_INLINE_MEMSET)
> > > >  ccflags-y += -ffreestanding -fasynchronous-unwind-tables
> > > >  ccflags-remove-y := $(CC_FLAGS_FTRACE)
> > > >  ldflags-y := -Wl,--hash-style=both -nostdlib -shared -z noexecstack $(CLANG_FLAGS)
> > > > diff --git a/arch/riscv/kernel/vdso/Makefile b/arch/riscv/kernel/vdso/Makefile
> > > > index 8dbf2532a573..c023046a3fd7 100644
> > > > --- a/arch/riscv/kernel/vdso/Makefile
> > > > +++ b/arch/riscv/kernel/vdso/Makefile
> > > > @@ -36,6 +36,7 @@ endif
> > > >  ccflags-y := -fno-stack-protector
> > > >  ccflags-y += -DDISABLE_BRANCH_PROFILING
> > > >  ccflags-y += -fno-builtin
> > > > +ccflags-y += $(CONFIG_CC_OPT_INLINE_MEMSET)
> > > >  ccflags-y += $(KBUILD_BASE_ISA)$(CFI_MARCH)
> > > >  ccflags-y += $(CFI_FULL)
> > > >  asflags-y += $(KBUILD_BASE_ISA)$(CFI_MARCH)
> > > > diff --git a/arch/s390/kernel/vdso/Makefile b/arch/s390/kernel/vdso/Makefile
> > > > index 35c834b895ec..54bcf2984ca1 100644
> > > > --- a/arch/s390/kernel/vdso/Makefile
> > > > +++ b/arch/s390/kernel/vdso/Makefile
> > > > @@ -29,6 +29,7 @@ KBUILD_CFLAGS_VDSO := $(filter-out -munaligned-symbols,$(KBUILD_CFLAGS_VDSO))
> > > >  KBUILD_CFLAGS_VDSO := $(filter-out -fno-asynchronous-unwind-tables,$(KBUILD_CFLAGS_VDSO))
> > > >  KBUILD_CFLAGS_VDSO += -fPIC -fno-common -fno-builtin -fasynchronous-unwind-tables
> > > >  KBUILD_CFLAGS_VDSO += -fno-stack-protector $(DISABLE_KSTACK_ERASE)
> > > > +KBUILD_CFLAGS_VDSO += $(CONFIG_CC_OPT_INLINE_MEMSET)
> > > >  ldflags-y := -shared -soname=linux-vdso.so.1 \
> > > >              --hash-style=both --build-id=sha1 \
> > > >              $(call ld-option, --eh-frame-hdr) -T
> > > > diff --git a/arch/x86/entry/vdso/vdso64/Makefile b/arch/x86/entry/vdso/vdso64/Makefile
> > > > index 7c0790065b5e..c2353a065279 100644
> > > > --- a/arch/x86/entry/vdso/vdso64/Makefile
> > > > +++ b/arch/x86/entry/vdso/vdso64/Makefile
> > > > @@ -14,7 +14,7 @@ vobjs-$(CONFIG_X86_SGX)                       += vsgx.o
> > > >  vobjs-$(CONFIG_FUTEX_ROBUST_UNLOCK)    += vfutex.o
> > > >
> > > >  # Compilation flags
> > > > -flags-y                                := -DBUILD_VDSO64 -m64 -mcmodel=small
> > > > +flags-y                                := -DBUILD_VDSO64 -m64 -mcmodel=small $(CONFIG_CC_OPT_INLINE_MEMSET)
> > > >
> > > >  # The location of this include matters!
> > > >  include $(src)/../common/Makefile.include
> > > > diff --git a/init/Kconfig b/init/Kconfig
> > > > index 8583d9f06c52..ff3f8475dd2f 100644
> > > > --- a/init/Kconfig
> > > > +++ b/init/Kconfig
> > > > @@ -173,6 +173,13 @@ config CC_HAS_ALLOC_TOKEN
> > > >  config CC_HAS_MULTIDIMENSIONAL_NONSTRING
> > > >         def_bool $(success,echo 'char tag[][4] __attribute__((__nonstring__)) = { };' | $(CC) $(CLANG_FLAGS) -x c - -c -o /dev/null -Werror)
> > > >
> > > > +config CC_HAS_OPT_INLINE_MEMSET
> > > > +       def_bool $(cc-option,-finline-stringops=memset)
> > > > +
> > > > +config CC_OPT_INLINE_MEMSET
> > > > +       string
> > > > +       default "-finline-stringops=memset" if CC_HAS_OPT_INLINE_MEMSET
> > > > +
> > > >  config LD_CAN_USE_KEEP_IN_OVERLAY
> > > >         # ld.lld prior to 21.0.0 did not support KEEP within an overlay description
> > > >         # https://github.com/llvm/llvm-project/pull/130661
> > > > diff --git a/lib/vdso/getrandom.c b/lib/vdso/getrandom.c
> > > > index 2851afa9154f..f5cad5641985 100644
> > > > --- a/lib/vdso/getrandom.c
> > > > +++ b/lib/vdso/getrandom.c
> > > > @@ -29,6 +29,22 @@
> > > >         }                                                                       \
> > > >  } while (0)
> > > >
> > > > +#if __has_builtin(__builtin_memset_inline)
> > > > +#define memset_inline(dst, value, size) __builtin_memset_inline(dst, value, size)
> > > > +#elif IS_ENABLED(CONFIG_CC_HAS_OPT_INLINE_MEMSET)
> > > > +#define memset_inline(dst, value, size) __builtin_memset(dst, value, size)
> > > > +#else
> > > > +static inline void *memset_inline(void *dst, int value, size_t size)
> > > > +{
> > > > +       char *d = dst;
> > > > +
> > > > +       while (size--)
> > > > +               *d++ = value;
> > > > +
> > > > +       return d;
> > > > +}
> > > > +#endif
> > >
> > > Does this work?
> > > https://godbolt.org/z/Tx6EaGMfb
> >
> > Hmmm...possibly.
> > https://godbolt.org/z/ec9rzd9Yf
> > I don't get it...
> 
> Just keep it under 2 pages, it will be fine:
> https://godbolt.org/z/qqoMqfxev

https://godbolt.org/z/9W9f5a7Wx

Apparently not on RISCV, which is what prompted this patch in the first
place. So I suspect Nathan's v2 here is the way to go.

Jason

  parent reply	other threads:[~2026-09-26 10:02 UTC|newest]

Thread overview: 75+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-25 21:46 [PATCH v2] random: vDSO: Avoid call to memset() when zeroing reserved in __cvdso_getrandom_data() Nathan Chancellor
2026-09-25 21:46 ` Nathan Chancellor
2026-09-25 21:53 ` Nick Desaulniers
2026-09-25 21:53   ` Nick Desaulniers
2026-09-25 21:56   ` Nick Desaulniers
2026-09-25 21:56     ` Nick Desaulniers
2026-09-25 22:00     ` Nick Desaulniers
2026-09-25 22:00       ` Nick Desaulniers
2026-09-25 22:19       ` Nathan Chancellor
2026-09-25 22:19         ` Nathan Chancellor
2026-09-26  6:34       ` Christophe Leroy (CS GROUP)
2026-09-26  6:34         ` Christophe Leroy (CS GROUP)
2026-09-26 10:02       ` Jason A. Donenfeld [this message]
2026-09-26 10:02         ` Jason A. Donenfeld
2026-09-26 10:55         ` Christophe Leroy (CS GROUP)
2026-09-26 10:55           ` Christophe Leroy (CS GROUP)
2026-09-26 12:29           ` Jason A. Donenfeld
2026-09-26 12:29             ` Jason A. Donenfeld
2026-09-29 18:24             ` Nick Desaulniers
2026-09-29 18:24               ` Nick Desaulniers
2026-09-30 13:38               ` Nathan Chancellor
2026-09-30 13:38                 ` Nathan Chancellor
2026-09-30 14:21                 ` Jason A. Donenfeld
2026-09-30 14:21                   ` Jason A. Donenfeld
2026-09-30 14:44                   ` Jason A. Donenfeld
2026-09-30 14:44                     ` Jason A. Donenfeld
2026-09-30 15:13                     ` Nathan Chancellor
2026-09-30 15:13                       ` Nathan Chancellor
2026-09-30 15:16                       ` Jason A. Donenfeld
2026-09-30 15:16                         ` Jason A. Donenfeld
2026-10-01  4:41                         ` Christophe Leroy (CS GROUP)
2026-10-01  4:41                           ` Christophe Leroy (CS GROUP)
2026-10-01  9:25                           ` Jason A. Donenfeld
2026-10-01  9:25                             ` Jason A. Donenfeld
2026-10-01 10:20                             ` Nathan Chancellor
2026-10-01 10:20                               ` Nathan Chancellor
2026-10-01 10:48                               ` Jason A. Donenfeld
2026-10-01 10:48                                 ` Jason A. Donenfeld
2026-10-01 11:03                                 ` Nathan Chancellor
2026-10-01 11:03                                   ` Nathan Chancellor
2026-10-02  9:49                                   ` Nathan Chancellor
2026-10-02  9:49                                     ` Nathan Chancellor
2026-10-02 10:13                                     ` Jason A. Donenfeld
2026-10-02 10:13                                       ` Jason A. Donenfeld
2026-10-02 18:21                                       ` Christophe Leroy (CS GROUP)
2026-10-02 18:21                                         ` Christophe Leroy (CS GROUP)
2026-10-02  9:18                                 ` Christophe Leroy (CS GROUP)
2026-10-02  9:18                                   ` Christophe Leroy (CS GROUP)
2026-10-02  9:27                                   ` Jason A. Donenfeld
2026-10-02  9:27                                     ` Jason A. Donenfeld
2026-09-26 12:39           ` Nathan Chancellor
2026-09-26 12:39             ` Nathan Chancellor
2026-09-25 21:56 ` sashiko-bot
2026-09-26  9:39 ` Andreas Schwab
2026-09-26  9:39   ` Andreas Schwab
2026-09-26 12:19   ` Nathan Chancellor
2026-09-26 12:19     ` Nathan Chancellor
2026-09-26 12:32     ` Jason A. Donenfeld
2026-09-26 12:32       ` Jason A. Donenfeld
2026-09-26 12:49       ` Nathan Chancellor
2026-09-26 12:49         ` Nathan Chancellor
2026-09-27  7:02       ` David Laight
2026-09-27  7:02         ` David Laight
2026-09-29 16:59         ` Nathan Chancellor
2026-09-29 16:59           ` Nathan Chancellor
2026-09-29 17:44           ` David Laight
2026-09-29 17:44             ` David Laight
2026-10-02 10:57 ` Christophe Leroy (CS GROUP)
2026-10-02 10:57   ` Christophe Leroy (CS GROUP)
2026-10-02 10:58   ` Jason A. Donenfeld
2026-10-02 10:58     ` Jason A. Donenfeld
2026-10-02 11:01     ` LEROY Christophe
2026-10-02 11:01       ` LEROY Christophe
2026-10-02 11:02     ` Christophe Leroy (CS GROUP)
2026-10-02 11:02       ` Christophe Leroy (CS GROUP)

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=areYMjNcaqe86ds4@zx2c4.com \
    --to=jason@zx2c4.com \
    --cc=agordeev@linux.ibm.com \
    --cc=alex@ghiti.fr \
    --cc=aou@eecs.berkeley.edu \
    --cc=borntraeger@linux.ibm.com \
    --cc=bp@alien8.de \
    --cc=catalin.marinas@arm.com \
    --cc=chenhuacai@kernel.org \
    --cc=chleroy@kernel.org \
    --cc=dave.hansen@linux.intel.com \
    --cc=gor@linux.ibm.com \
    --cc=hca@linux.ibm.com \
    --cc=hpa@zytor.com \
    --cc=justinstitt@google.com \
    --cc=kernel@xen0n.name \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-riscv@lists.infradead.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=llvm@lists.linux.dev \
    --cc=loongarch@lists.linux.dev \
    --cc=luto@kernel.org \
    --cc=maddy@linux.ibm.com \
    --cc=mark.rutland@arm.com \
    --cc=mingo@redhat.com \
    --cc=morbo@google.com \
    --cc=mpe@ellerman.id.au \
    --cc=nathan@kernel.org \
    --cc=ndesaulniers@google.com \
    --cc=npiggin@gmail.com \
    --cc=palmer@dabbelt.com \
    --cc=pjw@kernel.org \
    --cc=svens@linux.ibm.com \
    --cc=tglx@kernel.org \
    --cc=tytso@mit.edu \
    --cc=vincenzo.frascino@arm.com \
    --cc=will@kernel.org \
    --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.