Re: [RFC PATCH] rust: allow Clang-native `RANDSTRUCT` configs

From: Andreas Hindborg

Date: Tue Mar 17 2026 - 04:43:28 EST


"Miguel Ojeda" <ojeda@xxxxxxxxxx> writes:

> The kernel supports `RANDSTRUCT_FULL` with Clang 16+, and `bindgen`
> (which uses `libclang` under the hood) inherits the information, so the
> generated bindings look correct.
>
> For instance, running:
>
> bindgen x.h -- -frandomize-layout-seed=100
>
> with:
>
> struct S1 {
> int a;
> int b;
> };
>
> struct S2 {
> int a;
> int b;
> } __attribute__((randomize_layout));
>
> struct S3 {
> void (*a)(void);
> void (*b)(void);
> };
>
> struct S4 {
> void (*a)(void);
> void (*b)(void);
> } __attribute__((no_randomize_layout));
>
> may swap `S2`'s and `S3`'s members, but not `S1`'s nor `S4`'s:
>
> pub struct S1 {
> pub a: ::std::os::raw::c_int,
> pub b: ::std::os::raw::c_int,
> }
>
> pub struct S2 {
> pub b: ::std::os::raw::c_int,
> pub a: ::std::os::raw::c_int,
> }
>
> pub struct S3 {
> pub b: ::std::option::Option<unsafe extern "C" fn()>,
> pub a: ::std::option::Option<unsafe extern "C" fn()>,
> }
>
> pub struct S4 {
> pub a: ::std::option::Option<unsafe extern "C" fn()>,
> pub b: ::std::option::Option<unsafe extern "C" fn()>,
> }
>
> Thus allow those configurations by requiring a Clang compiler to use
> `RANDSTRUCT`. In addition, remove the `!GCC_PLUGIN_RANDSTRUCT` check
> since it is not needed.
>
> A simpler alternative would be to remove the `!RANDSTRUCT` check (keeping
> the `!GCC_PLUGIN_RANDSTRUCT` one). However, if in the future GCC starts
> supporting `RANDSTRUCT` natively, it would be likely that it would not
> work unless GCC and Clang agree on the exact semantics of the flag. And,
> as far as I can see, so far the randomization in Clang does not seem to be
> guaranteed to remain stable across versions or platforms, i.e. only for a
> given compiler Clang binary, given it is not documented and that LLVM's
> `HEAD` has the revert in place for the expected field names in the test
> (LLVM commit 8dbc6b560055 ("Revert "[randstruct] Check final randomized
> layout ordering"")) [1][2]. And the GCC plugin definitely does not match,
> e.g. its RNG is different (`std::mt19937` vs Bob Jenkins').
>
> And given it is not supposed to be guaranteed to remain stable across
> versions, it is a good idea to match the Clang and `bindgen`'s
> `libclang` versions -- we already have a warning for that in
> `scripts/rust_is_available.sh`. In the future, it would also be good to
> have a build test to double-check layouts do actually match (but that
> is true regardless of this particular feature).
>
> Finally, make a required small change to take into account the anonymous
> struct used in `randomized_struct_fields_*` in `struct task_struct`.
>
> Cc: Aaron Ballman <aaron@xxxxxxxxxxxxxxxx>
> Cc: Bill Wendling <isanbard@xxxxxxxxx>
> Cc: Cole Nixon <nixontcole@xxxxxxxxx>
> Cc: Connor Kuehl <cipkuehl@xxxxxxxxx>
> Cc: Fangrui Song <i@xxxxxxxxxx>
> Cc: James Foster <jafosterja@xxxxxxxxx>
> Cc: Jeff Takahashi <jeffrey.takahashi@xxxxxxxxx>
> Cc: Jordan Cantrell <jordan.cantrell@xxxxxxxx>
> Cc: Justin Stitt <justinstitt@xxxxxxxxxx>
> Cc: Matthew Maurer <mmaurer@xxxxxxxxxx>
> Cc: Nathan Chancellor <nathan@xxxxxxxxxx>
> Cc: Nikk Forbus <nicholas.forbus@xxxxxxxxx>
> Cc: Qing Zhao <qing.zhao@xxxxxxxxxx>
> Cc: Sami Tolvanen <samitolvanen@xxxxxxxxxx>
> Cc: Tim Pugh <nwtpugh@xxxxxxxxx>
> Link: https://reviews.llvm.org/D121556
> Link: https://github.com/llvm/llvm-project/commit/8dbc6b560055ff5068ff45b550482ba62c36b5a5 [1]
> Link: https://reviews.llvm.org/D124199 [2]
> Reviewed-by: Kees Cook <kees@xxxxxxxxxx>
> Signed-off-by: Miguel Ojeda <ojeda@xxxxxxxxxx>


Tested-by: Andreas Hindborg <a.hindborg@xxxxxxxxxx>

Tested with the rust null block driver patch series [1]. I did a
few functional verification tests and a set of performance tests.

For the rnull driver, enabling randstruct with this patch gives no
statistically significant change to the average performance of the set
of 120 workloads that we publish on [2]. Individual configurations see
around 10% change in throughput, both directions.

Best regards,
Andreas Hindborg

[1] https://lore.kernel.org/rust-for-linux/20260216-rnull-v6-19-rc5-send-v1-0-de9a7af4b469@xxxxxxxxxx/
[2] https://rust-for-linux.com/null-block-driver