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

2024-06-30 Thread hev
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) 

[PATCH v4 1/2] rust: add static_key_false

2024-06-28 Thread Alice Ryhl
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;
+}};
+}
+
+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) 2024 Google LLC.
+
+//! RiscV Rust implementation of jump_label.h
+
+/// riscv implementation of arch_static_branch
+#[macro_export]
+#[cfg(target_arch = "riscv64")]
+macro_rules! arch_static_branch {
+($key:path, $keytyp:ty, $field:ident, $branch:expr) => {'my_label: {
+core::arch::asm!(
+r#"
+.align  2
+.option push
+.option norelax
+.option norvc
+1: nop
+