public inbox for rust-for-linux@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/3] kbuild: rust: provide an option to inline C helpers into Rust
@ 2025-01-05 19:40 Gary Guo
  2025-01-05 19:40 ` [PATCH v2 1/3] kbuild: rust: add `CONFIG_RUSTC_CLANG_LLVM_COMPATIBLE` Gary Guo
                   ` (3 more replies)
  0 siblings, 4 replies; 20+ messages in thread
From: Gary Guo @ 2025-01-05 19:40 UTC (permalink / raw)
  To: Miguel Ojeda, Alex Gaynor, Boqun Feng, Gary Guo,
	Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl,
	Trevor Gross, Nathan Chancellor, Nick Desaulniers, Bill Wendling,
	Justin Stitt
  Cc: rust-for-linux, llvm

Currently we have quite a few helper function to aid calling from Rust
into inline/macro functions in C. These functions are typically
implemented with macros or inline functions because we want them to be
fast, so we want to actually have them inlined without the additional
function call overhead. However, we also don't want to re-implement
these functions in Rust to avoid accidental behaviour divergence.

This series add an option `RUST_INLINE_HELPERS` to inline C helpers into
Rust. This is similar to LTO, but we perform the extra inlining and
optimisation per Rust crate (compilation unit) instead of at final
linking time, thus has better compilation speed. It also means that this
presented approach work for loadable modules as well.

This option can only be enabled when Clang is used as C compiler, and
that the LLVM major version between Clang and Rust matches.

Changes from v1:
- Added LLVM version compatibility check
- Adapted to account for newly added helpers and removal of alloc crate.
- Added a patch to make `ReallocFunc::call` which prevents some helpers
  from being inlined.
- Link to v1:
  https://lore.kernel.org/rust-for-linux/20240529202817.3641974-1-gary@garyguo.net/

Gary Guo (3):
  kbuild: rust: add `CONFIG_RUSTC_CLANG_LLVM_COMPATIBLE`
  kbuild: rust: provide an option to inline C helpers into Rust
  rust: alloc: make `ReallocFunc::call` inline

 Makefile                       |  4 +++-
 init/Kconfig                   | 15 +++++++++++++++
 lib/Kconfig.debug              | 14 ++++++++++++++
 rust/Makefile                  | 31 +++++++++++++++++++++++++++----
 rust/exports.c                 |  5 ++++-
 rust/helpers/blk.c             |  5 +++--
 rust/helpers/bug.c             |  3 ++-
 rust/helpers/build_bug.c       |  3 ++-
 rust/helpers/cred.c            |  5 +++--
 rust/helpers/err.c             |  7 ++++---
 rust/helpers/fs.c              |  3 ++-
 rust/helpers/helpers.h         | 12 ++++++++++++
 rust/helpers/jump_label.c      |  3 ++-
 rust/helpers/kunit.c           |  3 ++-
 rust/helpers/mutex.c           |  7 ++++---
 rust/helpers/page.c            |  8 +++++---
 rust/helpers/pid_namespace.c   |  7 ++++---
 rust/helpers/rbtree.c          |  6 ++++--
 rust/helpers/refcount.c        |  7 ++++---
 rust/helpers/security.c        |  7 ++++---
 rust/helpers/signal.c          |  3 ++-
 rust/helpers/slab.c            |  5 +++--
 rust/helpers/spinlock.c        | 11 ++++++-----
 rust/helpers/task.c            | 23 ++++++++++++-----------
 rust/helpers/uaccess.c         |  9 +++++----
 rust/helpers/vmalloc.c         |  3 ++-
 rust/helpers/wait.c            |  3 ++-
 rust/helpers/workqueue.c       |  9 ++++++---
 rust/kernel/alloc/allocator.rs |  1 +
 scripts/Makefile.build         |  5 ++++-
 30 files changed, 163 insertions(+), 64 deletions(-)
 create mode 100644 rust/helpers/helpers.h


base-commit: 0c5928deada15a8d075516e6e0d9ee19011bb000
-- 
2.47.0


^ permalink raw reply	[flat|nested] 20+ messages in thread
* [PATCH v2 0/3] Inline helpers into Rust without full LTO
@ 2026-02-03 11:34 Alice Ryhl
  2026-02-03 11:34 ` [PATCH v2 1/3] kbuild: rust: add `CONFIG_RUSTC_CLANG_LLVM_COMPATIBLE` Alice Ryhl
  0 siblings, 1 reply; 20+ messages in thread
From: Alice Ryhl @ 2026-02-03 11:34 UTC (permalink / raw)
  To: Miguel Ojeda
  Cc: Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin,
	Andreas Hindborg, Trevor Gross, Danilo Krummrich,
	Alexandre Courbot, Will Deacon, Peter Zijlstra, Mark Rutland,
	Nathan Chancellor, Nick Desaulniers, Bill Wendling, Justin Stitt,
	Nicolas Schier, Andrew Morton, Uladzislau Rezki, rust-for-linux,
	linux-kernel, llvm, linux-kbuild, linux-mm, Alice Ryhl,
	Matthew Maurer

Currently the only way for Rust code to call a static inline function is
to go through a helper in rust/helpers/. This introduces performance
costs due to additional function calls and also clutters backtraces and
flame graphs with helper symbols.

To get rid of these helper symbols, provide functionality to inline
helpers into Rust using llvm-link. This option complements full LTO, by
being much cheaper and avoiding incompatibility with BTF.

I ran a microbenchmark showing the benefit of this. All the benchmark
does is call refcount_inc() in a loop. This was chosen since refcounting
is quite hot in Binder. The results are that Rust spends 6.35 ns per
call vs 5.73 ns per call in C. When enabling this option, the two
languages become equally fast, and disassembly confirms the exact same
machine code is used (in particular there is no call to
rust_helper_refcount_inc). Benchmarking Binder also results in an
improvement from this change.

This patch is complementary to:
https://lore.kernel.org/all/20251202-define-rust-helper-v1-0-a2e13cbc17a6@google.com/

Signed-off-by: Alice Ryhl <aliceryhl@google.com>
---
Changes in v2:
- Dropped merged patches.
- Generate two copies of helpers.bc, one for built-in and one for modules.
- Remove unused llvm-as tool.
- Add $(cmd_ld_single) to avoid breaking CONFIG_LTO builds (note that
  LTO does not happen over the language boundary, except for helpers).
- Improve Kconfig help message.
- Link to v1: https://lore.kernel.org/r/20251202-inline-helpers-v1-0-879dae33a66a@google.com

---
Gary Guo (3):
      kbuild: rust: add `CONFIG_RUSTC_CLANG_LLVM_COMPATIBLE`
      rust: helpers: #define __rust_helper
      build: rust: provide an option to inline C helpers into Rust

 Makefile               |  3 ++-
 init/Kconfig           | 15 +++++++++++++++
 lib/Kconfig.debug      | 15 +++++++++++++++
 rust/Makefile          | 29 +++++++++++++++++++++++++----
 rust/exports.c         |  5 ++++-
 rust/helpers/helpers.c | 29 +++++++++++++++++++++++++++++
 scripts/Makefile.build |  7 ++++++-
 7 files changed, 96 insertions(+), 7 deletions(-)
---
base-commit: 33a647c659ffa5bdb94abc345c8c86768ff96215
change-id: 20251202-inline-helpers-996f4db65e18

Best regards,
-- 
Alice Ryhl <aliceryhl@google.com>


^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2026-03-14  0:26 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-05 19:40 [PATCH v2 0/3] kbuild: rust: provide an option to inline C helpers into Rust Gary Guo
2025-01-05 19:40 ` [PATCH v2 1/3] kbuild: rust: add `CONFIG_RUSTC_CLANG_LLVM_COMPATIBLE` Gary Guo
2025-01-06  9:02   ` Alice Ryhl
2025-01-07 11:29   ` Andreas Hindborg
2025-01-05 19:40 ` [PATCH v2 2/3] kbuild: rust: provide an option to inline C helpers into Rust Gary Guo
2025-01-06  6:08   ` Randy Dunlap
2025-01-07 11:31   ` Andreas Hindborg
2025-03-06 23:00   ` Tamir Duberstein
2025-03-19 21:31     ` Gary Guo
2025-01-05 19:40 ` [PATCH v2 3/3] rust: alloc: make `ReallocFunc::call` inline Gary Guo
2025-01-06 17:42   ` Boqun Feng
2025-01-07 10:15   ` Danilo Krummrich
2025-01-07 10:21   ` Alice Ryhl
2025-03-06 20:04 ` [PATCH v2 0/3] kbuild: rust: provide an option to inline C helpers into Rust Miguel Ojeda
  -- strict thread matches above, loose matches on Subject: below --
2026-02-03 11:34 [PATCH v2 0/3] Inline helpers into Rust without full LTO Alice Ryhl
2026-02-03 11:34 ` [PATCH v2 1/3] kbuild: rust: add `CONFIG_RUSTC_CLANG_LLVM_COMPATIBLE` Alice Ryhl
2026-02-03 11:49   ` Will Deacon
2026-02-03 12:02     ` Alice Ryhl
2026-03-05 10:12   ` Nicolas Schier
2026-03-05 10:51     ` Alice Ryhl
2026-03-14  0:26   ` Nathan Chancellor

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox