Re: [PATCH] random: vDSO: Avoid call to memset() when zeroing reserved in __cvdso_getrandom_data()
From: Nick Desaulniers
Date: Wed Sep 16 2026 - 18:09:15 EST
On Wed, Sep 16, 2026 at 2:59 PM Nathan Chancellor <nathan@xxxxxxxxxx> wrote:
>
> After a recent change in LLVM [1], RISC-V builds fail when checking the
> vDSO:
>
> arch/riscv/kernel/vdso/vdso.so.dbg: dynamic relocations are not supported
> make[4]: *** [arch/riscv/kernel/vdso/Makefile:78: arch/riscv/kernel/vdso/vdso.so.dbg] Error 1
>
> memset() is now generated when zeroing params->reserved 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].
>
> Hide the value of the iterator variable from the optimizer using
> OPTIMIZER_HIDE_VAR to inhibit this optimization since it can no longer
> assume that the zeroing is contiguous.
>
> 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]
> Signed-off-by: Nathan Chancellor <nathan@xxxxxxxxxx>
Link: https://github.com/ClangBuiltLinux/linux/issues/2183
Do we need to tag stable (I imagine this might be visible for older
kernels with newer llvm)?
Any idea why we only see this for riscv? Would think loop idiom
recognition would make this transform for any target.
Reviewed-by: Nick Desaulniers <ndesaulniers@xxxxxxxxxx>
> ---
> lib/vdso/getrandom.c | 6 +++++-
> 1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/lib/vdso/getrandom.c b/lib/vdso/getrandom.c
> index 2851afa9154f..d48d1fdb3351 100644
> --- a/lib/vdso/getrandom.c
> +++ b/lib/vdso/getrandom.c
> @@ -4,6 +4,7 @@
> */
>
> #include <linux/array_size.h>
> +#include <linux/compiler.h>
> #include <linux/minmax.h>
> #include <vdso/datapage.h>
> #include <vdso/getrandom.h>
> @@ -83,8 +84,11 @@ __cvdso_getrandom_data(const struct vdso_rng_data *rng_info, void *buffer, size_
> params->size_of_opaque_state = sizeof(*state);
> params->mmap_prot = PROT_READ | PROT_WRITE;
> params->mmap_flags = MAP_DROPPABLE | MAP_ANONYMOUS;
> - for (size_t i = 0; i < ARRAY_SIZE(params->reserved); ++i)
> + for (size_t i = 0; i < ARRAY_SIZE(params->reserved); ++i) {
> + /* prevent compiler from turning loop into memset() */
> + OPTIMIZER_HIDE_VAR(i);
> params->reserved[i] = 0;
> + }
> return 0;
> }
>
>
> ---
> base-commit: cee9395acd8043be0644b25c34bfa86623f2b935
> change-id: 20260916-vdso-getrandom-avoid-memset-llvm-24-74d45fa6031e
>
> Best regards,
> --
> Cheers,
> Nathan
>
--
Thanks,
~Nick Desaulniers