Re: [PATCH 3/3] jump_label: make initial NOP patching the special case

Ard Biesheuvel
2022-06-15T09:59:19Z

On Wed, 15 Jun 2022 at 11:52, Mark Rutland <mark.rutland@arm.com> wrote:
>
> On Wed, Jun 08, 2022 at 12:45:12PM +0200, Ard Biesheuvel wrote:
> > Instead of defaulting to patching NOP opcodes at init time, and leaving
> > it to the architectures to override this if this is not needed, switch
> > to a model where doing nothing is the default. This is the common case
> > by far, as only MIPS requires NOP patching at init time. On all other
> > architectures, the correct encodings are emitted by the compiler and so
> > no initial patching is needed.
> >
> > Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
> > ---
> > Documentation/staging/static-keys.rst | 3 ---
> > arch/arc/kernel/jump_label.c | 13 -------------
> > arch/arm/kernel/jump_label.c | 6 ------
> > arch/arm64/kernel/jump_label.c | 11 -----------
> > arch/mips/include/asm/jump_label.h | 2 ++
> > arch/parisc/kernel/jump_label.c | 11 -----------
> > arch/riscv/kernel/jump_label.c | 12 ------------
> > arch/s390/kernel/jump_label.c | 5 -----
> > arch/x86/kernel/jump_label.c | 13 -------------
> > kernel/jump_label.c | 14 +++-----------
> > 10 files changed, 5 insertions(+), 85 deletions(-)
>
> I have one minor comment below, but either way this is a nice cleanup (and I'm
> always happy to see __weak functions disappear), so FWIW:
>
> Acked-by: Mark Rutland <mark.rutland@arm.com>
>
> [...]
>
> > diff --git a/kernel/jump_label.c b/kernel/jump_label.c
> > index b1ac2948be79..ff8576c00893 100644
> > --- a/kernel/jump_label.c
> > +++ b/kernel/jump_label.c
> > @@ -332,17 +332,9 @@ static int __jump_label_text_reserved(struct jump_entry *iter_start,
> > return 0;
> > }
> >
> > -/*
> > - * Update code which is definitely not currently executing.
> > - * Architectures which need heavyweight synchronization to modify
> > - * running code can override this to make the non-live update case
> > - * cheaper.
> > - */
> > -void __weak __init_or_module arch_jump_label_transform_static(struct jump_entry *entry,
> > - enum jump_label_type type)
> > -{
> > - arch_jump_label_transform(entry, type);
> > -}
> > +#ifndef arch_jump_label_transform_static
> > +#define arch_jump_label_transform_static(entry, type)
> > +#endif
>
> It might be slightly better to make this a static inline stub so that we always
> get the compiler to type-check it, e.g.
>
> | #ifndef arch_jump_label_transform_static
> | static inline void arch_jump_label_transform_static(struct jump_entry *entry,
> | enum jump_label_type type)
> | {
> | /* nothing to do on most architectures */
> | }
> | #define arch_jump_label_transform_static arch_jump_label_transform_static
> | #endif
>

Yeah, good point. Note that the current patch is broken because of
this, as the empty string is not a statement, and so the if binds to
the following line (I got a couple of bot warnings about this)