Re: [patch 02/18] randomize_kstack: Provide add_random_kstack_offset_irqsoff()

Radu Rendec <[email protected]> Wed, 08 Jul 2026 13:24:33 -0400
Newsgroups gmane.linux.ports.mips,gmane.linux.kernel,gmane.linux.ports.ppc64.devel,gmane.linux.ports.riscv,gmane.linux.ports.arm.kernel,gmane.linux.ports.alpha,gmane.linux.ports.parisc,gmane.linux.ports.sh.devel,gmane.linux.uml.devel,gmane.linux.kernel.arc,gmane.linux.ports.hexagon,gmane.linux.ports.sparc,gmane.linux.kernel.cross-arch,gmane.linux.documentation
Message-ID <[email protected]>
On Tue, 2026-07-07 at 21:06 +0200, Thomas Gleixner wrote:
> add_random_kstack_offset() uses get/put_cpu_var() which is pointless
> overhead when it is invoked from low level entry code with interrupts
> disabled.
>=20
> Provide a irqsoff() variant, which avoids that.
>=20
> Signed-off-by: Thomas Gleixner <[email protected]>
> Cc: Kees Cook <[email protected]>
> ---
> =C2=A0include/linux/randomize_kstack.h |=C2=A0=C2=A0 19 +++++++++++++++++=
++
> =C2=A01 file changed, 19 insertions(+)
>=20
> --- a/include/linux/randomize_kstack.h
> +++ b/include/linux/randomize_kstack.h
> @@ -77,8 +77,27 @@ static __always_inline u32 get_kstack_of
> =C2=A0	}								\
> =C2=A0} while (0)
> =C2=A0
> +/**
> + * add_random_kstack_offset_irqsoff - Increase stack utilization by a ra=
ndom offset.
> + *
> + * This should be used in the syscall entry path after user registers ha=
ve been
> + * stored to the stack. Interrupts must be still disabled.
> + */
> +#define add_random_kstack_offset_irqsoff()					\
> +do {										\
> +	lockdep_assert_irqs_disabled();						\
> +	if (static_branch_maybe(CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT,		\
> +				&randomize_kstack_offset)) {			\
> +		u32 offset =3D prandom_u32_state(raw_cpu_ptr(&kstack_rnd_state));	\
> +		u8 *ptr =3D __kstack_alloca(KSTACK_OFFSET_MAX(offset));		\
> +		/* Keep allocation even after "ptr" loses scope. */		\
> +		asm volatile("" :: "r"(ptr) : "memory");			\
> +	}									\
> +} while (0)
> +
> =C2=A0#else /* CONFIG_RANDOMIZE_KSTACK_OFFSET */
> =C2=A0#define add_random_kstack_offset()		do { } while (0)
> +#define add_random_kstack_offset_irqsoff()	do { } while (0)
> =C2=A0#endif /* CONFIG_RANDOMIZE_KSTACK_OFFSET */
> =C2=A0
> =C2=A0#endif

Reviewed-by: Radu Rendec <[email protected]>