From: Nathan Chancellor <nathan@kernel.org>
To: Alice Ryhl <aliceryhl@google.com>
Cc: "Miguel Ojeda" <ojeda@kernel.org>,
"Boqun Feng" <boqun.feng@gmail.com>,
"Gary Guo" <gary@garyguo.net>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
"Benno Lossin" <lossin@kernel.org>,
"Andreas Hindborg" <a.hindborg@kernel.org>,
"Trevor Gross" <tmgross@umich.edu>,
"Danilo Krummrich" <dakr@kernel.org>,
"Alexandre Courbot" <acourbot@nvidia.com>,
"Will Deacon" <will@kernel.org>,
"Peter Zijlstra" <peterz@infradead.org>,
"Mark Rutland" <mark.rutland@arm.com>,
"Nick Desaulniers" <nick.desaulniers+lkml@gmail.com>,
"Bill Wendling" <morbo@google.com>,
"Justin Stitt" <justinstitt@google.com>,
"Nicolas Schier" <nicolas.schier@linux.dev>,
"Andrew Morton" <akpm@linux-foundation.org>,
"Uladzislau Rezki" <urezki@gmail.com>,
rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org,
llvm@lists.linux.dev, linux-kbuild@vger.kernel.org,
linux-mm@kvack.org
Subject: Re: [PATCH v2 2/3] rust: helpers: #define __rust_helper
Date: Fri, 13 Mar 2026 17:28:50 -0700 [thread overview]
Message-ID: <20260314002850.GB534169@ax162> (raw)
In-Reply-To: <20260203-inline-helpers-v2-2-beb8547a03c9@google.com>
On Tue, Feb 03, 2026 at 11:34:09AM +0000, Alice Ryhl wrote:
> From: Gary Guo <gary@garyguo.net>
>
> Because of LLVM inling checks, it's generally not possible to inline a C
> helper into Rust code, even with LTO:
>
> * LLVM doesn't want to inline functions compiled with
> `-fno-delete-null-pointer-checks` with code compiled without. The C
> CGUs all have this enabled and Rust CGUs don't. Inlining is okay since
> this is one of the hardening features that does not change the ABI,
> and we shouldn't have null pointer dereferences in these helpers.
>
> * LLVM doesn't want to inline functions with different list of builtins. C
> side has `-fno-builtin-wcslen`; `wcslen` is not a Rust builtin, so
> they should be compatible, but LLVM does not perform inlining due to
> attributes mismatch.
>
> * clang and Rust doesn't have the exact target string. Clang generates
> `+cmov,+cx8,+fxsr` but Rust doesn't enable them (in fact, Rust will
> complain if `-Ctarget-feature=+cmov,+cx8,+fxsr` is used). x86-64
> always enable these features, so they are in fact the same target
> string, but LLVM doesn't understand this and so inlining is inhibited.
> This can be bypassed with `--ignore-tti-inline-compatible`, but this
> is a hidden option.
>
> To fix this, we can add __always_inline on every helper, which skips
> these LLVM inlining checks. For this purpose, introduce a new
> __rust_helper macro that needs to be added to every helper.
>
> Most helpers already have __rust_helper specified, but there are a few
> missing. The only consequence of this is that those specific helpers do
> not get inlined.
>
> Signed-off-by: Gary Guo <gary@garyguo.net>
> Signed-off-by: Alice Ryhl <aliceryhl@google.com>
> ---
Reviewed-by: Nathan Chancellor <nathan@kernel.org>
Tested-by: Nathan Chancellor <nathan@kernel.org>
> rust/helpers/helpers.c | 29 +++++++++++++++++++++++++++++
> 1 file changed, 29 insertions(+)
>
> diff --git a/rust/helpers/helpers.c b/rust/helpers/helpers.c
> index a3c42e51f00a0990bea81ebce6e99bb397ce7533..e05c6e7e4abb7e6a4c4a3a417e35022dac1d9c58 100644
> --- a/rust/helpers/helpers.c
> +++ b/rust/helpers/helpers.c
> @@ -7,7 +7,36 @@
> * Sorted alphabetically.
> */
>
> +#include <linux/compiler_types.h>
> +
> +#ifdef __BINDGEN__
> +// Omit `inline` for bindgen as it ignores inline functions.
> #define __rust_helper
> +#else
> +// The helper functions are all inline functions.
> +//
> +// We use `__always_inline` here to bypass LLVM inlining checks, in case the
> +// helpers are inlined directly into Rust CGUs.
> +//
> +// The LLVM inlining checks are false positives:
> +// * LLVM doesn't want to inline functions compiled with
> +// `-fno-delete-null-pointer-checks` with code compiled without.
> +// The C CGUs all have this enabled and Rust CGUs don't. Inlining is okay
> +// since this is one of the hardening features that does not change the ABI,
> +// and we shouldn't have null pointer dereferences in these helpers.
> +// * LLVM doesn't want to inline functions with different list of builtins. C
> +// side has `-fno-builtin-wcslen`; `wcslen` is not a Rust builtin, so they
> +// should be compatible, but LLVM does not perform inlining due to attributes
> +// mismatch.
> +// * clang and Rust doesn't have the exact target string. Clang generates
> +// `+cmov,+cx8,+fxsr` but Rust doesn't enable them (in fact, Rust will
> +// complain if `-Ctarget-feature=+cmov,+cx8,+fxsr` is used). x86-64 always
> +// enable these features, so they are in fact the same target string, but
> +// LLVM doesn't understand this and so inlining is inhibited. This can be
> +// bypassed with `--ignore-tti-inline-compatible`, but this is a hidden
> +// option.
> +#define __rust_helper __always_inline
> +#endif
>
> #include "atomic.c"
> #include "atomic_ext.c"
>
> --
> 2.53.0.rc1.225.gd81095ad13-goog
>
next prev parent reply other threads:[~2026-03-14 0:29 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
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
2026-02-03 11:34 ` [PATCH v2 2/3] rust: helpers: #define __rust_helper Alice Ryhl
2026-03-14 0:28 ` Nathan Chancellor [this message]
2026-02-03 11:34 ` [PATCH v2 3/3] build: rust: provide an option to inline C helpers into Rust Alice Ryhl
2026-03-06 17:32 ` Alice Ryhl
2026-03-14 0:40 ` Nathan Chancellor
2026-03-14 11:22 ` Alice Ryhl
2026-03-16 21:34 ` Nathan Chancellor
2026-03-17 8:02 ` Miguel Ojeda
2026-03-14 0:34 ` Nathan Chancellor
2026-03-17 8:25 ` [PATCH v2 0/3] Inline helpers into Rust without full LTO Andreas Hindborg
2026-03-22 19:21 ` Miguel Ojeda
2026-03-22 19:38 ` Miguel Ojeda
2026-03-23 13:54 ` Mark Brown
2026-03-23 14:53 ` Miguel Ojeda
2026-03-22 19:46 ` Miguel Ojeda
2026-03-23 8:49 ` Marek Szyprowski
2026-03-25 1:58 ` Miguel Ojeda
2026-03-23 0:03 ` Miguel Ojeda
2026-03-23 3:04 ` Andrew Lunn
2026-03-23 3:24 ` Miguel Ojeda
2026-03-23 12:54 ` Andrew Lunn
2026-03-23 13:13 ` Gary Guo
2026-03-23 13:28 ` Andrew Lunn
2026-03-23 13:34 ` Miguel Ojeda
2026-03-23 14:39 ` Alice Ryhl
2026-03-23 13:14 ` Miguel Ojeda
2026-03-23 10:03 ` Russell King (Oracle)
2026-03-23 13:26 ` Miguel Ojeda
2026-03-26 10:10 ` Alice Ryhl
2026-03-26 13:47 ` Miguel Ojeda
2026-03-26 14:31 ` Christian Schrefl
2026-03-26 2:42 ` Nathan Chancellor
2026-03-26 5:34 ` David Gow
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260314002850.GB534169@ax162 \
--to=nathan@kernel.org \
--cc=a.hindborg@kernel.org \
--cc=acourbot@nvidia.com \
--cc=akpm@linux-foundation.org \
--cc=aliceryhl@google.com \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun.feng@gmail.com \
--cc=dakr@kernel.org \
--cc=gary@garyguo.net \
--cc=justinstitt@google.com \
--cc=linux-kbuild@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=llvm@lists.linux.dev \
--cc=lossin@kernel.org \
--cc=mark.rutland@arm.com \
--cc=morbo@google.com \
--cc=nick.desaulniers+lkml@gmail.com \
--cc=nicolas.schier@linux.dev \
--cc=ojeda@kernel.org \
--cc=peterz@infradead.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=tmgross@umich.edu \
--cc=urezki@gmail.com \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox