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

From: Mark Rutland
Date: Wed Jun 15 2022 - 05:52:55 EST


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@xxxxxxxxxx>
> ---
> 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@xxxxxxx>

[...]

> 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

Mark.