Hi Alice
On Fri, Jun 28, 2024 at 9:24 PM Alice Ryhl wrote:
>
> Add just enough support for static key so that we can use it from
> tracepoints. Tracepoints rely on `static_key_false` even though it is
> deprecated, so we add the same functionality to Rust.
>
> It is not possible to use the existing C implementation of
> arch_static_branch because it passes the argument `key` to inline
> assembly as an 'i' parameter, so any attempt to add a C helper for this
> function will fail to compile because the value of `key` must be known
> at compile-time.
>
> Signed-off-by: Alice Ryhl
> ---
> 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(-)
>
> diff --git a/rust/kernel/arch/arm64/jump_label.rs
> b/rust/kernel/arch/arm64/jump_label.rs
> new file mode 100644
> index ..5eede2245718
> --- /dev/null
> +++ b/rust/kernel/arch/arm64/jump_label.rs
> @@ -0,0 +1,34 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +// Copyright (C) 2024 Google LLC.
> +
> +//! Arm64 Rust implementation of jump_label.h
> +
> +/// arm64 implementation of arch_static_branch
> +#[macro_export]
> +#[cfg(target_arch = "aarch64")]
> +macro_rules! arch_static_branch {
> +($key:path, $keytyp:ty, $field:ident, $branch:expr) => {'my_label: {
> +core::arch::asm!(
> +r#"
> +1: nop
> +
> +.pushsection __jump_table, "aw"
> +.align 3
> +.long 1b - ., {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;
> +}};
> +}
> +
> +pub use arch_static_branch;
> diff --git a/rust/kernel/arch/loongarch/jump_label.rs
> b/rust/kernel/arch/loongarch/jump_label.rs
> new file mode 100644
> index ..8d31318aeb11
> --- /dev/null
> +++ b/rust/kernel/arch/loongarch/jump_label.rs
> @@ -0,0 +1,35 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +// Copyright (C) 2024 Google LLC.
> +
> +//! Loongarch Rust implementation of jump_label.h
> +
> +/// loongarch implementation of arch_static_branch
> +#[doc(hidden)]
> +#[macro_export]
> +#[cfg(target_arch = "loongarch64")]
> +macro_rules! arch_static_branch {
> +($key:path, $keytyp:ty, $field:ident, $branch:expr) => {'my_label: {
> +core::arch::asm!(
> +r#"
> +1: nop
> +
> +.pushsection __jump_table, "aw"
> +.align 3
> +.long 1b - ., {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;
> +}};
> +}
I have tested these patches on LoongArch and it works as expected.
Tested-by: WANG Rui
Thanks,
-Rui
> +
> +pub use arch_static_branch;
> diff --git a/rust/kernel/arch/mod.rs b/rust/kernel/arch/mod.rs
> new file mode 100644
> index ..14271d2530e9
> --- /dev/null
> +++ b/rust/kernel/arch/mod.rs
> @@ -0,0 +1,24 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +// Copyright (C) 2024 Google LLC.
> +
> +//! Architecture specific code.
> +
> +#[cfg_attr(target_arch = "aarch64", path = "arm64")]
> +#[cfg_attr(target_arch = "x86_64", path = "x86")]
> +#[cfg_attr(target_arch = "loongarch64", path = "loongarch")]
> +#[cfg_attr(target_arch = "riscv64", path = "riscv")]
> +mod inner {
> +pub mod jump_label;
> +}
> +
> +pub use self::inner::*;
> +
> +/// A helper used by inline assembly to pass a boolean to as a `const`
> parameter.
> +///
> +/// Using this function instead of a cast lets you assert that the input is
> a boolean, rather than
> +/// some other type that can be cast to an integer.
> +#[doc(hidden)]
> +pub const fn bool_to_int(b: bool) -> i32 {
> +b as i32
> +}
> diff --git a/rust/kernel/arch/riscv/jump_label.rs
> b/rust/kernel/arch/riscv/jump_label.rs
> new file mode 100644
> index ..2672e0c6f033
> --- /dev/null
> +++ b/rust/kernel/arch/riscv/jump_label.rs
> @@ -0,0 +1,38 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +// Copyright (C)