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 | org.kernel.vger.linux-hexagon,dev.linux.lists.loongarch,org.infradead.lists.linux-riscv,org.infradead.lists.linux-snps-arc,org.infradead.lists.linux-um,org.kernel.vger.linux-alpha,org.kernel.vger.linux-arch,org.kernel.vger.linux-csky,org.kernel.vger.linux-doc,org.kernel.vger.linux-kernel,org.kernel.vger.linux-m68k,org.kernel.vger.linux-mips,org.kernel.vger.linux-openrisc,org.kernel.vger.linux-parisc,org.kernel.vger.linux-s390,org.kernel.vger.linux-sh,org.kernel.vger.sparclinux,org.ozlabs.lists.linuxppc-dev |
|---|---|
| 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]>