* [PATCH v4 1/2] rust: add static_key_false
@ 2024-06-28 13:23 ` Alice Ryhl
0 siblings, 0 replies; 26+ messages in thread
From: Alice Ryhl @ 2024-06-28 13:23 UTC (permalink / raw)
To: Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers,
Peter Zijlstra, Josh Poimboeuf, Jason Baron, Ard Biesheuvel,
Miguel Ojeda, Alex Gaynor, Wedson Almeida Filho, Boqun Feng,
Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg
Cc: linux-trace-kernel, rust-for-linux, linux-kernel, Arnd Bergmann,
linux-arch, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H. Peter Anvin, Peter Zijlstra (Intel),
Sean Christopherson, Uros Bizjak, Catalin Marinas, Will Deacon,
Marc Zyngier, Oliver Upton, Mark Rutland, Ryan Roberts,
Fuad Tabba, linux-arm-kernel, Paul Walmsley, Palmer Dabbelt,
Albert Ou, Anup Patel, Andrew Jones, Alexandre Ghiti,
Conor Dooley, Samuel Holland, linux-riscv, Huacai Chen,
WANG Xuerui, Bibo Mao, Tiezhu Yang, Andrew Morton, Tianrui Zhao,
loongarch, 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 <aliceryhl@google.com>
---
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 000000000000..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 000000000000..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 000000000000..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 000000000000..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
+ .option pop
+ .pushsection __jump_table, "aw"
+ .align 3
+ .long 1b - ., {0} - .
+ .dword {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/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;
+ }};
+}
+
+pub use arch_static_branch;
diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs
index fbd91a48ff8b..fffd4e1dd1c1 100644
--- a/rust/kernel/lib.rs
+++ b/rust/kernel/lib.rs
@@ -27,6 +27,7 @@
extern crate self as kernel;
pub mod alloc;
+pub mod arch;
mod build_assert;
pub mod error;
pub mod init;
@@ -38,6 +39,7 @@
pub mod prelude;
pub mod print;
mod static_assert;
+pub mod static_key;
#[doc(hidden)]
pub mod std_vendor;
pub mod str;
diff --git a/rust/kernel/static_key.rs b/rust/kernel/static_key.rs
new file mode 100644
index 000000000000..32cf027ef091
--- /dev/null
+++ b/rust/kernel/static_key.rs
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: GPL-2.0
+
+// Copyright (C) 2024 Google LLC.
+
+//! Logic for static keys.
+
+use crate::bindings::*;
+
+/// Branch based on a static key.
+///
+/// Takes three arguments:
+///
+/// * `key` - the path to the static variable containing the `static_key`.
+/// * `keytyp` - the type of `key`.
+/// * `field` - the name of the field of `key` that contains the `static_key`.
+#[macro_export]
+macro_rules! static_key_false {
+ ($key:path, $keytyp:ty, $field:ident) => {{
+ // Assert that `$key` has type `$keytyp` and that `$key.$field` has type `static_key`.
+ //
+ // SAFETY: We know that `$key` is a static because otherwise the inline assembly will not
+ // compile. The raw pointers created in this block are in-bounds of `$key`.
+ static _TY_ASSERT: () = unsafe {
+ let key: *const $keytyp = ::core::ptr::addr_of!($key);
+ let _: *const $crate::bindings::static_key = ::core::ptr::addr_of!((*key).$field);
+ };
+
+ $crate::arch::jump_label::arch_static_branch! { $key, $keytyp, $field, false }
+ }};
+}
+
+pub use static_key_false;
diff --git a/scripts/Makefile.build b/scripts/Makefile.build
index efacca63c897..60197c1c063f 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -263,7 +263,7 @@ $(obj)/%.lst: $(obj)/%.c FORCE
# Compile Rust sources (.rs)
# ---------------------------------------------------------------------------
-rust_allowed_features := new_uninit
+rust_allowed_features := asm_const,asm_goto,new_uninit
# `--out-dir` is required to avoid temporaries being created by `rustc` in the
# current working directory, which may be not accessible in the out-of-tree
--
2.45.2.803.g4e1b14247a-goog
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 26+ messages in thread* Re: [PATCH v4 1/2] rust: add static_key_false
2024-06-28 13:23 ` Alice Ryhl
@ 2024-06-30 6:00 ` hev
-1 siblings, 0 replies; 26+ messages in thread
From: hev @ 2024-06-30 6:00 UTC (permalink / raw)
To: Alice Ryhl
Cc: Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers,
Peter Zijlstra, Josh Poimboeuf, Jason Baron, Ard Biesheuvel,
Miguel Ojeda, Alex Gaynor, Wedson Almeida Filho, Boqun Feng,
Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg,
linux-trace-kernel, rust-for-linux, linux-kernel, Arnd Bergmann,
linux-arch, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H. Peter Anvin, Peter Zijlstra (Intel),
Sean Christopherson, Uros Bizjak, Catalin Marinas, Will Deacon,
Marc Zyngier, Oliver Upton, Mark Rutland, Ryan Roberts,
Fuad Tabba, linux-arm-kernel, Paul Walmsley, Palmer Dabbelt,
Albert Ou, Anup Patel, Andrew Jones, Alexandre Ghiti,
Conor Dooley, Samuel Holland, linux-riscv, Huacai Chen,
WANG Xuerui, Bibo Mao, Tiezhu Yang, Andrew Morton, Tianrui Zhao,
loongarch
Hi Alice
On Fri, Jun 28, 2024 at 9:24 PM Alice Ryhl <aliceryhl@google.com> 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 <aliceryhl@google.com>
> ---
> 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 000000000000..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 000000000000..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 <wangrui@loongson.cn>
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 000000000000..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 000000000000..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
> + .option pop
> + .pushsection __jump_table, "aw"
> + .align 3
> + .long 1b - ., {0} - .
> + .dword {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/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;
> + }};
> +}
> +
> +pub use arch_static_branch;
> diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs
> index fbd91a48ff8b..fffd4e1dd1c1 100644
> --- a/rust/kernel/lib.rs
> +++ b/rust/kernel/lib.rs
> @@ -27,6 +27,7 @@
> extern crate self as kernel;
>
> pub mod alloc;
> +pub mod arch;
> mod build_assert;
> pub mod error;
> pub mod init;
> @@ -38,6 +39,7 @@
> pub mod prelude;
> pub mod print;
> mod static_assert;
> +pub mod static_key;
> #[doc(hidden)]
> pub mod std_vendor;
> pub mod str;
> diff --git a/rust/kernel/static_key.rs b/rust/kernel/static_key.rs
> new file mode 100644
> index 000000000000..32cf027ef091
> --- /dev/null
> +++ b/rust/kernel/static_key.rs
> @@ -0,0 +1,32 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +// Copyright (C) 2024 Google LLC.
> +
> +//! Logic for static keys.
> +
> +use crate::bindings::*;
> +
> +/// Branch based on a static key.
> +///
> +/// Takes three arguments:
> +///
> +/// * `key` - the path to the static variable containing the `static_key`.
> +/// * `keytyp` - the type of `key`.
> +/// * `field` - the name of the field of `key` that contains the `static_key`.
> +#[macro_export]
> +macro_rules! static_key_false {
> + ($key:path, $keytyp:ty, $field:ident) => {{
> + // Assert that `$key` has type `$keytyp` and that `$key.$field` has type `static_key`.
> + //
> + // SAFETY: We know that `$key` is a static because otherwise the inline assembly will not
> + // compile. The raw pointers created in this block are in-bounds of `$key`.
> + static _TY_ASSERT: () = unsafe {
> + let key: *const $keytyp = ::core::ptr::addr_of!($key);
> + let _: *const $crate::bindings::static_key = ::core::ptr::addr_of!((*key).$field);
> + };
> +
> + $crate::arch::jump_label::arch_static_branch! { $key, $keytyp, $field, false }
> + }};
> +}
> +
> +pub use static_key_false;
> diff --git a/scripts/Makefile.build b/scripts/Makefile.build
> index efacca63c897..60197c1c063f 100644
> --- a/scripts/Makefile.build
> +++ b/scripts/Makefile.build
> @@ -263,7 +263,7 @@ $(obj)/%.lst: $(obj)/%.c FORCE
> # Compile Rust sources (.rs)
> # ---------------------------------------------------------------------------
>
> -rust_allowed_features := new_uninit
> +rust_allowed_features := asm_const,asm_goto,new_uninit
>
> # `--out-dir` is required to avoid temporaries being created by `rustc` in the
> # current working directory, which may be not accessible in the out-of-tree
>
> --
> 2.45.2.803.g4e1b14247a-goog
>
>
^ permalink raw reply [flat|nested] 26+ messages in thread* Re: [PATCH v4 1/2] rust: add static_key_false
@ 2024-06-30 6:00 ` hev
0 siblings, 0 replies; 26+ messages in thread
From: hev @ 2024-06-30 6:00 UTC (permalink / raw)
To: Alice Ryhl
Cc: Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers,
Peter Zijlstra, Josh Poimboeuf, Jason Baron, Ard Biesheuvel,
Miguel Ojeda, Alex Gaynor, Wedson Almeida Filho, Boqun Feng,
Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg,
linux-trace-kernel, rust-for-linux, linux-kernel, Arnd Bergmann,
linux-arch, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H. Peter Anvin, Peter Zijlstra (Intel),
Sean Christopherson, Uros Bizjak, Catalin Marinas, Will Deacon,
Marc Zyngier, Oliver Upton, Mark Rutland, Ryan Roberts,
Fuad Tabba, linux-arm-kernel, Paul Walmsley, Palmer Dabbelt,
Albert Ou, Anup Patel, Andrew Jones, Alexandre Ghiti,
Conor Dooley, Samuel Holland, linux-riscv, Huacai Chen,
WANG Xuerui, Bibo Mao, Tiezhu Yang, Andrew Morton, Tianrui Zhao,
loongarch
Hi Alice
On Fri, Jun 28, 2024 at 9:24 PM Alice Ryhl <aliceryhl@google.com> 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 <aliceryhl@google.com>
> ---
> 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 000000000000..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 000000000000..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 <wangrui@loongson.cn>
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 000000000000..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 000000000000..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
> + .option pop
> + .pushsection __jump_table, "aw"
> + .align 3
> + .long 1b - ., {0} - .
> + .dword {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/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;
> + }};
> +}
> +
> +pub use arch_static_branch;
> diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs
> index fbd91a48ff8b..fffd4e1dd1c1 100644
> --- a/rust/kernel/lib.rs
> +++ b/rust/kernel/lib.rs
> @@ -27,6 +27,7 @@
> extern crate self as kernel;
>
> pub mod alloc;
> +pub mod arch;
> mod build_assert;
> pub mod error;
> pub mod init;
> @@ -38,6 +39,7 @@
> pub mod prelude;
> pub mod print;
> mod static_assert;
> +pub mod static_key;
> #[doc(hidden)]
> pub mod std_vendor;
> pub mod str;
> diff --git a/rust/kernel/static_key.rs b/rust/kernel/static_key.rs
> new file mode 100644
> index 000000000000..32cf027ef091
> --- /dev/null
> +++ b/rust/kernel/static_key.rs
> @@ -0,0 +1,32 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +// Copyright (C) 2024 Google LLC.
> +
> +//! Logic for static keys.
> +
> +use crate::bindings::*;
> +
> +/// Branch based on a static key.
> +///
> +/// Takes three arguments:
> +///
> +/// * `key` - the path to the static variable containing the `static_key`.
> +/// * `keytyp` - the type of `key`.
> +/// * `field` - the name of the field of `key` that contains the `static_key`.
> +#[macro_export]
> +macro_rules! static_key_false {
> + ($key:path, $keytyp:ty, $field:ident) => {{
> + // Assert that `$key` has type `$keytyp` and that `$key.$field` has type `static_key`.
> + //
> + // SAFETY: We know that `$key` is a static because otherwise the inline assembly will not
> + // compile. The raw pointers created in this block are in-bounds of `$key`.
> + static _TY_ASSERT: () = unsafe {
> + let key: *const $keytyp = ::core::ptr::addr_of!($key);
> + let _: *const $crate::bindings::static_key = ::core::ptr::addr_of!((*key).$field);
> + };
> +
> + $crate::arch::jump_label::arch_static_branch! { $key, $keytyp, $field, false }
> + }};
> +}
> +
> +pub use static_key_false;
> diff --git a/scripts/Makefile.build b/scripts/Makefile.build
> index efacca63c897..60197c1c063f 100644
> --- a/scripts/Makefile.build
> +++ b/scripts/Makefile.build
> @@ -263,7 +263,7 @@ $(obj)/%.lst: $(obj)/%.c FORCE
> # Compile Rust sources (.rs)
> # ---------------------------------------------------------------------------
>
> -rust_allowed_features := new_uninit
> +rust_allowed_features := asm_const,asm_goto,new_uninit
>
> # `--out-dir` is required to avoid temporaries being created by `rustc` in the
> # current working directory, which may be not accessible in the out-of-tree
>
> --
> 2.45.2.803.g4e1b14247a-goog
>
>
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v4 1/2] rust: add static_key_false
2024-06-28 13:23 ` Alice Ryhl
@ 2024-07-30 10:20 ` Gary Guo
-1 siblings, 0 replies; 26+ messages in thread
From: Gary Guo @ 2024-07-30 10:20 UTC (permalink / raw)
To: Alice Ryhl
Cc: Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers,
Peter Zijlstra, Josh Poimboeuf, Jason Baron, Ard Biesheuvel,
Miguel Ojeda, Alex Gaynor, Wedson Almeida Filho, Boqun Feng,
Björn Roy Baron, Benno Lossin, Andreas Hindborg,
linux-trace-kernel, rust-for-linux, linux-kernel, Arnd Bergmann,
linux-arch, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H. Peter Anvin, Peter Zijlstra (Intel),
Sean Christopherson, Uros Bizjak, Catalin Marinas, Will Deacon,
Marc Zyngier, Oliver Upton, Mark Rutland, Ryan Roberts,
Fuad Tabba, linux-arm-kernel, Paul Walmsley, Palmer Dabbelt,
Albert Ou, Anup Patel, Andrew Jones, Alexandre Ghiti,
Conor Dooley, Samuel Holland, linux-riscv, Huacai Chen,
WANG Xuerui, Bibo Mao, Tiezhu Yang, Andrew Morton, Tianrui Zhao,
loongarch
On Fri, 28 Jun 2024 13:23:31 +0000
Alice Ryhl <aliceryhl@google.com> 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 <aliceryhl@google.com>
Reviewed-by: Gary Guo <gary@garyguo.net>
> ---
> 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(-)
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v4 1/2] rust: add static_key_false
@ 2024-07-30 10:20 ` Gary Guo
0 siblings, 0 replies; 26+ messages in thread
From: Gary Guo @ 2024-07-30 10:20 UTC (permalink / raw)
To: Alice Ryhl
Cc: Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers,
Peter Zijlstra, Josh Poimboeuf, Jason Baron, Ard Biesheuvel,
Miguel Ojeda, Alex Gaynor, Wedson Almeida Filho, Boqun Feng,
Björn Roy Baron, Benno Lossin, Andreas Hindborg,
linux-trace-kernel, rust-for-linux, linux-kernel, Arnd Bergmann,
linux-arch, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H. Peter Anvin, Peter Zijlstra (Intel),
Sean Christopherson, Uros Bizjak, Catalin Marinas, Will Deacon,
Marc Zyngier, Oliver Upton, Mark Rutland, Ryan Roberts,
Fuad Tabba, linux-arm-kernel, Paul Walmsley, Palmer Dabbelt,
Albert Ou, Anup Patel, Andrew Jones, Alexandre Ghiti,
Conor Dooley, Samuel Holland, linux-riscv, Huacai Chen,
WANG Xuerui, Bibo Mao, Tiezhu Yang, Andrew Morton, Tianrui Zhao,
loongarch
On Fri, 28 Jun 2024 13:23:31 +0000
Alice Ryhl <aliceryhl@google.com> 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 <aliceryhl@google.com>
Reviewed-by: Gary Guo <gary@garyguo.net>
> ---
> 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(-)
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v4 1/2] rust: add static_key_false
2024-06-28 13:23 ` Alice Ryhl
@ 2024-07-31 17:05 ` Peter Zijlstra
-1 siblings, 0 replies; 26+ messages in thread
From: Peter Zijlstra @ 2024-07-31 17:05 UTC (permalink / raw)
To: Alice Ryhl
Cc: Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers,
Josh Poimboeuf, Jason Baron, Ard Biesheuvel, Miguel Ojeda,
Alex Gaynor, Wedson Almeida Filho, Boqun Feng, Gary Guo,
Björn Roy Baron, Benno Lossin, Andreas Hindborg,
linux-trace-kernel, rust-for-linux, linux-kernel, Arnd Bergmann,
linux-arch, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H. Peter Anvin, Peter Zijlstra (Intel),
Sean Christopherson, Uros Bizjak, Catalin Marinas, Will Deacon,
Marc Zyngier, Oliver Upton, Mark Rutland, Ryan Roberts,
Fuad Tabba, linux-arm-kernel, Paul Walmsley, Palmer Dabbelt,
Albert Ou, Anup Patel, Andrew Jones, Alexandre Ghiti,
Conor Dooley, Samuel Holland, linux-riscv, Huacai Chen,
WANG Xuerui, Bibo Mao, Tiezhu Yang, Andrew Morton, Tianrui Zhao,
loongarch
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.
^ permalink raw reply [flat|nested] 26+ messages in thread* Re: [PATCH v4 1/2] rust: add static_key_false
@ 2024-07-31 17:05 ` Peter Zijlstra
0 siblings, 0 replies; 26+ messages in thread
From: Peter Zijlstra @ 2024-07-31 17:05 UTC (permalink / raw)
To: Alice Ryhl
Cc: Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers,
Josh Poimboeuf, Jason Baron, Ard Biesheuvel, Miguel Ojeda,
Alex Gaynor, Wedson Almeida Filho, Boqun Feng, Gary Guo,
Björn Roy Baron, Benno Lossin, Andreas Hindborg,
linux-trace-kernel, rust-for-linux, linux-kernel, Arnd Bergmann,
linux-arch, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H. Peter Anvin, Peter Zijlstra (Intel),
Sean Christopherson, Uros Bizjak, Catalin Marinas, Will Deacon,
Marc Zyngier, Oliver Upton, Mark Rutland, Ryan Roberts,
Fuad Tabba, linux-arm-kernel, Paul Walmsley, Palmer Dabbelt,
Albert Ou, Anup Patel, Andrew Jones, Alexandre Ghiti,
Conor Dooley, Samuel Holland, linux-riscv, Huacai Chen,
WANG Xuerui, Bibo Mao, Tiezhu Yang, Andrew Morton, Tianrui Zhao,
loongarch
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.
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply [flat|nested] 26+ messages in thread* Re: [PATCH v4 1/2] rust: add static_key_false
2024-07-31 17:05 ` Peter Zijlstra
@ 2024-07-31 21:34 ` Alice Ryhl
-1 siblings, 0 replies; 26+ messages in thread
From: Alice Ryhl @ 2024-07-31 21:34 UTC (permalink / raw)
To: Peter Zijlstra
Cc: Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers,
Josh Poimboeuf, Jason Baron, Ard Biesheuvel, Miguel Ojeda,
Alex Gaynor, Wedson Almeida Filho, Boqun Feng, Gary Guo,
Björn Roy Baron, Benno Lossin, Andreas Hindborg,
linux-trace-kernel, rust-for-linux, linux-kernel, Arnd Bergmann,
linux-arch, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H. Peter Anvin, Peter Zijlstra (Intel),
Sean Christopherson, Uros Bizjak, Catalin Marinas, Will Deacon,
Marc Zyngier, Oliver Upton, Mark Rutland, Ryan Roberts,
Fuad Tabba, linux-arm-kernel, Paul Walmsley, Palmer Dabbelt,
Albert Ou, Anup Patel, Andrew Jones, Alexandre Ghiti,
Conor Dooley, Samuel Holland, linux-riscv, Huacai Chen,
WANG Xuerui, Bibo Mao, Tiezhu Yang, Andrew Morton, Tianrui Zhao,
loongarch
On Wed, Jul 31, 2024 at 7:05 PM Peter Zijlstra <peterz@infradead.org> wrote:
>
> 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.
I really didn't want to duplicate it, but it's very hard to find a
performant alternative. Is there any way we could accept duplication
only in the cases where an 'i' parameter is used? I don't have the
choice of using a Rust helper for 'i' parameters.
Perhaps one option could be to put the Rust code inside jump_label.h
and have the header file evaluate to either C or Rust depending on the
value of some #ifdefs?
#ifndef RUST_ASM
/* existing C code goes here */
#endif
#ifdef RUST_ASM
// rust code goes here
#endif
That way the duplication is all in a single file. It would also avoid
the need for duplicating the nop5 string, as the Rust case is still
going through the C preprocessor and can use the existing #define.
I'm also open to other alternatives. But I don't have infinite
resources to drive major language changes.
Alice
^ permalink raw reply [flat|nested] 26+ messages in thread* Re: [PATCH v4 1/2] rust: add static_key_false
@ 2024-07-31 21:34 ` Alice Ryhl
0 siblings, 0 replies; 26+ messages in thread
From: Alice Ryhl @ 2024-07-31 21:34 UTC (permalink / raw)
To: Peter Zijlstra
Cc: Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers,
Josh Poimboeuf, Jason Baron, Ard Biesheuvel, Miguel Ojeda,
Alex Gaynor, Wedson Almeida Filho, Boqun Feng, Gary Guo,
Björn Roy Baron, Benno Lossin, Andreas Hindborg,
linux-trace-kernel, rust-for-linux, linux-kernel, Arnd Bergmann,
linux-arch, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H. Peter Anvin, Peter Zijlstra (Intel),
Sean Christopherson, Uros Bizjak, Catalin Marinas, Will Deacon,
Marc Zyngier, Oliver Upton, Mark Rutland, Ryan Roberts,
Fuad Tabba, linux-arm-kernel, Paul Walmsley, Palmer Dabbelt,
Albert Ou, Anup Patel, Andrew Jones, Alexandre Ghiti,
Conor Dooley, Samuel Holland, linux-riscv, Huacai Chen,
WANG Xuerui, Bibo Mao, Tiezhu Yang, Andrew Morton, Tianrui Zhao,
loongarch
On Wed, Jul 31, 2024 at 7:05 PM Peter Zijlstra <peterz@infradead.org> wrote:
>
> 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.
I really didn't want to duplicate it, but it's very hard to find a
performant alternative. Is there any way we could accept duplication
only in the cases where an 'i' parameter is used? I don't have the
choice of using a Rust helper for 'i' parameters.
Perhaps one option could be to put the Rust code inside jump_label.h
and have the header file evaluate to either C or Rust depending on the
value of some #ifdefs?
#ifndef RUST_ASM
/* existing C code goes here */
#endif
#ifdef RUST_ASM
// rust code goes here
#endif
That way the duplication is all in a single file. It would also avoid
the need for duplicating the nop5 string, as the Rust case is still
going through the C preprocessor and can use the existing #define.
I'm also open to other alternatives. But I don't have infinite
resources to drive major language changes.
Alice
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply [flat|nested] 26+ messages in thread* Re: [PATCH v4 1/2] rust: add static_key_false
2024-07-31 21:34 ` Alice Ryhl
@ 2024-08-01 10:28 ` Peter Zijlstra
-1 siblings, 0 replies; 26+ messages in thread
From: Peter Zijlstra @ 2024-08-01 10:28 UTC (permalink / raw)
To: Alice Ryhl
Cc: Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers,
Josh Poimboeuf, Jason Baron, Ard Biesheuvel, Miguel Ojeda,
Alex Gaynor, Wedson Almeida Filho, Boqun Feng, Gary Guo,
Björn Roy Baron, Benno Lossin, Andreas Hindborg,
linux-trace-kernel, rust-for-linux, linux-kernel, Arnd Bergmann,
linux-arch, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H. Peter Anvin, Peter Zijlstra (Intel),
Sean Christopherson, Uros Bizjak, Catalin Marinas, Will Deacon,
Marc Zyngier, Oliver Upton, Mark Rutland, Ryan Roberts,
Fuad Tabba, linux-arm-kernel, Paul Walmsley, Palmer Dabbelt,
Albert Ou, Anup Patel, Andrew Jones, Alexandre Ghiti,
Conor Dooley, Samuel Holland, linux-riscv, Huacai Chen,
WANG Xuerui, Bibo Mao, Tiezhu Yang, Andrew Morton, Tianrui Zhao,
loongarch
On Wed, Jul 31, 2024 at 11:34:13PM +0200, Alice Ryhl wrote:
> > Please work harder to not have to duplicate stuff like this.
>
> I really didn't want to duplicate it, but it's very hard to find a
> performant alternative. Is there any way we could accept duplication
> only in the cases where an 'i' parameter is used? I don't have the
> choice of using a Rust helper for 'i' parameters.
>
> Perhaps one option could be to put the Rust code inside jump_label.h
> and have the header file evaluate to either C or Rust depending on the
> value of some #ifdefs?
>
> #ifndef RUST_ASM
> /* existing C code goes here */
> #endif
> #ifdef RUST_ASM
> // rust code goes here
> #endif
>
> That way the duplication is all in a single file. It would also avoid
> the need for duplicating the nop5 string, as the Rust case is still
> going through the C preprocessor and can use the existing #define.
I suppose that is slightly better, but ideally you generate the whole of
the Rust thing from the C version. After all, Clang can already parse
this.
That said, with the below patch, I think you should be able to reuse the
JUMP_TABLE_ENTRY macro like:
JUMP_TABLE_ENTRY({0}, {1}, {2} + {3})
> I'm also open to other alternatives. But I don't have infinite
> resources to drive major language changes.
Yes, well, you all picked this terrible language full well knowing it
hated C/C++ and had not a single effort put into integration with
existing code bases.
I find it very hard to care for the problems you've created for
yourself.
---
diff --git a/arch/x86/include/asm/jump_label.h b/arch/x86/include/asm/jump_label.h
index cbbef32517f0..6cff7bf5e779 100644
--- a/arch/x86/include/asm/jump_label.h
+++ b/arch/x86/include/asm/jump_label.h
@@ -12,12 +12,12 @@
#include <linux/stringify.h>
#include <linux/types.h>
-#define JUMP_TABLE_ENTRY \
- ".pushsection __jump_table, \"aw\" \n\t" \
- _ASM_ALIGN "\n\t" \
- ".long 1b - . \n\t" \
- ".long %l[l_yes] - . \n\t" \
- _ASM_PTR "%c0 + %c1 - .\n\t" \
+#define JUMP_TABLE_ENTRY(l_yes, key, branch) \
+ ".pushsection __jump_table, \"aw\" \n\t" \
+ _ASM_ALIGN "\n\t" \
+ ".long 1b - . \n\t" \
+ ".long " __stringify(l_yes) "- . \n\t" \
+ _ASM_PTR " " __stringify(key) " + " __stringify(branch) " - . \n\t" \
".popsection \n\t"
#ifdef CONFIG_HAVE_JUMP_LABEL_HACK
@@ -26,7 +26,7 @@ static __always_inline bool arch_static_branch(struct static_key *key, bool bran
{
asm goto("1:"
"jmp %l[l_yes] # objtool NOPs this \n\t"
- JUMP_TABLE_ENTRY
+ JUMP_TABLE_ENTRY(%[l_yes], %c0, %c1)
: : "i" (key), "i" (2 | branch) : : l_yes);
return false;
@@ -40,7 +40,7 @@ static __always_inline bool arch_static_branch(struct static_key * const key, co
{
asm goto("1:"
".byte " __stringify(BYTES_NOP5) "\n\t"
- JUMP_TABLE_ENTRY
+ JUMP_TABLE_ENTRY(%[l_yes], %c0, %c1)
: : "i" (key), "i" (branch) : : l_yes);
return false;
@@ -54,7 +54,7 @@ static __always_inline bool arch_static_branch_jump(struct static_key * const ke
{
asm goto("1:"
"jmp %l[l_yes]\n\t"
- JUMP_TABLE_ENTRY
+ JUMP_TABLE_ENTRY(%[l_yes], %c0, %c1)
: : "i" (key), "i" (branch) : : l_yes);
return false;
^ permalink raw reply related [flat|nested] 26+ messages in thread* Re: [PATCH v4 1/2] rust: add static_key_false
@ 2024-08-01 10:28 ` Peter Zijlstra
0 siblings, 0 replies; 26+ messages in thread
From: Peter Zijlstra @ 2024-08-01 10:28 UTC (permalink / raw)
To: Alice Ryhl
Cc: Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers,
Josh Poimboeuf, Jason Baron, Ard Biesheuvel, Miguel Ojeda,
Alex Gaynor, Wedson Almeida Filho, Boqun Feng, Gary Guo,
Björn Roy Baron, Benno Lossin, Andreas Hindborg,
linux-trace-kernel, rust-for-linux, linux-kernel, Arnd Bergmann,
linux-arch, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H. Peter Anvin, Peter Zijlstra (Intel),
Sean Christopherson, Uros Bizjak, Catalin Marinas, Will Deacon,
Marc Zyngier, Oliver Upton, Mark Rutland, Ryan Roberts,
Fuad Tabba, linux-arm-kernel, Paul Walmsley, Palmer Dabbelt,
Albert Ou, Anup Patel, Andrew Jones, Alexandre Ghiti,
Conor Dooley, Samuel Holland, linux-riscv, Huacai Chen,
WANG Xuerui, Bibo Mao, Tiezhu Yang, Andrew Morton, Tianrui Zhao,
loongarch
On Wed, Jul 31, 2024 at 11:34:13PM +0200, Alice Ryhl wrote:
> > Please work harder to not have to duplicate stuff like this.
>
> I really didn't want to duplicate it, but it's very hard to find a
> performant alternative. Is there any way we could accept duplication
> only in the cases where an 'i' parameter is used? I don't have the
> choice of using a Rust helper for 'i' parameters.
>
> Perhaps one option could be to put the Rust code inside jump_label.h
> and have the header file evaluate to either C or Rust depending on the
> value of some #ifdefs?
>
> #ifndef RUST_ASM
> /* existing C code goes here */
> #endif
> #ifdef RUST_ASM
> // rust code goes here
> #endif
>
> That way the duplication is all in a single file. It would also avoid
> the need for duplicating the nop5 string, as the Rust case is still
> going through the C preprocessor and can use the existing #define.
I suppose that is slightly better, but ideally you generate the whole of
the Rust thing from the C version. After all, Clang can already parse
this.
That said, with the below patch, I think you should be able to reuse the
JUMP_TABLE_ENTRY macro like:
JUMP_TABLE_ENTRY({0}, {1}, {2} + {3})
> I'm also open to other alternatives. But I don't have infinite
> resources to drive major language changes.
Yes, well, you all picked this terrible language full well knowing it
hated C/C++ and had not a single effort put into integration with
existing code bases.
I find it very hard to care for the problems you've created for
yourself.
---
diff --git a/arch/x86/include/asm/jump_label.h b/arch/x86/include/asm/jump_label.h
index cbbef32517f0..6cff7bf5e779 100644
--- a/arch/x86/include/asm/jump_label.h
+++ b/arch/x86/include/asm/jump_label.h
@@ -12,12 +12,12 @@
#include <linux/stringify.h>
#include <linux/types.h>
-#define JUMP_TABLE_ENTRY \
- ".pushsection __jump_table, \"aw\" \n\t" \
- _ASM_ALIGN "\n\t" \
- ".long 1b - . \n\t" \
- ".long %l[l_yes] - . \n\t" \
- _ASM_PTR "%c0 + %c1 - .\n\t" \
+#define JUMP_TABLE_ENTRY(l_yes, key, branch) \
+ ".pushsection __jump_table, \"aw\" \n\t" \
+ _ASM_ALIGN "\n\t" \
+ ".long 1b - . \n\t" \
+ ".long " __stringify(l_yes) "- . \n\t" \
+ _ASM_PTR " " __stringify(key) " + " __stringify(branch) " - . \n\t" \
".popsection \n\t"
#ifdef CONFIG_HAVE_JUMP_LABEL_HACK
@@ -26,7 +26,7 @@ static __always_inline bool arch_static_branch(struct static_key *key, bool bran
{
asm goto("1:"
"jmp %l[l_yes] # objtool NOPs this \n\t"
- JUMP_TABLE_ENTRY
+ JUMP_TABLE_ENTRY(%[l_yes], %c0, %c1)
: : "i" (key), "i" (2 | branch) : : l_yes);
return false;
@@ -40,7 +40,7 @@ static __always_inline bool arch_static_branch(struct static_key * const key, co
{
asm goto("1:"
".byte " __stringify(BYTES_NOP5) "\n\t"
- JUMP_TABLE_ENTRY
+ JUMP_TABLE_ENTRY(%[l_yes], %c0, %c1)
: : "i" (key), "i" (branch) : : l_yes);
return false;
@@ -54,7 +54,7 @@ static __always_inline bool arch_static_branch_jump(struct static_key * const ke
{
asm goto("1:"
"jmp %l[l_yes]\n\t"
- JUMP_TABLE_ENTRY
+ JUMP_TABLE_ENTRY(%[l_yes], %c0, %c1)
: : "i" (key), "i" (branch) : : l_yes);
return false;
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 26+ messages in thread* Re: [PATCH v4 1/2] rust: add static_key_false
2024-08-01 10:28 ` Peter Zijlstra
@ 2024-08-01 18:26 ` Alice Ryhl
-1 siblings, 0 replies; 26+ messages in thread
From: Alice Ryhl @ 2024-08-01 18:26 UTC (permalink / raw)
To: Peter Zijlstra
Cc: Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers,
Josh Poimboeuf, Jason Baron, Ard Biesheuvel, Miguel Ojeda,
Alex Gaynor, Wedson Almeida Filho, Boqun Feng, Gary Guo,
Björn Roy Baron, Benno Lossin, Andreas Hindborg,
linux-trace-kernel, rust-for-linux, linux-kernel, Arnd Bergmann,
linux-arch, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H. Peter Anvin, Peter Zijlstra (Intel),
Sean Christopherson, Uros Bizjak, Catalin Marinas, Will Deacon,
Marc Zyngier, Oliver Upton, Mark Rutland, Ryan Roberts,
Fuad Tabba, linux-arm-kernel, Paul Walmsley, Palmer Dabbelt,
Albert Ou, Anup Patel, Andrew Jones, Alexandre Ghiti,
Conor Dooley, Samuel Holland, linux-riscv, Huacai Chen,
WANG Xuerui, Bibo Mao, Tiezhu Yang, Andrew Morton, Tianrui Zhao,
loongarch
On Thu, Aug 1, 2024 at 12:28 PM Peter Zijlstra <peterz@infradead.org> wrote:
>
> On Wed, Jul 31, 2024 at 11:34:13PM +0200, Alice Ryhl wrote:
>
> > > Please work harder to not have to duplicate stuff like this.
> >
> > I really didn't want to duplicate it, but it's very hard to find a
> > performant alternative. Is there any way we could accept duplication
> > only in the cases where an 'i' parameter is used? I don't have the
> > choice of using a Rust helper for 'i' parameters.
> >
> > Perhaps one option could be to put the Rust code inside jump_label.h
> > and have the header file evaluate to either C or Rust depending on the
> > value of some #ifdefs?
> >
> > #ifndef RUST_ASM
> > /* existing C code goes here */
> > #endif
> > #ifdef RUST_ASM
> > // rust code goes here
> > #endif
> >
> > That way the duplication is all in a single file. It would also avoid
> > the need for duplicating the nop5 string, as the Rust case is still
> > going through the C preprocessor and can use the existing #define.
>
> I suppose that is slightly better, but ideally you generate the whole of
> the Rust thing from the C version. After all, Clang can already parse
> this.
>
> That said, with the below patch, I think you should be able to reuse the
> JUMP_TABLE_ENTRY macro like:
>
> JUMP_TABLE_ENTRY({0}, {1}, {2} + {3})
Yeah, I think this can work. I will submit a follow-up patch that
removes the duplication soon.
Alice
^ permalink raw reply [flat|nested] 26+ messages in thread* Re: [PATCH v4 1/2] rust: add static_key_false
@ 2024-08-01 18:26 ` Alice Ryhl
0 siblings, 0 replies; 26+ messages in thread
From: Alice Ryhl @ 2024-08-01 18:26 UTC (permalink / raw)
To: Peter Zijlstra
Cc: Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers,
Josh Poimboeuf, Jason Baron, Ard Biesheuvel, Miguel Ojeda,
Alex Gaynor, Wedson Almeida Filho, Boqun Feng, Gary Guo,
Björn Roy Baron, Benno Lossin, Andreas Hindborg,
linux-trace-kernel, rust-for-linux, linux-kernel, Arnd Bergmann,
linux-arch, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H. Peter Anvin, Peter Zijlstra (Intel),
Sean Christopherson, Uros Bizjak, Catalin Marinas, Will Deacon,
Marc Zyngier, Oliver Upton, Mark Rutland, Ryan Roberts,
Fuad Tabba, linux-arm-kernel, Paul Walmsley, Palmer Dabbelt,
Albert Ou, Anup Patel, Andrew Jones, Alexandre Ghiti,
Conor Dooley, Samuel Holland, linux-riscv, Huacai Chen,
WANG Xuerui, Bibo Mao, Tiezhu Yang, Andrew Morton, Tianrui Zhao,
loongarch
On Thu, Aug 1, 2024 at 12:28 PM Peter Zijlstra <peterz@infradead.org> wrote:
>
> On Wed, Jul 31, 2024 at 11:34:13PM +0200, Alice Ryhl wrote:
>
> > > Please work harder to not have to duplicate stuff like this.
> >
> > I really didn't want to duplicate it, but it's very hard to find a
> > performant alternative. Is there any way we could accept duplication
> > only in the cases where an 'i' parameter is used? I don't have the
> > choice of using a Rust helper for 'i' parameters.
> >
> > Perhaps one option could be to put the Rust code inside jump_label.h
> > and have the header file evaluate to either C or Rust depending on the
> > value of some #ifdefs?
> >
> > #ifndef RUST_ASM
> > /* existing C code goes here */
> > #endif
> > #ifdef RUST_ASM
> > // rust code goes here
> > #endif
> >
> > That way the duplication is all in a single file. It would also avoid
> > the need for duplicating the nop5 string, as the Rust case is still
> > going through the C preprocessor and can use the existing #define.
>
> I suppose that is slightly better, but ideally you generate the whole of
> the Rust thing from the C version. After all, Clang can already parse
> this.
>
> That said, with the below patch, I think you should be able to reuse the
> JUMP_TABLE_ENTRY macro like:
>
> JUMP_TABLE_ENTRY({0}, {1}, {2} + {3})
Yeah, I think this can work. I will submit a follow-up patch that
removes the duplication soon.
Alice
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply [flat|nested] 26+ messages in thread