Re: [PATCH v4 1/2] rust: add static_key_false

From: Peter Zijlstra
Date: Wed Jul 31 2024 - 13:05:43 EST


On Fri, Jun 28, 2024 at 01:23:31PM +0000, Alice Ryhl wrote:

> rust/kernel/arch/arm64/jump_label.rs | 34 ++++++++++++++++++++++++++++
> rust/kernel/arch/loongarch/jump_label.rs | 35 +++++++++++++++++++++++++++++
> rust/kernel/arch/mod.rs | 24 ++++++++++++++++++++
> rust/kernel/arch/riscv/jump_label.rs | 38 ++++++++++++++++++++++++++++++++
> rust/kernel/arch/x86/jump_label.rs | 35 +++++++++++++++++++++++++++++
> rust/kernel/lib.rs | 2 ++
> rust/kernel/static_key.rs | 32 +++++++++++++++++++++++++++
> scripts/Makefile.build | 2 +-
> 8 files changed, 201 insertions(+), 1 deletion(-)

So I really find the amount of duplicated asm offensive. Is is far too
easy for any of this to get out of sync.

> diff --git a/rust/kernel/arch/x86/jump_label.rs b/rust/kernel/arch/x86/jump_label.rs
> new file mode 100644
> index 000000000000..383bed273c50
> --- /dev/null
> +++ b/rust/kernel/arch/x86/jump_label.rs
> @@ -0,0 +1,35 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +// Copyright (C) 2024 Google LLC.
> +
> +//! X86 Rust implementation of jump_label.h
> +
> +/// x86 implementation of arch_static_branch
> +#[macro_export]
> +#[cfg(target_arch = "x86_64")]
> +macro_rules! arch_static_branch {
> + ($key:path, $keytyp:ty, $field:ident, $branch:expr) => {'my_label: {
> + core::arch::asm!(
> + r#"
> + 1: .byte 0x0f,0x1f,0x44,0x00,0x00
> +
> + .pushsection __jump_table, "aw"
> + .balign 8
> + .long 1b - .
> + .long {0} - .
> + .quad {1} + {2} + {3} - .
> + .popsection
> + "#,
> + label {
> + break 'my_label true;
> + },
> + sym $key,
> + const ::core::mem::offset_of!($keytyp, $field),
> + const $crate::arch::bool_to_int($branch),
> + );
> +
> + break 'my_label false;
> + }};
> +}

Note that this uses the forced 5 byte version, and not the dynamic sized
one. On top of that it hard-codes the nop5 string :/

Please work harder to not have to duplicate stuff like this.

NAK.