Skip to contentSkip to conversation

rust: bump minimum Rust and `bindgen` versions

PATCH Applied Miguel Ojeda 7 participants 55 messages Apr 5 – Apr 30

Subsystems (16)
lore
Share & tools
lore

Miguel Ojeda

author maintainer
#0 lore raw

v2 cover rust: bump minimum Rust and `bindgen` versions

As proposed in the past in e.g. LPC 2025 and the Maintainers Summit [1], we are going to follow Debian Stable's Rust versions as our minimum supported version.

Debian Trixie was released with a Rust 1.85.0 toolchain [2], which it still uses to this day [3] (i.e. no update to Rust 1.85.1).

Debian Trixie was released with bindgen 0.71.1, which it also still uses to this day [4].

Debian Trixie's release happened on 2025-08-09 [5], which means that a fair amount of time has passed since its release for kernel developers to upgrade.

Thus bump the minimum to the new versions, i.e.

- Rust: 1.78.0 -> 1.85.0
- bindgen: 0.65.1 -> 0.71.1

There are a few main parts to the series, in this order:

- A few cleanups that can be performed before the bumps.
- The Rust bump (and its cleanups).
- The bindgen bump (and its cleanups).
- Documentation updates.
- The cfi_encoding patch, added here, which needs the bump.
- The per-version flags support and a Clippy cleanup on top.

---
v1: https://lore.kernel.org/rust-for-linux/[email protected]/
v2:
- Added patch to globally allow incompatible_msrv and removed the last instance.

- Replaced --remap-path-prefix patches with one that drops the workaround entirely (and place it as the first one) and summarizes the discussion.

I also noticed that --remap-path-prefix for rustdoc is still unstable (unlike rustc's one), so I added it to our list as usual
(https://github.com/Rust-for-Linux/linux/issues/2). There does not seem to be a tracking issue, so I asked upstream about it.

We will need these two lines as the resolution for the conflict:

$(RUSTDOC) $(filter-out $(skip_flags) --remap-path-scope=%,$(if $(rustdoc_host),$(rust_common_flags),$(rust_flags))) \

$(RUSTDOC) --test $(filter-out --remap-path-scope=%,$(rust_flags)) \

- Reworked the extract_if patch to use it (unstably). The feature last major change happened in Rust 1.85.0, so that is fine.

- Moved $(HOSTRUSTFLAGS) below so that per-version flags (like lints) can be overridden too. Please see the details in the commit and my reply to v1.

- Added feature(extract_if) and feature(non_null_convenience) items to https://github.com/Rust-for-Linux/linux/issues/1223.

Then reworded the commits accordingly to include the references to tracking issues and PRs.

- Other rewords, e.g. the "beyond" typo.

- Rebased on top of rust-next.

- Picked up tags.

Alice Ryhl (1):
rust: declare cfi_encoding for lru_status

Miguel Ojeda (32):
rust: kbuild: remove --remap-path-prefix workarounds
rust: kbuild: remove "try keyword" workaround for bindgen < 0.59.2
rust: kbuild: remove unneeded old allows for generated layout tests
gpu: nova-core: bindings: remove unneeded cfg_attr
rust: bump Rust minimum supported version to 1.85.0 (Debian Trixie)
rust: bump Clippy's MSRV and clean incompatible_msrv allows
rust: allow globally clippy::incompatible_msrv
rust: simplify RUSTC_VERSION Kconfig conditions
rust: remove RUSTC_HAS_SLICE_AS_FLATTENED and simplify code
rust: remove RUSTC_HAS_COERCE_POINTEE and simplify code
rust: kbuild: remove skipping of -Wrustdoc::unescaped_backticks
rust: kbuild: remove feature(...)s that are now stable
rust: transmute: simplify code with Rust 1.80.0 split_at_*checked()
rust: alloc: simplify with NonNull::add() now that it is stable
rust: macros: simplify code using feature(extract_if)
rust: block: update const_refs_to_static MSRV TODO comment
rust: bump bindgen minimum supported version to 0.71.1 (Debian
Trixie)
rust: rust_is_available: remove warning for bindgen 0.66.[01]
rust: rust_is_available: remove warning for bindgen < 0.69.5 &&

    libclang >= 19.1
  rust: kbuild: update `bindgen --rust-target` version and replace
    comment
  rust: kbuild: remove "dummy parameter" workaround for `bindgen` <
    0.71.1

docs: rust: quick-start: openSUSE provides rust-src package nowadays
docs: rust: quick-start: update Ubuntu versioned packages
docs: rust: quick-start: update minimum Ubuntu version
docs: rust: quick-start: add Ubuntu 26.04 LTS and remove subsection
title
docs: rust: quick-start: remove Gentoo "testing" note
docs: rust: quick-start: remove Nix "unstable channel" note
docs: rust: quick-start: remove GDB/Binutils mention
docs: rust: general-information: simplify Kconfig example
docs: rust: general-information: use real example
rust: kbuild: support global per-version flags
rust: kbuild: allow clippy::precedence for Rust < 1.86.0

 .clippy.toml                                  |  2 +-
 Documentation/process/changes.rst             |  4 +-
 Documentation/rust/general-information.rst    |  4 +-
 Documentation/rust/quick-start.rst            | 52 +++++++----------
 Makefile                                      | 12 +++-
 arch/Kconfig                                  |  3 +-
 arch/arm64/Kconfig                            |  8 ---
 arch/riscv/Kconfig                            |  3 -
 drivers/android/binder/Makefile               |  3 +-
 drivers/android/binder/page_range.rs          |  6 +-
 drivers/android/binder/page_range_helper.c    | 24 --------
 drivers/android/binder/page_range_helper.h    | 15 -----
 drivers/gpu/nova-core/gsp/cmdq.rs             |  6 +-
 drivers/gpu/nova-core/gsp/fw/r570_144.rs      |  3 -
 init/Kconfig                                  | 15 +----
 rust/Makefile                                 | 31 ++--------
 rust/bindgen_parameters                       |  8 +--
 rust/bindings/bindings_helper.h               |  1 -
 rust/bindings/lib.rs                          |  5 +-
 rust/kernel/alloc/allocator/iter.rs           |  8 +--
 rust/kernel/alloc/kbox.rs                     | 29 +---------
 rust/kernel/block/mq/gen_disk.rs              |  4 +-
 rust/kernel/lib.rs                            | 30 +---------
 rust/kernel/list/arc.rs                       | 22 +------
 rust/kernel/prelude.rs                        |  3 -
 rust/kernel/ptr.rs                            |  1 -
 rust/kernel/slice.rs                          | 49 ----------------
 rust/kernel/sync/arc.rs                       | 21 +------
 rust/kernel/transmute.rs                      | 35 ++---------
 rust/macros/helpers.rs                        |  1 -
 rust/macros/kunit.rs                          |  9 +--
 rust/macros/lib.rs                            |  3 +
 rust/uapi/lib.rs                              |  5 +-
 scripts/Makefile.build                        |  6 +-
 scripts/min-tool-version.sh                   |  4 +-
 scripts/rust_is_available.sh                  | 36 +-----------
 scripts/rust_is_available_bindgen_0_66.h      |  2 -
 ...ust_is_available_bindgen_libclang_concat.h |  3 -
 scripts/rust_is_available_test.py             | 58 +------------------
 39 files changed, 83 insertions(+), 451 deletions(-)
 delete mode 100644 drivers/android/binder/page_range_helper.c
 delete mode 100644 drivers/android/binder/page_range_helper.h
 delete mode 100644 rust/kernel/slice.rs
 delete mode 100644 scripts/rust_is_available_bindgen_0_66.h
 delete mode 100644 scripts/rust_is_available_bindgen_libclang_concat.h

base-commit: 36f5a2b09e650b82d7b2a106e3b93af48c2010d9 --
2.53.0

author maintainer
#1 lore raw

PATCH v2 1/33 rust: kbuild: remove `--remap-path-prefix` workarounds

Commit 8cf5b3f83614 ("Revert "kbuild, rust: use -fremap-path-prefix to make paths relative"") removed --remap-path-prefix from the build system, so the workarounds are not needed anymore.

Thus remove them.

Note that the flag has landed again in parallel in this cycle in commit dda135077ecc ("rust: build: remap path to avoid absolute path"), together with --remap-path-scope=macro [1]. However, they are gated on rustc-option-yn, --remap-path-scope=macro, which means they are both only passed starting with Rust 1.95.0 [2]:

--remap-path-scope is only stable in Rust 1.95, so use rustc-option to detect its presence. This feature has been available as -Zremap-path-scope for all versions that we support; however due to bugs in the Rust compiler, it does not work reliably until 1.94. I opted to not enable it for 1.94 as it's just a single version that we missed.

In turn, that means the workarounds removed here should not be needed again (even with the flag added again above), since:

- rustdoc now recognizes the --remap-path-prefix flag since Rust

    1.81.0 [3] (even if it is still an unstable feature [4]).

- The Internal Compiler Error [5] that the comment mentions was fixed in Rust 1.87.0 [6]. We tested that was the case in a previous version of this series by making the workaround conditional [7][8].

...which are both older versions than Rust 1.95.0.

We will still need to skip --remap-path-scope for rustdoc though, since rustdoc does not support that one yet [4].

---
 rust/Makefile | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)
rust/Makefile +2 -6
index 96cd7d8e6ee9..16ea720e0a8e 100644
@@ -145,14 +145,10 @@ rustdoc_modifiers_workaround := $(if $(call rustc-min-version,108800),-Cunsafe-a
 # Similarly, for doctests (https://github.com/rust-lang/rust/issues/146465).
 doctests_modifiers_workaround := $(rustdoc_modifiers_workaround)$(if $(call rustc-min-version,109100),$(comma)sanitizer)
 
-# `rustc` recognizes `--remap-path-prefix` since 1.26.0, but `rustdoc` only
-# since Rust 1.81.0. Moreover, `rustdoc` ICEs on out-of-tree builds since Rust
-# 1.82.0 (https://github.com/rust-lang/rust/issues/138520). Thus workaround both
-# issues skipping the flag. The former also applies to `RUSTDOC TK`.
 quiet_cmd_rustdoc = RUSTDOC $(if $(rustdoc_host),H, ) $<
       cmd_rustdoc = \
 	OBJTREE=$(abspath $(objtree)) \
-	$(RUSTDOC) $(filter-out $(skip_flags) --remap-path-prefix=%,$(if $(rustdoc_host),$(rust_common_flags),$(rust_flags))) \
+	$(RUSTDOC) $(filter-out $(skip_flags),$(if $(rustdoc_host),$(rust_common_flags),$(rust_flags))) \
 		$(rustc_target_flags) -L$(objtree)/$(obj) \
 		-Zunstable-options --generate-link-to-definition \
 		--output $(rustdoc_output) \
@@ -338,7 +334,7 @@ quiet_cmd_rustdoc_test_kernel = RUSTDOC TK $<
 	rm -rf $(objtree)/$(obj)/test/doctests/kernel; \
 	mkdir -p $(objtree)/$(obj)/test/doctests/kernel; \
 	OBJTREE=$(abspath $(objtree)) \
-	$(RUSTDOC) --test $(filter-out --remap-path-prefix=%,$(rust_flags)) \
+	$(RUSTDOC) --test $(rust_flags) \
 		-L$(objtree)/$(obj) --extern ffi --extern pin_init \
 		--extern kernel --extern build_error --extern macros \
 		--extern bindings --extern uapi \
Signature · 1 line
2.53.0
maintainer Acked-by on v2 1/33
#2 lore raw

Re: [PATCH v2 01/33] rust: kbuild: remove `--remap-path-prefix` workarounds

Quoted 33 lines · Miguel Ojeda

Commit 8cf5b3f83614 ("Revert "kbuild, rust: use -fremap-path-prefix to make paths relative"") removed --remap-path-prefix from the build system, so the workarounds are not needed anymore.

Thus remove them.

Note that the flag has landed again in parallel in this cycle in commit dda135077ecc ("rust: build: remap path to avoid absolute path"), together with --remap-path-scope=macro [1]. However, they are gated on rustc-option-yn, --remap-path-scope=macro, which means they are both only passed starting with Rust 1.95.0 [2]:

--remap-path-scope is only stable in Rust 1.95, so use rustc-option to detect its presence. This feature has been available as -Zremap-path-scope for all versions that we support; however due to bugs in the Rust compiler, it does not work reliably until 1.94. I opted to not enable it for 1.94 as it's just a single version that we missed.

In turn, that means the workarounds removed here should not be needed again (even with the flag added again above), since:

- rustdoc now recognizes the --remap-path-prefix flag since Rust

    1.81.0 [3] (even if it is still an unstable feature [4]).

- The Internal Compiler Error [5] that the comment mentions was fixed in Rust 1.87.0 [6]. We tested that was the case in a previous version of this series by making the workaround conditional [7][8].

...which are both older versions than Rust 1.95.0.

We will still need to skip --remap-path-scope for rustdoc though, since rustdoc does not support that one yet [4].

Quoted 9 lines
Quoted 3 lines
---
 rust/Makefile | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)
reviewer Reviewed-by on v2 1/33
#3 lore raw

Re: [PATCH v2 01/33] rust: kbuild: remove `--remap-path-prefix` workarounds

In reply to Miguel Ojeda
Quoted 6 lines · Miguel Ojeda

Commit 8cf5b3f83614 ("Revert "kbuild, rust: use -fremap-path-prefix to make paths relative"") removed --remap-path-prefix from the build system, so the workarounds are not needed anymore.

Thus remove them.

Quoted 7 lines

Note that the flag has landed again in parallel in this cycle in commit dda135077ecc ("rust: build: remap path to avoid absolute path"), together with --remap-path-scope=macro [1]. However, they are gated on rustc-option-yn, --remap-path-scope=macro, which means they are both only passed starting with Rust 1.95.0 [2]:

[...]

Signature · 1 line
Tamir Duberstein <[email protected]>
maintainer Acked-by on v2 1/33
#4 lore raw

Re: [PATCH v2 01/33] rust: kbuild: remove `--remap-path-prefix` workarounds

In reply to Miguel Ojeda
Quoted 42 lines · Miguel Ojeda

Commit 8cf5b3f83614 ("Revert "kbuild, rust: use -fremap-path-prefix to make paths relative"") removed --remap-path-prefix from the build system, so the workarounds are not needed anymore.

Thus remove them.

Note that the flag has landed again in parallel in this cycle in commit dda135077ecc ("rust: build: remap path to avoid absolute path"), together with --remap-path-scope=macro [1]. However, they are gated on rustc-option-yn, --remap-path-scope=macro, which means they are both only passed starting with Rust 1.95.0 [2]:

--remap-path-scope is only stable in Rust 1.95, so use rustc-option to detect its presence. This feature has been available as -Zremap-path-scope for all versions that we support; however due to bugs in the Rust compiler, it does not work reliably until 1.94. I opted to not enable it for 1.94 as it's just a single version that we missed.

In turn, that means the workarounds removed here should not be needed again (even with the flag added again above), since:

- rustdoc now recognizes the --remap-path-prefix flag since Rust

    1.81.0 [3] (even if it is still an unstable feature [4]).

- The Internal Compiler Error [5] that the comment mentions was fixed in Rust 1.87.0 [6]. We tested that was the case in a previous version of this series by making the workaround conditional [7][8].

...which are both older versions than Rust 1.95.0.

We will still need to skip --remap-path-scope for rustdoc though, since rustdoc does not support that one yet [4].

Quoted 4 lines
---
 rust/Makefile | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)
Signature · 1 line
Nicolas
author maintainer
#5 lore raw

PATCH v2 2/33 rust: kbuild: remove "`try` keyword" workaround for `bindgen` < 0.59.2

In reply to Miguel Ojeda

There is a workaround that has not been needed, even already after commit 08ab786556ff ("rust: bindgen: upgrade to 0.65.1"), but it does not hurt.

Thus remove it.

---
 rust/bindgen_parameters | 4 ----
 1 file changed, 4 deletions(-)
rust/bindgen_parameters +0 -4
index fd2fd1c3cb9a..112ec197ef0a 100644
@@ -15,10 +15,6 @@
 --opaque-type x86_msi_data
 --opaque-type x86_msi_addr_lo
 
-# `try` is a reserved keyword since Rust 2018; solved in `bindgen` v0.59.2,
-# commit 2aed6b021680 ("context: Escape the try keyword properly").
---opaque-type kunit_try_catch
-
 # If SMP is disabled, `arch_spinlock_t` is defined as a ZST which triggers a Rust
 # warning. We don't need to peek into it anyway.
 --opaque-type spinlock
Signature · 1 line
2.53.0
author maintainer
#6 lore raw

PATCH v2 3/33 rust: kbuild: remove unneeded old `allow`s for generated layout tests

In reply to Miguel Ojeda

The issue that required allows for cfg(test) code generated by bindgen for layout testing was fixed back in bindgen 0.60.0 [1], so it could have been removed even before the version bump, but it does not hurt.

Thus remove it now.

---
 rust/bindings/lib.rs | 4 ----
 rust/uapi/lib.rs     | 4 ----
 2 files changed, 8 deletions(-)
rust/bindings/lib.rs +0 -4
index 19f57c5b2fa2..e18c160dad17 100644
@@ -9,10 +9,6 @@
 //! using this crate.
 
 #![no_std]
-// See <https://github.com/rust-lang/rust-bindgen/issues/1651>.
-#![cfg_attr(test, allow(deref_nullptr))]
-#![cfg_attr(test, allow(unaligned_references))]
-#![cfg_attr(test, allow(unsafe_op_in_unsafe_fn))]
 #![allow(
     clippy::all,
     missing_docs,
rust/uapi/lib.rs +0 -4
index 1d5fd9efb93e..821e286e0daa 100644
@@ -8,10 +8,6 @@
 //! userspace APIs.
 
 #![no_std]
-// See <https://github.com/rust-lang/rust-bindgen/issues/1651>.
-#![cfg_attr(test, allow(deref_nullptr))]
-#![cfg_attr(test, allow(unaligned_references))]
-#![cfg_attr(test, allow(unsafe_op_in_unsafe_fn))]
 #![allow(
     clippy::all,
     clippy::cast_lossless,
Signature · 1 line
2.53.0
author maintainer
#7 lore raw

PATCH v2 4/33 gpu: nova-core: bindings: remove unneeded `cfg_attr`

In reply to Miguel Ojeda

These were likely copied from the bindings and uapi crates, but are unneeded since there are no cfg(test)s in the bindings.

In addition, the issue that triggered the addition in those crates originally is also fixed in bindgen (please see the previous commit).

Thus remove them.

---
 drivers/gpu/nova-core/gsp/fw/r570_144.rs | 3 ---
 1 file changed, 3 deletions(-)
drivers/gpu/nova-core/gsp/fw/r570_144.rs +0 -3
index e99d315ae74c..2e6f0d298756 100644
@@ -7,9 +7,6 @@
 //! This module may not be directly used. Please abstract or re-export the needed symbols in the
 //! parent module instead.
 
-#![cfg_attr(test, allow(deref_nullptr))]
-#![cfg_attr(test, allow(unaligned_references))]
-#![cfg_attr(test, allow(unsafe_op_in_unsafe_fn))]
 #![allow(
     dead_code,
     clippy::all,
Signature · 1 line
2.53.0
author maintainer
#8 lore raw

PATCH v2 5/33 rust: bump Rust minimum supported version to 1.85.0 (Debian Trixie)

In reply to Miguel Ojeda

As proposed in the past in e.g. LPC 2025 and the Maintainers Summit [1], we are going to follow Debian Stable's Rust versions as our minimum supported version.

Debian Trixie was released with a Rust 1.85.0 toolchain [2], which it still uses to this day [3] (i.e. no update to Rust 1.85.1).

Debian Trixie's release happened on 2025-08-09 [4], which means that a fair amount of time has passed since its release for kernel developers to upgrade.

Thus bump the minimum to the new version.

Then, in later commits, clean up most of the workarounds and other bits that this upgrade of the minimum allows us.

pin-init was left as-is since the patches come from upstream. And the vendored crates are unmodified, since we do not want to change those.

Note that the minimum LLVM major version for Rust 1.85.0 is LLVM 18 (the Rust upstream binaries use LLVM 19.1.7), thus e.g. RUSTC_LLVM_VERSION tests can also be updated, but there are no suitable ones to simplify.

Ubuntu 25.10 also has a recent enough Rust toolchain [5], and they also provide versioned packages with a Rust 1.85.1 toolchain even back to Ubuntu 22.04 LTS [6].

---
 Documentation/process/changes.rst | 2 +-
 scripts/min-tool-version.sh       | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
Documentation/process/changes.rst +1 -1
index 6b373e193548..474594bd4831 100644
@@ -31,7 +31,7 @@ you probably needn't concern yourself with pcmciautils.
 ====================== ===============  ========================================
 GNU C                  8.1              gcc --version
 Clang/LLVM (optional)  15.0.0           clang --version
-Rust (optional)        1.78.0           rustc --version
+Rust (optional)        1.85.0           rustc --version
 bindgen (optional)     0.65.1           bindgen --version
 GNU make               4.0              make --version
 bash                   4.2              bash --version
scripts/min-tool-version.sh +1 -1
index 99b5575c1ef7..a270ec761f64 100755
@@ -31,7 +31,7 @@ llvm)
 	fi
 	;;
 rustc)
-	echo 1.78.0
+	echo 1.85.0
 	;;
 bindgen)
 	echo 0.65.1
Signature · 1 line
2.53.0
author maintainer
#9 lore raw

PATCH v2 6/33 rust: bump Clippy's MSRV and clean `incompatible_msrv` allows

In reply to Miguel Ojeda

Following the Rust compiler bump, we can now update Clippy's MSRV we set in the configuration, which will improve the diagnostics it generates.

Thus do so and clean a few of the allows that are not needed anymore.

---
 .clippy.toml                      | 2 +-
 drivers/gpu/nova-core/gsp/cmdq.rs | 6 +-----
 rust/kernel/ptr.rs                | 1 -
 rust/kernel/transmute.rs          | 2 --
 4 files changed, 2 insertions(+), 9 deletions(-)
.clippy.toml +1 -1
index a51de9a46380..b0a78cc8be20 100644
@@ -1,6 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0
 
-msrv = "1.78.0"
+msrv = "1.85.0"
 
 check-private-items = true
 
drivers/gpu/nova-core/gsp/cmdq.rs +1 -5
index 46819a82a51a..d9f69366642a 100644
@@ -281,7 +281,6 @@ fn allocate_command(&mut self, size: usize) -> Result<GspCommand<'_>> {
         let (slice_1, slice_2) = {
             let (slice_1, slice_2) = self.driver_write_area();
 
-            #[allow(clippy::incompatible_msrv)]
             (slice_1.as_flattened_mut(), slice_2.as_flattened_mut())
         };
 
@@ -572,10 +571,7 @@ fn wait_for_msg(&self, timeout: Delta) -> Result<GspMessage<'_>> {
             Delta::from_millis(1),
             timeout,
         )
-        .map(|(slice_1, slice_2)| {
-            #[allow(clippy::incompatible_msrv)]
-            (slice_1.as_flattened(), slice_2.as_flattened())
-        })?;
+        .map(|(slice_1, slice_2)| (slice_1.as_flattened(), slice_2.as_flattened()))?;
 
         // Extract the `GspMsgElement`.
         let (header, slice_1) = GspMsgElement::from_bytes_prefix(slice_1).ok_or(EIO)?;
rust/kernel/ptr.rs +0 -1
index c7788656a162..91811f5e27de 100644
@@ -81,7 +81,6 @@ pub const fn new_checked(align: usize) -> Option<Self> {
     /// This is equivalent to [`align_of`], but with the return value provided as an [`Alignment`].
     #[inline(always)]
     pub const fn of<T>() -> Self {
-        #![allow(clippy::incompatible_msrv)]
         // This cannot panic since alignments are always powers of two.
         //
         // We unfortunately cannot use `new` as it would require the `generic_const_exprs` feature.
rust/kernel/transmute.rs +0 -2
index 5711580c9f9b..b9e6eadc08f5 100644
@@ -49,7 +49,6 @@ fn from_bytes(bytes: &[u8]) -> Option<&Self>
         let slice_ptr = bytes.as_ptr().cast::<Self>();
         let size = size_of::<Self>();
 
-        #[allow(clippy::incompatible_msrv)]
         if bytes.len() == size && slice_ptr.is_aligned() {
             // SAFETY: Size and alignment were just checked.
             unsafe { Some(&*slice_ptr) }
@@ -92,7 +91,6 @@ fn from_bytes_mut(bytes: &mut [u8]) -> Option<&mut Self>
         let slice_ptr = bytes.as_mut_ptr().cast::<Self>();
         let size = size_of::<Self>();
 
-        #[allow(clippy::incompatible_msrv)]
         if bytes.len() == size && slice_ptr.is_aligned() {
             // SAFETY: Size and alignment were just checked.
             unsafe { Some(&mut *slice_ptr) }
Signature · 1 line
2.53.0
author maintainer
#10 lore raw

PATCH v2 7/33 rust: allow globally `clippy::incompatible_msrv`

In reply to Miguel Ojeda

clippy::incompatible_msrv is not buying us much, and we discussed allowing it several times in the past.

For instance, there was recently another patch sent to allow it where needed [1]. While that particular case would not be needed after the minimum version bump to 1.85.0, it is simpler to just allow it to prevent future instances.

Thus do so, and remove the last instance of locally allowing it we have in the tree (except the one in the vendored proc_macro2 crate).

Note that we still keep the msrv config option in clippy.toml since that affects other lints as well.

---
 Makefile               | 1 +
 rust/macros/helpers.rs | 1 -
 2 files changed, 1 insertion(+), 1 deletion(-)
Makefile +1 -0
index a63684c36d60..78f5ee173eda 100644
@@ -486,6 +486,7 @@ export rust_common_flags := --edition=2021 \
 			    -Wclippy::as_underscore \
 			    -Wclippy::cast_lossless \
 			    -Wclippy::ignored_unit_patterns \
+			    -Aclippy::incompatible_msrv \
 			    -Wclippy::mut_mut \
 			    -Wclippy::needless_bitwise_bool \
 			    -Aclippy::needless_lifetimes \
rust/macros/helpers.rs +0 -1
index 37ef6a6f2c85..d18fbf4daa0a 100644
@@ -49,7 +49,6 @@ pub(crate) fn file() -> String {
     }
 
     #[cfg(CONFIG_RUSTC_HAS_SPAN_FILE)]
-    #[allow(clippy::incompatible_msrv)]
     {
         proc_macro::Span::call_site().file()
     }
Signature · 1 line
2.53.0
maintainer Reviewed-by on v2 7/33
#11 lore raw

Re: [PATCH v2 07/33] rust: allow globally `clippy::incompatible_msrv`

Quoted 8 lines · Miguel Ojeda

clippy::incompatible_msrv is not buying us much, and we discussed allowing it several times in the past.

For instance, there was recently another patch sent to allow it where needed [1]. While that particular case would not be needed after the minimum version bump to 1.85.0, it is simpler to just allow it to prevent future instances.

Quoted 8 lines

Thus do so, and remove the last instance of locally allowing it we have in the tree (except the one in the vendored proc_macro2 crate).

Note that we still keep the msrv config option in clippy.toml since that affects other lints as well.

Quoted 4 lines
---
 Makefile               | 1 +
 rust/macros/helpers.rs | 1 -
 2 files changed, 1 insertion(+), 1 deletion(-)
reviewer Reviewed-by on v2 7/33
#12 lore raw

Re: [PATCH v2 07/33] rust: allow globally `clippy::incompatible_msrv`

In reply to Miguel Ojeda

Makefile export rust_common_flags := --edition=2021 \ · line 489

Quoted 9 lines · Miguel Ojeda
Makefile +1 -0
index a63684c36d60..78f5ee173eda 100644
@@ -486,6 +486,7 @@ export rust_common_flags := --edition=2021 \
 			    -Wclippy::as_underscore \
 			    -Wclippy::cast_lossless \
 			    -Wclippy::ignored_unit_patterns \
+			    -Aclippy::incompatible_msrv \

Could you add a reference to the upstream bug report [0] here?

Signature · 1 line
Tamir Duberstein <[email protected]>
#13 lore raw

Re: [PATCH v2 07/33] rust: allow globally `clippy::incompatible_msrv`

Quoted 2 lines · Tamir Duberstein

Could you add a reference to the upstream bug report [0] here?

Of course, thanks for the tags!

Cheers,
Miguel

#14 lore raw

Re: [PATCH v2 07/33] rust: allow globally `clippy::incompatible_msrv`

Quoted 6 lines · Miguel Ojeda
Quoted 2 lines · Tamir Duberstein

Could you add a reference to the upstream bug report [0] here?

Of course, thanks for the tags!

You're welcome! Actually it seems the lint was already improved upstream, starting with 1.90.0.

#15 lore raw

Re: [PATCH v2 07/33] rust: allow globally `clippy::incompatible_msrv`

Quoted 5 lines · Tamir Duberstein

You're welcome! Actually it seems the lint was already improved upstream, starting with 1.90.0.

Indeed, I had the PR linked in
https://github.com/Rust-for-Linux/linux/issues/349, and it is nicer, but it would still fire in a case like this patch :(

So we could conditionally enable it for Rust >= 1.90.0 now that we have support for that (and allow locally some cases like this one when they pop up), but it is still simpler to just ignore it (especially since it can be quite confusing for other developers to see it triggering).

I think we may want to eventually re-enable it when we use no unstable language features.

Added:

[ In addition, the lint fired without taking into account the features
that have been enabled in a crate [2]. While this was improved in Rust 1.90.0 [3], it would still fire in a case like this patch. ]

Thanks!

Cheers,
Miguel

#16 lore raw

Re: [PATCH v2 07/33] rust: allow globally `clippy::incompatible_msrv`

Quoted 11 lines · Miguel Ojeda
Quoted 5 lines · Tamir Duberstein

You're welcome! Actually it seems the lint was already improved upstream, starting with 1.90.0.

Indeed, I had the PR linked in
https://github.com/Rust-for-Linux/linux/issues/349, and it is nicer, but it would still fire in a case like this patch :(

Ah, that is possibly https://github.com/rust-lang/rust-clippy/issues/14827.

author maintainer
#17 lore raw

PATCH v2 8/33 rust: simplify `RUSTC_VERSION` Kconfig conditions

In reply to Miguel Ojeda

With the Rust version bump in place, several Kconfig conditions based on RUSTC_VERSION are always true.

Thus simplify them.

The minimum supported major LLVM version by our new Rust minimum version is now LLVM 18, instead of LLVM 16. However, there are no possible cleanups for RUSTC_LLVM_VERSION.

---
 arch/Kconfig       | 3 +--
 arch/arm64/Kconfig | 8 --------
 arch/riscv/Kconfig | 3 ---
 init/Kconfig       | 2 --
 4 files changed, 1 insertion(+), 15 deletions(-)
arch/Kconfig +1 -2
index 102ddbd4298e..84089e80584b 100644
@@ -968,10 +968,9 @@ config HAVE_CFI_ICALL_NORMALIZE_INTEGERS
 config HAVE_CFI_ICALL_NORMALIZE_INTEGERS_RUSTC
 	def_bool y
 	depends on HAVE_CFI_ICALL_NORMALIZE_INTEGERS
-	depends on RUSTC_VERSION >= 107900
 	depends on ARM64 || X86_64
 	# With GCOV/KASAN we need this fix: https://github.com/rust-lang/rust/pull/129373
-	depends on (RUSTC_LLVM_VERSION >= 190103 && RUSTC_VERSION >= 108200) || \
+	depends on RUSTC_LLVM_VERSION >= 190103 || \
 		(!GCOV_KERNEL && !KASAN_GENERIC && !KASAN_SW_TAGS)
 
 config CFI_PERMISSIVE
arch/arm64/Kconfig +0 -8
index 38dba5f7e4d2..c91130c7fba1 100644
@@ -291,14 +291,6 @@ config ARM64
 config RUSTC_SUPPORTS_ARM64
 	def_bool y
 	depends on CPU_LITTLE_ENDIAN
-	# Shadow call stack is only supported on certain rustc versions.
-	#
-	# When using the UNWIND_PATCH_PAC_INTO_SCS option, rustc version 1.80+ is
-	# required due to use of the -Zfixed-x18 flag.
-	#
-	# Otherwise, rustc version 1.82+ is required due to use of the
-	# -Zsanitizer=shadow-call-stack flag.
-	depends on !SHADOW_CALL_STACK || RUSTC_VERSION >= 108200 || RUSTC_VERSION >= 108000 && UNWIND_PATCH_PAC_INTO_SCS
 
 config CLANG_SUPPORTS_DYNAMIC_FTRACE_WITH_ARGS
 	def_bool CC_IS_CLANG
arch/riscv/Kconfig +0 -3
index 90c531e6abf5..ddc534402400 100644
@@ -232,9 +232,6 @@ config RISCV
 config RUSTC_SUPPORTS_RISCV
 	def_bool y
 	depends on 64BIT
-	# Shadow call stack requires rustc version 1.82+ due to use of the
-	# -Zsanitizer=shadow-call-stack flag.
-	depends on !SHADOW_CALL_STACK || RUSTC_VERSION >= 108200
 
 config CLANG_SUPPORTS_DYNAMIC_FTRACE
 	def_bool CC_IS_CLANG
init/Kconfig +0 -2
index 36d32ea44594..b8a1ab0d49d4 100644
@@ -2193,9 +2193,7 @@ config RUST
 	depends on !DEBUG_INFO_BTF || (PAHOLE_HAS_LANG_EXCLUDE && !LTO)
 	depends on !CFI || HAVE_CFI_ICALL_NORMALIZE_INTEGERS_RUSTC
 	select CFI_ICALL_NORMALIZE_INTEGERS if CFI
-	depends on !CALL_PADDING || RUSTC_VERSION >= 108100
 	depends on !KASAN_SW_TAGS
-	depends on !(MITIGATION_RETHUNK && KASAN) || RUSTC_VERSION >= 108300
 	help
 	  Enables Rust support in the kernel.
 
Signature · 1 line
2.53.0
author maintainer
#18 lore raw

PATCH v2 9/33 rust: remove `RUSTC_HAS_SLICE_AS_FLATTENED` and simplify code

In reply to Miguel Ojeda

With the Rust version bump in place, the RUSTC_HAS_SLICE_AS_FLATTENED Kconfig (automatic) option is always true.

Thus remove the option and simplify the code.

In particular, this includes removing the slice module which contained the temporary slice helpers, i.e. the AsFlattened extension trait and its impls.

---
 init/Kconfig           |  3 ---
 rust/kernel/lib.rs     |  1 -
 rust/kernel/prelude.rs |  3 ---
 rust/kernel/slice.rs   | 49 ------------------------------------------
 4 files changed, 56 deletions(-)
 delete mode 100644 rust/kernel/slice.rs
init/Kconfig +0 -3
index b8a1ab0d49d4..c38f49228157 100644
@@ -178,9 +178,6 @@ config LD_CAN_USE_KEEP_IN_OVERLAY
 	# https://github.com/llvm/llvm-project/pull/130661
 	def_bool LD_IS_BFD || LLD_VERSION >= 210000
 
-config RUSTC_HAS_SLICE_AS_FLATTENED
-	def_bool RUSTC_VERSION >= 108000
-
 config RUSTC_HAS_COERCE_POINTEE
 	def_bool RUSTC_VERSION >= 108400
 
rust/kernel/lib.rs +0 -1
index 138d846f798d..621cae75030c 100644
@@ -140,7 +140,6 @@
 pub mod security;
 pub mod seq_file;
 pub mod sizes;
-pub mod slice;
 #[cfg(CONFIG_SOC_BUS)]
 pub mod soc;
 #[doc(hidden)]
rust/kernel/prelude.rs +0 -3
index e9d37f307f2a..44edf72a4a24 100644
@@ -107,6 +107,3 @@
 // `super::std_vendor` is hidden, which makes the macro inline for some reason.
 #[doc(no_inline)]
 pub use super::dbg;
-
-#[cfg(not(CONFIG_RUSTC_HAS_SLICE_AS_FLATTENED))]
-pub use super::slice::AsFlattened;
rust/kernel/slice.rs deleted +0 -49

49 lines not on this page · raw message

Signature · 1 line
2.53.0
author maintainer
#19 lore raw

PATCH v2 10/33 rust: remove `RUSTC_HAS_COERCE_POINTEE` and simplify code

In reply to Miguel Ojeda

With the Rust version bump in place, the RUSTC_HAS_COERCE_POINTEE Kconfig (automatic) option is always true.

Thus remove the option and simplify the code.

In particular, this includes removing our use of the predecessor unstable features we used with Rust < 1.84.0 (coerce_unsized, dispatch_from_dyn and unsize).

---
 init/Kconfig              |  3 ---
 rust/kernel/alloc/kbox.rs | 29 ++---------------------------
 rust/kernel/lib.rs        |  8 +-------
 rust/kernel/list/arc.rs   | 22 +---------------------
 rust/kernel/sync/arc.rs   | 21 ++-------------------
 5 files changed, 6 insertions(+), 77 deletions(-)
init/Kconfig +0 -3
index c38f49228157..f9fac458e4d4 100644
@@ -178,9 +178,6 @@ config LD_CAN_USE_KEEP_IN_OVERLAY
 	# https://github.com/llvm/llvm-project/pull/130661
 	def_bool LD_IS_BFD || LLD_VERSION >= 210000
 
-config RUSTC_HAS_COERCE_POINTEE
-	def_bool RUSTC_VERSION >= 108400
-
 config RUSTC_HAS_SPAN_FILE
 	def_bool RUSTC_VERSION >= 108800
 
rust/kernel/alloc/kbox.rs +2 -27
index 622b3529edfc..bd6da02c7ab8 100644
@@ -77,33 +77,8 @@
 /// `self.0` is always properly aligned and either points to memory allocated with `A` or, for
 /// zero-sized types, is a dangling, well aligned pointer.
 #[repr(transparent)]
-#[cfg_attr(CONFIG_RUSTC_HAS_COERCE_POINTEE, derive(core::marker::CoercePointee))]
-pub struct Box<#[cfg_attr(CONFIG_RUSTC_HAS_COERCE_POINTEE, pointee)] T: ?Sized, A: Allocator>(
-    NonNull<T>,
-    PhantomData<A>,
-);
-
-// This is to allow coercion from `Box<T, A>` to `Box<U, A>` if `T` can be converted to the
-// dynamically-sized type (DST) `U`.
-#[cfg(not(CONFIG_RUSTC_HAS_COERCE_POINTEE))]
-impl<T, U, A> core::ops::CoerceUnsized<Box<U, A>> for Box<T, A>
-where
-    T: ?Sized + core::marker::Unsize<U>,
-    U: ?Sized,
-    A: Allocator,
-{
-}
-
-// This is to allow `Box<U, A>` to be dispatched on when `Box<T, A>` can be coerced into `Box<U,
-// A>`.
-#[cfg(not(CONFIG_RUSTC_HAS_COERCE_POINTEE))]
-impl<T, U, A> core::ops::DispatchFromDyn<Box<U, A>> for Box<T, A>
-where
-    T: ?Sized + core::marker::Unsize<U>,
-    U: ?Sized,
-    A: Allocator,
-{
-}
+#[derive(core::marker::CoercePointee)]
+pub struct Box<#[pointee] T: ?Sized, A: Allocator>(NonNull<T>, PhantomData<A>);
 
 /// Type alias for [`Box`] with a [`Kmalloc`] allocator.
 ///
rust/kernel/lib.rs +1 -7
index 621cae75030c..66a09d77a2c4 100644
@@ -39,17 +39,11 @@
 //
 // Expected to become stable.
 #![feature(arbitrary_self_types)]
+#![feature(derive_coerce_pointee)]
 //
 // To be determined.
 #![feature(used_with_arg)]
 //
-// `feature(derive_coerce_pointee)` is expected to become stable. Before Rust
-// 1.84.0, it did not exist, so enable the predecessor features.
-#![cfg_attr(CONFIG_RUSTC_HAS_COERCE_POINTEE, feature(derive_coerce_pointee))]
-#![cfg_attr(not(CONFIG_RUSTC_HAS_COERCE_POINTEE), feature(coerce_unsized))]
-#![cfg_attr(not(CONFIG_RUSTC_HAS_COERCE_POINTEE), feature(dispatch_from_dyn))]
-#![cfg_attr(not(CONFIG_RUSTC_HAS_COERCE_POINTEE), feature(unsize))]
-//
 // `feature(file_with_nul)` is expected to become stable. Before Rust 1.89.0, it did not exist, so
 // enable it conditionally.
 #![cfg_attr(CONFIG_RUSTC_HAS_FILE_WITH_NUL, feature(file_with_nul))]
rust/kernel/list/arc.rs +1 -21
index e1082423909c..a9a2b0178f65 100644
@@ -160,7 +160,7 @@ fn try_new_list_arc(&self) -> bool {
 ///
 /// [`List`]: crate::list::List
 #[repr(transparent)]
-#[cfg_attr(CONFIG_RUSTC_HAS_COERCE_POINTEE, derive(core::marker::CoercePointee))]
+#[derive(core::marker::CoercePointee)]
 pub struct ListArc<T, const ID: u64 = 0>
 where
     T: ListArcSafe<ID> + ?Sized,
@@ -443,26 +443,6 @@ fn as_ref(&self) -> &Arc<T> {
     }
 }
 
-// This is to allow coercion from `ListArc<T>` to `ListArc<U>` if `T` can be converted to the
-// dynamically-sized type (DST) `U`.
-#[cfg(not(CONFIG_RUSTC_HAS_COERCE_POINTEE))]
-impl<T, U, const ID: u64> core::ops::CoerceUnsized<ListArc<U, ID>> for ListArc<T, ID>
-where
-    T: ListArcSafe<ID> + core::marker::Unsize<U> + ?Sized,
-    U: ListArcSafe<ID> + ?Sized,
-{
-}
-
-// This is to allow `ListArc<U>` to be dispatched on when `ListArc<T>` can be coerced into
-// `ListArc<U>`.
-#[cfg(not(CONFIG_RUSTC_HAS_COERCE_POINTEE))]
-impl<T, U, const ID: u64> core::ops::DispatchFromDyn<ListArc<U, ID>> for ListArc<T, ID>
-where
-    T: ListArcSafe<ID> + core::marker::Unsize<U> + ?Sized,
-    U: ListArcSafe<ID> + ?Sized,
-{
-}
-
 /// A utility for tracking whether a [`ListArc`] exists using an atomic.
 ///
 /// # Invariants
rust/kernel/sync/arc.rs +2 -19
index 921e19333b89..18d6c0d62ce0 100644
@@ -128,7 +128,7 @@
 /// # Ok::<(), Error>(())
 /// ```
 #[repr(transparent)]
-#[cfg_attr(CONFIG_RUSTC_HAS_COERCE_POINTEE, derive(core::marker::CoercePointee))]
+#[derive(core::marker::CoercePointee)]
 pub struct Arc<T: ?Sized> {
     ptr: NonNull<ArcInner<T>>,
     // NB: this informs dropck that objects of type `ArcInner<T>` may be used in `<Arc<T> as
@@ -182,15 +182,6 @@ unsafe fn container_of(ptr: *const T) -> NonNull<ArcInner<T>> {
     }
 }
 
-// This is to allow coercion from `Arc<T>` to `Arc<U>` if `T` can be converted to the
-// dynamically-sized type (DST) `U`.
-#[cfg(not(CONFIG_RUSTC_HAS_COERCE_POINTEE))]
-impl<T: ?Sized + core::marker::Unsize<U>, U: ?Sized> core::ops::CoerceUnsized<Arc<U>> for Arc<T> {}
-
-// This is to allow `Arc<U>` to be dispatched on when `Arc<T>` can be coerced into `Arc<U>`.
-#[cfg(not(CONFIG_RUSTC_HAS_COERCE_POINTEE))]
-impl<T: ?Sized + core::marker::Unsize<U>, U: ?Sized> core::ops::DispatchFromDyn<Arc<U>> for Arc<T> {}
-
 // SAFETY: It is safe to send `Arc<T>` to another thread when the underlying `T` is `Sync` because
 // it effectively means sharing `&T` (which is safe because `T` is `Sync`); additionally, it needs
 // `T` to be `Send` because any thread that has an `Arc<T>` may ultimately access `T` using a
@@ -547,20 +538,12 @@ fn from(item: Pin<UniqueArc<T>>) -> Self {
 /// # Ok::<(), Error>(())
 /// ```
 #[repr(transparent)]
-#[cfg_attr(CONFIG_RUSTC_HAS_COERCE_POINTEE, derive(core::marker::CoercePointee))]
+#[derive(core::marker::CoercePointee)]
 pub struct ArcBorrow<'a, T: ?Sized + 'a> {
     inner: NonNull<ArcInner<T>>,
     _p: PhantomData<&'a ()>,
 }
 
-// This is to allow `ArcBorrow<U>` to be dispatched on when `ArcBorrow<T>` can be coerced into
-// `ArcBorrow<U>`.
-#[cfg(not(CONFIG_RUSTC_HAS_COERCE_POINTEE))]
-impl<T: ?Sized + core::marker::Unsize<U>, U: ?Sized> core::ops::DispatchFromDyn<ArcBorrow<'_, U>>
-    for ArcBorrow<'_, T>
-{
-}
-
 impl<T: ?Sized> Clone for ArcBorrow<'_, T> {
     fn clone(&self) -> Self {
         *self
Signature · 1 line
2.53.0
author maintainer
#20 lore raw

PATCH v2 11/33 rust: kbuild: remove skipping of `-Wrustdoc::unescaped_backticks`

In reply to Miguel Ojeda

Back in Rust 1.82.0, I cleaned the rustdoc::unescaped_backticks lint in upstream Rust and added tests so that hopefully it would not regress [1].

Thus we can remove it from our side given the Rust minimum version bump.

---
 rust/Makefile | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)
rust/Makefile +1 -4
index 16ea720e0a8e..5dc8b4cc89d1 100644
@@ -75,8 +75,7 @@ core-edition := $(if $(call rustc-min-version,108700),2024,2021)
 
 core-skip_flags := \
     --edition=2021 \
-    -Wunreachable_pub \
-    -Wrustdoc::unescaped_backticks
+    -Wunreachable_pub
 
 core-flags := \
     --edition=$(core-edition) \
@@ -209,8 +208,6 @@ rustdoc-macros: $(src)/macros/lib.rs rustdoc-clean rustdoc-proc_macro2 \
     rustdoc-quote rustdoc-syn FORCE
 	+$(call if_changed,rustdoc)
 
-# Starting with Rust 1.82.0, skipping `-Wrustdoc::unescaped_backticks` should
-# not be needed -- see https://github.com/rust-lang/rust/pull/128307.
 rustdoc-core: private skip_flags = $(core-skip_flags)
 rustdoc-core: private rustc_target_flags = $(core-flags)
 rustdoc-core: $(RUST_LIB_SRC)/core/src/lib.rs rustdoc-clean FORCE
Signature · 1 line
2.53.0
author maintainer
#21 lore raw

PATCH v2 12/33 rust: kbuild: remove `feature(...)`s that are now stable

In reply to Miguel Ojeda

Now that the Rust minimum version is 1.85.0, there is no need to enable certain features that are stable.

Thus clean them up.

---
 rust/Makefile          |  2 --
 rust/kernel/lib.rs     | 21 ---------------------
 scripts/Makefile.build |  6 +-----
 3 files changed, 1 insertion(+), 28 deletions(-)
rust/Makefile +0 -2
index 5dc8b4cc89d1..54498cb5b851 100644
@@ -86,10 +86,8 @@ proc_macro2-cfgs := \
     wrap_proc_macro \
     $(if $(call rustc-min-version,108800),proc_macro_span_file proc_macro_span_location)
 
-# Stable since Rust 1.79.0: `feature(proc_macro_byte_character,proc_macro_c_str_literals)`.
 proc_macro2-flags := \
     --cap-lints=allow \
-    -Zcrate-attr='feature(proc_macro_byte_character,proc_macro_c_str_literals)' \
     $(call cfgs-to-flags,$(proc_macro2-cfgs))
 
 quote-cfgs := \
rust/kernel/lib.rs +0 -21
index 66a09d77a2c4..b48221a5b4ec 100644
@@ -16,27 +16,6 @@
 // Please see https://github.com/Rust-for-Linux/linux/issues/2 for details on
 // the unstable features in use.
 //
-// Stable since Rust 1.79.0.
-#![feature(generic_nonzero)]
-#![feature(inline_const)]
-#![feature(pointer_is_aligned)]
-//
-// Stable since Rust 1.80.0.
-#![feature(slice_flatten)]
-//
-// Stable since Rust 1.81.0.
-#![feature(lint_reasons)]
-//
-// Stable since Rust 1.82.0.
-#![feature(raw_ref_op)]
-//
-// Stable since Rust 1.83.0.
-#![feature(const_maybe_uninit_as_mut_ptr)]
-#![feature(const_mut_refs)]
-#![feature(const_option)]
-#![feature(const_ptr_write)]
-#![feature(const_refs_to_cell)]
-//
 // Expected to become stable.
 #![feature(arbitrary_self_types)]
 #![feature(derive_coerce_pointee)]
scripts/Makefile.build +1 -5
index 0b0245106d01..57cff77c2897 100644
@@ -310,17 +310,13 @@ $(obj)/%.lst: $(obj)/%.c FORCE
 
 # The features in this list are the ones allowed for non-`rust/` code.
 #
-#   - Stable since Rust 1.79.0: `feature(inline_const)`.
-#   - Stable since Rust 1.81.0: `feature(lint_reasons)`.
-#   - Stable since Rust 1.82.0: `feature(asm_const)`,
-#     `feature(offset_of_nested)`, `feature(raw_ref_op)`.
 #   - Stable since Rust 1.87.0: `feature(asm_goto)`.
 #   - Expected to become stable: `feature(arbitrary_self_types)`.
 #   - To be determined: `feature(used_with_arg)`.
 #
 # Please see https://github.com/Rust-for-Linux/linux/issues/2 for details on
 # the unstable features in use.
-rust_allowed_features := asm_const,asm_goto,arbitrary_self_types,inline_const,lint_reasons,offset_of_nested,raw_ref_op,used_with_arg
+rust_allowed_features := arbitrary_self_types,asm_goto,used_with_arg
 
 # `--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
Signature · 1 line
2.53.0
author maintainer
#22 lore raw

PATCH v2 13/33 rust: transmute: simplify code with Rust 1.80.0 `split_at_*checked()`

In reply to Miguel Ojeda

feature(split_at_checked) [1] has been stabilized in Rust 1.80.0 [2], which is older than our new minimum Rust version (Rust 1.85.0).

Thus simplify the code using split_at_*checked().

---
 rust/kernel/transmute.rs | 33 ++++++---------------------------
 1 file changed, 6 insertions(+), 27 deletions(-)
rust/kernel/transmute.rs +6 -27
index b9e6eadc08f5..654b5ede2fe2 100644
@@ -66,16 +66,9 @@ fn from_bytes_prefix(bytes: &[u8]) -> Option<(&Self, &[u8])>
     where
         Self: Sized,
     {
-        if bytes.len() < size_of::<Self>() {
-            None
-        } else {
-            // PANIC: We checked that `bytes.len() >= size_of::<Self>`, thus `split_at` cannot
-            // panic.
-            // TODO: replace with `split_at_checked` once the MSRV is >= 1.80.
-            let (prefix, remainder) = bytes.split_at(size_of::<Self>());
+        let (prefix, remainder) = bytes.split_at_checked(size_of::<Self>())?;
 
-            Self::from_bytes(prefix).map(|s| (s, remainder))
-        }
+        Self::from_bytes(prefix).map(|s| (s, remainder))
     }
 
     /// Converts a mutable slice of bytes to a reference to `Self`.
@@ -108,16 +101,9 @@ fn from_bytes_mut_prefix(bytes: &mut [u8]) -> Option<(&mut Self, &mut [u8])>
     where
         Self: AsBytes + Sized,
     {
-        if bytes.len() < size_of::<Self>() {
-            None
-        } else {
-            // PANIC: We checked that `bytes.len() >= size_of::<Self>`, thus `split_at_mut` cannot
-            // panic.
-            // TODO: replace with `split_at_mut_checked` once the MSRV is >= 1.80.
-            let (prefix, remainder) = bytes.split_at_mut(size_of::<Self>());
+        let (prefix, remainder) = bytes.split_at_mut_checked(size_of::<Self>())?;
 
-            Self::from_bytes_mut(prefix).map(|s| (s, remainder))
-        }
+        Self::from_bytes_mut(prefix).map(|s| (s, remainder))
     }
 
     /// Creates an owned instance of `Self` by copying `bytes`.
@@ -147,16 +133,9 @@ fn from_bytes_copy_prefix(bytes: &[u8]) -> Option<(Self, &[u8])>
     where
         Self: Sized,
     {
-        if bytes.len() < size_of::<Self>() {
-            None
-        } else {
-            // PANIC: We checked that `bytes.len() >= size_of::<Self>`, thus `split_at` cannot
-            // panic.
-            // TODO: replace with `split_at_checked` once the MSRV is >= 1.80.
-            let (prefix, remainder) = bytes.split_at(size_of::<Self>());
+        let (prefix, remainder) = bytes.split_at_checked(size_of::<Self>())?;
 
-            Self::from_bytes_copy(prefix).map(|s| (s, remainder))
-        }
+        Self::from_bytes_copy(prefix).map(|s| (s, remainder))
     }
 }
 
Signature · 1 line
2.53.0
author maintainer
#23 lore raw

PATCH v2 14/33 rust: alloc: simplify with `NonNull::add()` now that it is stable

In reply to Miguel Ojeda

Currently, we need to go through raw pointers and then re-create the NonNull from the result of offsetting the raw pointer.

feature(non_null_convenience) [1] has been stabilized in Rust 1.80.0 [2], which is older than our new minimum Rust version (Rust 1.85.0).

Thus, now that we bump the Rust minimum version, simplify using NonNull::add() and clean the TODO note.

---
 rust/kernel/alloc/allocator/iter.rs | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)
rust/kernel/alloc/allocator/iter.rs +1 -7
index 5759f86029b7..e0a70b7a744a 100644
@@ -42,15 +42,9 @@ fn next(&mut self) -> Option<Self::Item> {
             return None;
         }
 
-        // TODO: Use `NonNull::add()` instead, once the minimum supported compiler version is
-        // bumped to 1.80 or later.
-        //
         // SAFETY: `offset` is in the interval `[0, (self.page_count() - 1) * page::PAGE_SIZE]`,
         // hence the resulting pointer is guaranteed to be within the same allocation.
-        let ptr = unsafe { self.buf.as_ptr().add(offset) };
-
-        // SAFETY: `ptr` is guaranteed to be non-null given that it is derived from `self.buf`.
-        let ptr = unsafe { NonNull::new_unchecked(ptr) };
+        let ptr = unsafe { self.buf.add(offset) };
 
         // SAFETY:
         // - `ptr` is a valid pointer to a `Vmalloc` allocation.
Signature · 1 line
2.53.0
author maintainer
#24 lore raw

PATCH v2 15/33 rust: macros: simplify code using `feature(extract_if)`

In reply to Miguel Ojeda

feature(extract_if) [1] was stabilized in Rust 1.87.0 [2], and the last significant change happened in Rust 1.85.0 [3] when the range parameter was added.

That is, with our new minimum version, we can start using the feature.

Thus simplify the code using the feature and remove the TODO comment.

---
 rust/macros/kunit.rs | 9 +++++----
 rust/macros/lib.rs   | 3 +++
 2 files changed, 8 insertions(+), 4 deletions(-)
rust/macros/kunit.rs +5 -4
index 6be880d634e2..ae20ed6768f1 100644
@@ -87,10 +87,11 @@ pub(crate) fn kunit_tests(test_suite: Ident, mut module: ItemMod) -> Result<Toke
             continue;
         };
 
-        // TODO: Replace below with `extract_if` when MSRV is bumped above 1.85.
-        let before_len = f.attrs.len();
-        f.attrs.retain(|attr| !attr.path().is_ident("test"));
-        if f.attrs.len() == before_len {
+        if f.attrs
+            .extract_if(.., |attr| attr.path().is_ident("test"))
+            .count()
+            == 0
+        {
             processed_items.push(Item::Fn(f));
             continue;
         }
rust/macros/lib.rs +3 -0
index 0c36194d9971..2cfd59e0f9e7 100644
@@ -6,6 +6,9 @@
 // and thus add a dependency on `include/config/RUSTC_VERSION_TEXT`, which is
 // touched by Kconfig when the version string from the compiler changes.
 
+// Stable since Rust 1.87.0.
+#![feature(extract_if)]
+//
 // Stable since Rust 1.88.0 under a different name, `proc_macro_span_file`,
 // which was added in Rust 1.88.0. This is why `cfg_attr` is used here, i.e.
 // to avoid depending on the full `proc_macro_span` on Rust >= 1.88.0.
Signature · 1 line
2.53.0
reviewer Reviewed-by on v2 15/33
#25 lore raw

Re: [PATCH v2 15/33] rust: macros: simplify code using `feature(extract_if)`

Quoted 9 lines · Miguel Ojeda

feature(extract_if) [1] was stabilized in Rust 1.87.0 [2], and the last significant change happened in Rust 1.85.0 [3] when the range parameter was added.

That is, with our new minimum version, we can start using the feature.

Thus simplify the code using the feature and remove the TODO comment.

[...]

Signature · 1 line
Tamir Duberstein <[email protected]>
author maintainer
#26 lore raw

PATCH v2 16/33 rust: block: update `const_refs_to_static` MSRV TODO comment

In reply to Miguel Ojeda

feature(const_refs_to_static) was stabilized in Rust 1.83.0 [1].

Thus update the comment to reflect that.

---
 rust/kernel/block/mq/gen_disk.rs | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)
rust/kernel/block/mq/gen_disk.rs +1 -3
index c8b0ecb17082..912cb805caf5 100644
@@ -140,9 +140,7 @@ pub fn build<T: Operations>(
             devnode: None,
             alternative_gpt_sector: None,
             get_unique_id: None,
-            // TODO: Set to THIS_MODULE. Waiting for const_refs_to_static feature to
-            // be merged (unstable in rustc 1.78 which is staged for linux 6.10)
-            // <https://github.com/rust-lang/rust/issues/119618>
+            // TODO: Set to `THIS_MODULE`.
             owner: core::ptr::null_mut(),
             pr_ops: core::ptr::null_mut(),
             free_disk: None,
Signature · 1 line
2.53.0
author maintainer
#27 lore raw

PATCH v2 17/33 rust: bump `bindgen` minimum supported version to 0.71.1 (Debian Trixie)

In reply to Miguel Ojeda

As proposed in the past in e.g. LPC 2025 and the Maintainers Summit [1], we are going to follow Debian Stable's bindgen versions as our minimum supported version.

Debian Trixie was released with bindgen 0.71.1, which it still uses to this day [2].

Debian Trixie's release happened on 2025-08-09 [3], which means that a fair amount of time has passed since its release for kernel developers to upgrade.

Thus bump the minimum to the new version.

Then, in later commits, clean up most of the workarounds and other bits that this upgrade of the minimum allows us.

Ubuntu 25.10 also has a recent enough bindgen [4] (even the already unsupported Ubuntu 25.04 had it), and they also provide versioned packages with bindgen 0.71.1 back to Ubuntu 24.04 LTS [5].

---
 Documentation/process/changes.rst | 2 +-
 scripts/min-tool-version.sh       | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
Documentation/process/changes.rst +1 -1
index 474594bd4831..84156d031365 100644
@@ -32,7 +32,7 @@ you probably needn't concern yourself with pcmciautils.
 GNU C                  8.1              gcc --version
 Clang/LLVM (optional)  15.0.0           clang --version
 Rust (optional)        1.85.0           rustc --version
-bindgen (optional)     0.65.1           bindgen --version
+bindgen (optional)     0.71.1           bindgen --version
 GNU make               4.0              make --version
 bash                   4.2              bash --version
 binutils               2.30             ld -v
scripts/min-tool-version.sh +1 -1
index a270ec761f64..b96ec2d379b6 100755
@@ -34,7 +34,7 @@ rustc)
 	echo 1.85.0
 	;;
 bindgen)
-	echo 0.65.1
+	echo 0.71.1
 	;;
 *)
 	echo "$1: unknown tool" >&2
Signature · 1 line
2.53.0
author maintainer
#28 lore raw

PATCH v2 18/33 rust: rust_is_available: remove warning for `bindgen` 0.66.[01]

In reply to Miguel Ojeda

It is not possible anymore to fall into the issue that this warning was alerting about given the bindgen version bump.

Thus simplify by removing the machinery behind it, including tests.

---
 scripts/rust_is_available.sh             | 13 ------------
 scripts/rust_is_available_bindgen_0_66.h |  2 --
 scripts/rust_is_available_test.py        | 26 +++---------------------
 3 files changed, 3 insertions(+), 38 deletions(-)
 delete mode 100644 scripts/rust_is_available_bindgen_0_66.h
scripts/rust_is_available.sh +0 -13
index d2323de0692c..77896e31dab5 100755
@@ -163,19 +163,6 @@ if [ "$rust_bindings_generator_cversion" -lt "$rust_bindings_generator_min_cvers
 	echo >&2 "***"
 	exit 1
 fi
-if [ "$rust_bindings_generator_cversion" -eq 6600 ] ||
-	[ "$rust_bindings_generator_cversion" -eq 6601 ]; then
-	# Distributions may have patched the issue (e.g. Debian did).
-	if ! "$BINDGEN" $(dirname $0)/rust_is_available_bindgen_0_66.h >/dev/null; then
-		echo >&2 "***"
-		echo >&2 "*** Rust bindings generator '$BINDGEN' versions 0.66.0 and 0.66.1 may not"
-		echo >&2 "*** work due to a bug (https://github.com/rust-lang/rust-bindgen/pull/2567),"
-		echo >&2 "*** unless patched (like Debian's)."
-		echo >&2 "***   Your version:     $rust_bindings_generator_version"
-		echo >&2 "***"
-		warning=1
-	fi
-fi
 
 # Check that the `libclang` used by the Rust bindings generator is suitable.
 #
scripts/rust_is_available_bindgen_0_66.h deleted +0 -2
deleted file mode 100644
index c0431293421c..000000000000
@@ -1,2 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#define A "\0"
scripts/rust_is_available_test.py +3 -23
index 4fcc319dea84..b66fa5933844 100755
@@ -54,17 +54,12 @@ else:
 """)
 
     @classmethod
-    def generate_bindgen(cls, version_stdout, libclang_stderr, version_0_66_patched=False, libclang_concat_patched=False):
+    def generate_bindgen(cls, version_stdout, libclang_stderr, libclang_concat_patched=False):
         if libclang_stderr is None:
             libclang_case = f"raise SystemExit({cls.bindgen_default_bindgen_libclang_failure_exit_code})"
         else:
             libclang_case = f"print({repr(libclang_stderr)}, file=sys.stderr)"
 
-        if version_0_66_patched:
-            version_0_66_case = "pass"
-        else:
-            version_0_66_case = "raise SystemExit(1)"
-
         if libclang_concat_patched:
             libclang_concat_case = "print('pub static mut foofoo: ::std::os::raw::c_int;')"
         else:
@@ -74,8 +69,6 @@ else:
 import sys
 if "rust_is_available_bindgen_libclang.h" in " ".join(sys.argv):
     {libclang_case}
-elif "rust_is_available_bindgen_0_66.h" in " ".join(sys.argv):
-    {version_0_66_case}
 elif "rust_is_available_bindgen_libclang_concat.h" in " ".join(sys.argv):
     {libclang_concat_case}
 else:
@@ -83,8 +76,8 @@ else:
 """)
 
     @classmethod
-    def generate_bindgen_version(cls, stdout, version_0_66_patched=False):
-        return cls.generate_bindgen(stdout, cls.bindgen_default_bindgen_libclang_stderr, version_0_66_patched)
+    def generate_bindgen_version(cls, stdout):
+        return cls.generate_bindgen(stdout, cls.bindgen_default_bindgen_libclang_stderr)
 
     @classmethod
     def generate_bindgen_libclang_failure(cls):
@@ -245,19 +238,6 @@ else:
         result = self.run_script(self.Expected.FAILURE, { "BINDGEN": bindgen })
         self.assertIn(f"Rust bindings generator '{bindgen}' is too old.", result.stderr)
 
-    def test_bindgen_bad_version_0_66_0_and_0_66_1(self):
-        for version in ("0.66.0", "0.66.1"):
-            with self.subTest(version=version):
-                bindgen = self.generate_bindgen_version(f"bindgen {version}")
-                result = self.run_script(self.Expected.SUCCESS_WITH_WARNINGS, { "BINDGEN": bindgen })
-                self.assertIn(f"Rust bindings generator '{bindgen}' versions 0.66.0 and 0.66.1 may not", result.stderr)
-
-    def test_bindgen_bad_version_0_66_0_and_0_66_1_patched(self):
-        for version in ("0.66.0", "0.66.1"):
-            with self.subTest(version=version):
-                bindgen = self.generate_bindgen_version(f"bindgen {version}", True)
-                result = self.run_script(self.Expected.SUCCESS, { "BINDGEN": bindgen })
-
     def test_bindgen_libclang_failure(self):
         bindgen = self.generate_bindgen_libclang_failure()
         result = self.run_script(self.Expected.FAILURE, { "BINDGEN": bindgen })
Signature · 1 line
2.53.0
author maintainer
#29 lore raw

PATCH v2 19/33 rust: rust_is_available: remove warning for `bindgen` < 0.69.5 && libclang >= 19.1

In reply to Miguel Ojeda

It is not possible anymore to fall into the issue that this warning was alerting about given the bindgen version bump.

Thus simplify by removing the machinery behind it, including tests.

---
 scripts/rust_is_available.sh                  | 15 --------
 ...ust_is_available_bindgen_libclang_concat.h |  3 --
 scripts/rust_is_available_test.py             | 34 +------------------
 3 files changed, 1 insertion(+), 51 deletions(-)
 delete mode 100644 scripts/rust_is_available_bindgen_libclang_concat.h
scripts/rust_is_available.sh +0 -15
index 77896e31dab5..cefc456c2503 100755
@@ -214,21 +214,6 @@ if [ "$bindgen_libclang_cversion" -lt "$bindgen_libclang_min_cversion" ]; then
 	exit 1
 fi
 
-if [ "$bindgen_libclang_cversion" -ge 1900100 ] &&
-	[ "$rust_bindings_generator_cversion" -lt 6905 ]; then
-	# Distributions may have patched the issue (e.g. Debian did).
-	if ! "$BINDGEN" $(dirname $0)/rust_is_available_bindgen_libclang_concat.h | grep -q foofoo; then
-		echo >&2 "***"
-		echo >&2 "*** Rust bindings generator '$BINDGEN' < 0.69.5 together with libclang >= 19.1"
-		echo >&2 "*** may not work due to a bug (https://github.com/rust-lang/rust-bindgen/pull/2824),"
-		echo >&2 "*** unless patched (like Debian's)."
-		echo >&2 "***   Your bindgen version:  $rust_bindings_generator_version"
-		echo >&2 "***   Your libclang version: $bindgen_libclang_version"
-		echo >&2 "***"
-		warning=1
-	fi
-fi
-
 # If the C compiler is Clang, then we can also check whether its version
 # matches the `libclang` version used by the Rust bindings generator.
 #
scripts/rust_is_available_bindgen_libclang_concat.h deleted +0 -3
deleted file mode 100644
index efc6e98d0f1d..000000000000
@@ -1,3 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#define F(x) int x##x
-F(foo);
scripts/rust_is_available_test.py +1 -33
index b66fa5933844..d6d54b7ea42a 100755
@@ -54,23 +54,16 @@ else:
 """)
 
     @classmethod
-    def generate_bindgen(cls, version_stdout, libclang_stderr, libclang_concat_patched=False):
+    def generate_bindgen(cls, version_stdout, libclang_stderr):
         if libclang_stderr is None:
             libclang_case = f"raise SystemExit({cls.bindgen_default_bindgen_libclang_failure_exit_code})"
         else:
             libclang_case = f"print({repr(libclang_stderr)}, file=sys.stderr)"
 
-        if libclang_concat_patched:
-            libclang_concat_case = "print('pub static mut foofoo: ::std::os::raw::c_int;')"
-        else:
-            libclang_concat_case = "pass"
-
         return cls.generate_executable(f"""#!/usr/bin/env python3
 import sys
 if "rust_is_available_bindgen_libclang.h" in " ".join(sys.argv):
     {libclang_case}
-elif "rust_is_available_bindgen_libclang_concat.h" in " ".join(sys.argv):
-    {libclang_concat_case}
 else:
     print({repr(version_stdout)})
 """)
@@ -255,31 +248,6 @@ else:
         result = self.run_script(self.Expected.FAILURE, { "BINDGEN": bindgen })
         self.assertIn(f"libclang (used by the Rust bindings generator '{bindgen}') is too old.", result.stderr)
 
-    def test_bindgen_bad_libclang_concat(self):
-        for (bindgen_version, libclang_version, expected_not_patched) in (
-            ("0.69.4", "18.0.0", self.Expected.SUCCESS),
-            ("0.69.4", "19.1.0", self.Expected.SUCCESS_WITH_WARNINGS),
-            ("0.69.4", "19.2.0", self.Expected.SUCCESS_WITH_WARNINGS),
-
-            ("0.69.5", "18.0.0", self.Expected.SUCCESS),
-            ("0.69.5", "19.1.0", self.Expected.SUCCESS),
-            ("0.69.5", "19.2.0", self.Expected.SUCCESS),
-
-            ("0.70.0", "18.0.0", self.Expected.SUCCESS),
-            ("0.70.0", "19.1.0", self.Expected.SUCCESS),
-            ("0.70.0", "19.2.0", self.Expected.SUCCESS),
-        ):
-            with self.subTest(bindgen_version=bindgen_version, libclang_version=libclang_version):
-                cc = self.generate_clang(f"clang version {libclang_version}")
-                libclang_stderr = f"scripts/rust_is_available_bindgen_libclang.h:2:9: warning: clang version {libclang_version} [-W#pragma-messages], err: false"
-                bindgen = self.generate_bindgen(f"bindgen {bindgen_version}", libclang_stderr)
-                result = self.run_script(expected_not_patched, { "BINDGEN": bindgen, "CC": cc })
-                if expected_not_patched == self.Expected.SUCCESS_WITH_WARNINGS:
-                    self.assertIn(f"Rust bindings generator '{bindgen}' < 0.69.5 together with libclang >= 19.1", result.stderr)
-
-                bindgen = self.generate_bindgen(f"bindgen {bindgen_version}", libclang_stderr, libclang_concat_patched=True)
-                result = self.run_script(self.Expected.SUCCESS, { "BINDGEN": bindgen, "CC": cc })
-
     def test_clang_matches_bindgen_libclang_different_bindgen(self):
         bindgen = self.generate_bindgen_libclang("scripts/rust_is_available_bindgen_libclang.h:2:9: warning: clang version 999.0.0 [-W#pragma-messages], err: false")
         result = self.run_script(self.Expected.SUCCESS_WITH_WARNINGS, { "BINDGEN": bindgen })
Signature · 1 line
2.53.0
author maintainer
#30 lore raw

PATCH v2 20/33 rust: kbuild: update `bindgen --rust-target` version and replace comment

In reply to Miguel Ojeda

As the comment in the Makefile explains, previously, we needed to limit ourselves to the list of Rust versions known by bindgen for its --rust-target option [1].

In other words, we needed to consult the versions known by the minimum version of bindgen that we supported.

Now that we bumped the minimum version of bindgen, that limitation does not apply anymore since bindgen 0.71.0 [2].

Thus replace the comment and simply write our minimum supported Rust version there, which is much simpler.

See commit 7a5f93ea5862 ("rust: kbuild: set bindgen's Rust target version") for more details.

---
 rust/Makefile | 16 ++--------------
 1 file changed, 2 insertions(+), 14 deletions(-)
rust/Makefile +2 -14
index 54498cb5b851..866f9afc1b7f 100644
@@ -441,22 +441,10 @@ endif
 # architecture instead of generating `usize`.
 bindgen_c_flags_final = $(bindgen_c_flags_lto) -fno-builtin -D__BINDGEN__
 
-# Each `bindgen` release may upgrade the list of Rust target versions. By
-# default, the highest stable release in their list is used. Thus we need to set
-# a `--rust-target` to avoid future `bindgen` releases emitting code that
-# `rustc` may not understand. On top of that, `bindgen` does not support passing
-# an unknown Rust target version.
-#
-# Therefore, the Rust target for `bindgen` can be only as high as the minimum
-# Rust version the kernel supports and only as high as the greatest stable Rust
-# target supported by the minimum `bindgen` version the kernel supports (that
-# is, if we do not test the actual `rustc`/`bindgen` versions running).
-#
-# Starting with `bindgen` 0.71.0, we will be able to set any future Rust version
-# instead, i.e. we will be able to set here our minimum supported Rust version.
+# `--rust-target` points to our minimum supported Rust version.
 quiet_cmd_bindgen = BINDGEN $@
       cmd_bindgen = \
-	$(BINDGEN) $< $(bindgen_target_flags) --rust-target 1.68 \
+	$(BINDGEN) $< $(bindgen_target_flags) --rust-target 1.85 \
 		--use-core --with-derive-default --ctypes-prefix ffi --no-layout-tests \
 		--no-debug '.*' --enable-function-attribute-detection \
 		-o $@ -- $(bindgen_c_flags_final) -DMODULE \
Signature · 1 line
2.53.0
author maintainer
#31 lore raw

PATCH v2 21/33 rust: kbuild: remove "dummy parameter" workaround for `bindgen` < 0.71.1

In reply to Miguel Ojeda

Until the version bump of bindgen, we needed to pass a dummy parameter to avoid failing the --version call.

Thus remove it.

---
 init/Kconfig                 | 7 +------
 scripts/rust_is_available.sh | 8 +-------
 2 files changed, 2 insertions(+), 13 deletions(-)
init/Kconfig +1 -6
index f9fac458e4d4..d9b795f70a38 100644
@@ -2211,12 +2211,7 @@ config RUSTC_VERSION_TEXT
 config BINDGEN_VERSION_TEXT
 	string
 	depends on RUST
-	# The dummy parameter `workaround-for-0.69.0` is required to support 0.69.0
-	# (https://github.com/rust-lang/rust-bindgen/pull/2678) and 0.71.0
-	# (https://github.com/rust-lang/rust-bindgen/pull/3040). It can be removed
-	# when the minimum version is upgraded past the latter (0.69.1 and 0.71.1
-	# both fixed the issue).
-	default "$(shell,$(BINDGEN) --version workaround-for-0.69.0 2>/dev/null)"
+	default "$(shell,$(BINDGEN) --version 2>/dev/null)"
 
 #
 # Place an empty function call at each tracepoint site. Can be
scripts/rust_is_available.sh +1 -7
index cefc456c2503..551f1ebd0dcb 100755
@@ -121,14 +121,8 @@ fi
 # Check that the Rust bindings generator is suitable.
 #
 # Non-stable and distributions' versions may have a version suffix, e.g. `-dev`.
-#
-# The dummy parameter `workaround-for-0.69.0` is required to support 0.69.0
-# (https://github.com/rust-lang/rust-bindgen/pull/2678) and 0.71.0
-# (https://github.com/rust-lang/rust-bindgen/pull/3040). It can be removed when
-# the minimum version is upgraded past the latter (0.69.1 and 0.71.1 both fixed
-# the issue).
 rust_bindings_generator_output=$( \
-	LC_ALL=C "$BINDGEN" --version workaround-for-0.69.0 2>/dev/null
+	LC_ALL=C "$BINDGEN" --version 2>/dev/null
 ) || rust_bindings_generator_code=$?
 if [ -n "$rust_bindings_generator_code" ]; then
 	echo >&2 "***"
Signature · 1 line
2.53.0
author maintainer
#32 lore raw

PATCH v2 22/33 docs: rust: quick-start: openSUSE provides `rust-src` package nowadays

In reply to Miguel Ojeda

Both openSUSE Tumbleweed and Slowroll provide the rust-src package nowadays [1].

Thus remove the version-specific one from the Quick Start guide.

---
 Documentation/rust/quick-start.rst | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
Documentation/rust/quick-start.rst +1 -1
index 152289f0bed2..642efce04ee8 100644
@@ -84,7 +84,7 @@ openSUSE
 openSUSE Slowroll and openSUSE Tumbleweed provide recent Rust releases and thus
 they should generally work out of the box, e.g.::
 
-	zypper install rust rust1.79-src rust-bindgen clang
+	zypper install rust rust-src rust-bindgen clang
 
 
 Ubuntu
Signature · 1 line
2.53.0
author maintainer
#33 lore raw

PATCH v2 23/33 docs: rust: quick-start: update Ubuntu versioned packages

In reply to Miguel Ojeda

Now that the minimum supported Rust version is bumped, bump the versioned Rust packages [1][2][3][4] to that version for Ubuntu in the Quick Start guide.

In addition, add "may" to the RUST_LIB_SRC line since it does not look like it is needed from a quick test in a Ubuntu 24.04 LTS container.

---
 Documentation/rust/quick-start.rst | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)
Documentation/rust/quick-start.rst +14 -14
index 642efce04ee8..54fe491deb7d 100644
@@ -112,33 +112,33 @@ Though Ubuntu 24.04 LTS and older versions still provide recent Rust
 releases, they require some additional configuration to be set, using
 the versioned packages, e.g.::
 
-	apt install rustc-1.80 rust-1.80-src bindgen-0.65 rustfmt-1.80 \
-		rust-1.80-clippy
-	ln -s /usr/lib/rust-1.80/bin/rustfmt /usr/bin/rustfmt-1.80
-	ln -s /usr/lib/rust-1.80/bin/clippy-driver /usr/bin/clippy-driver-1.80
+	apt install rustc-1.85 rust-1.85-src bindgen-0.71 rustfmt-1.85 \
+		rust-1.85-clippy
+	ln -s /usr/lib/rust-1.85/bin/rustfmt /usr/bin/rustfmt-1.85
+	ln -s /usr/lib/rust-1.85/bin/clippy-driver /usr/bin/clippy-driver-1.85
 
 None of these packages set their tools as defaults; therefore they should be
 specified explicitly, e.g.::
 
-	make LLVM=1 RUSTC=rustc-1.80 RUSTDOC=rustdoc-1.80 RUSTFMT=rustfmt-1.80 \
-		CLIPPY_DRIVER=clippy-driver-1.80 BINDGEN=bindgen-0.65
+	make LLVM=1 RUSTC=rustc-1.85 RUSTDOC=rustdoc-1.85 RUSTFMT=rustfmt-1.85 \
+		CLIPPY_DRIVER=clippy-driver-1.85 BINDGEN=bindgen-0.71
 
-Alternatively, modify the ``PATH`` variable to place the Rust 1.80 binaries
+Alternatively, modify the ``PATH`` variable to place the Rust 1.85 binaries
 first and set ``bindgen`` as the default, e.g.::
 
-	PATH=/usr/lib/rust-1.80/bin:$PATH
+	PATH=/usr/lib/rust-1.85/bin:$PATH
 	update-alternatives --install /usr/bin/bindgen bindgen \
-		/usr/bin/bindgen-0.65 100
-	update-alternatives --set bindgen /usr/bin/bindgen-0.65
+		/usr/bin/bindgen-0.71 100
+	update-alternatives --set bindgen /usr/bin/bindgen-0.71
 
-``RUST_LIB_SRC`` needs to be set when using the versioned packages, e.g.::
+``RUST_LIB_SRC`` may need to be set when using the versioned packages, e.g.::
 
-	RUST_LIB_SRC=/usr/src/rustc-$(rustc-1.80 --version | cut -d' ' -f2)/library
+	RUST_LIB_SRC=/usr/src/rustc-$(rustc-1.85 --version | cut -d' ' -f2)/library
 
 For convenience, ``RUST_LIB_SRC`` can be exported to the global environment.
 
-In addition, ``bindgen-0.65`` is available in newer releases (24.04 LTS and
-24.10), but it may not be available in older ones (20.04 LTS and 22.04 LTS),
+In addition, ``bindgen-0.71`` is available in newer releases (24.04 LTS),
+but it may not be available in older ones (20.04 LTS and 22.04 LTS),
 thus ``bindgen`` may need to be built manually (please see below).
 
 
Signature · 1 line
2.53.0
author maintainer
#34 lore raw

PATCH v2 24/33 docs: rust: quick-start: update minimum Ubuntu version

In reply to Miguel Ojeda

Ubuntu 25.04 is out of support [1], and Ubuntu 25.10 is the latest supported one.

Moreover, Ubuntu 25.10 is the first that provides a recent enough Rust given the minimum bump -- they provide 1.85.1 [2].

Thus update it.

---
 Documentation/rust/quick-start.rst | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
Documentation/rust/quick-start.rst +1 -1
index 54fe491deb7d..34c39f208333 100644
@@ -90,7 +90,7 @@ they should generally work out of the box, e.g.::
 Ubuntu
 ******
 
-25.04
+25.10
 ~~~~~
 
 The latest Ubuntu releases provide recent Rust releases and thus they should
Signature · 1 line
2.53.0
maintainer Reviewed-by on v2 24/33
#35 lore raw

Re: [PATCH v2 24/33] docs: rust: quick-start: update minimum Ubuntu version

Quoted 8 lines · Miguel Ojeda

Ubuntu 25.04 is out of support [1], and Ubuntu 25.10 is the latest supported one.

Moreover, Ubuntu 25.10 is the first that provides a recent enough Rust given the minimum bump -- they provide 1.85.1 [2].

Thus update it.

Quoted 8 lines
---
 Documentation/rust/quick-start.rst | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
Signature · 1 line
Nicolas
author maintainer
#36 lore raw

PATCH v2 25/33 docs: rust: quick-start: add Ubuntu 26.04 LTS and remove subsection title

In reply to Miguel Ojeda

Ubuntu 26.04 LTS (Resolute Raccoon) is scheduled to be released in a few weeks [1], and it has a recent enough Rust toolchain, just like Ubuntu 25.10 has [2][3].

We could update the title and the paragraph, but to simplify and to make it more consistent with the other distributions' sections, let's instead just remove that title. It will also reduce the differences later on to keep it updated. Eventually, when we remove the remaining subsection for older LTSs, Ubuntu should be a small section like the other distributions.

Thus remove the title and add the mention of Ubuntu 26.04 LTS.

---
 Documentation/rust/quick-start.rst | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)
Documentation/rust/quick-start.rst +1 -4
index 34c39f208333..db08c3a03a4f 100644
@@ -90,10 +90,7 @@ they should generally work out of the box, e.g.::
 Ubuntu
 ******
 
-25.10
-~~~~~
-
-The latest Ubuntu releases provide recent Rust releases and thus they should
+Ubuntu 25.10 and 26.04 LTS provide recent Rust releases and thus they should
 generally work out of the box, e.g.::
 
 	apt install rustc rust-src bindgen rustfmt rust-clippy
Signature · 1 line
2.53.0
maintainer Reviewed-by on v2 25/33
#37 lore raw

Re: [PATCH v2 25/33] docs: rust: quick-start: add Ubuntu 26.04 LTS and remove subsection title

Quoted 13 lines · Miguel Ojeda

Ubuntu 26.04 LTS (Resolute Raccoon) is scheduled to be released in a few weeks [1], and it has a recent enough Rust toolchain, just like Ubuntu 25.10 has [2][3].

We could update the title and the paragraph, but to simplify and to make it more consistent with the other distributions' sections, let's instead just remove that title. It will also reduce the differences later on to keep it updated. Eventually, when we remove the remaining subsection for older LTSs, Ubuntu should be a small section like the other distributions.

Thus remove the title and add the mention of Ubuntu 26.04 LTS.

Quoted 9 lines
---
 Documentation/rust/quick-start.rst | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)
Signature · 1 line
Nicolas
author maintainer
#38 lore raw

PATCH v2 26/33 docs: rust: quick-start: remove Gentoo "testing" note

In reply to Miguel Ojeda

Gentoo does not need the "testing" note, since its packages are recent enough even in the stable branch [1][2].

Thus remove it to simplify the documentation.

---
 Documentation/rust/quick-start.rst | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
Documentation/rust/quick-start.rst +2 -2
index db08c3a03a4f..1518367324fe 100644
@@ -57,8 +57,8 @@ of the box, e.g.::
 Gentoo Linux
 ************
 
-Gentoo Linux (and especially the testing branch) provides recent Rust releases
-and thus it should generally work out of the box, e.g.::
+Gentoo Linux provides recent Rust releases and thus it should generally work out
+of the box, e.g.::
 
 	USE='rust-src rustfmt clippy' emerge dev-lang/rust dev-util/bindgen
 
Signature · 1 line
2.53.0
author maintainer
#39 lore raw

PATCH v2 27/33 docs: rust: quick-start: remove Nix "unstable channel" note

In reply to Miguel Ojeda

Nix does not need the "unstable channel" note, since its packages are recent enough even in the stable channel [1][2].

Thus remove it to simplify the documentation.

---
 Documentation/rust/quick-start.rst | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
Documentation/rust/quick-start.rst +2 -2
index 1518367324fe..5bbe059a8fa3 100644
@@ -68,8 +68,8 @@ of the box, e.g.::
 Nix
 ***
 
-Nix (unstable channel) provides recent Rust releases and thus it should
-generally work out of the box, e.g.::
+Nix provides recent Rust releases and thus it should generally work out of the
+box, e.g.::
 
 	{ pkgs ? import <nixpkgs> {} }:
 	pkgs.mkShell {
Signature · 1 line
2.53.0
author maintainer
#40 lore raw

PATCH v2 28/33 docs: rust: quick-start: remove GDB/Binutils mention

In reply to Miguel Ojeda

The versions provided nowadays by even a distribution like Debian Stable (and Debian Old Stable) are newer than those mentioned [1].

Thus remove the workaround.

Note that the minimum binutils version in the kernel is still 2.30, so one could argue part of the note is still relevant, but it is unlikely a kernel developer using such an old binutils is enabling Rust on a modern kernel, especially when using distribution toolchains, e.g. the Rust minimum version is not satisfied by Debian Old Stable.

So we are at the point where keeping the docs short and relevant for essentially everyone is probably the better trade-off.

---
 Documentation/rust/quick-start.rst | 9 ---------
 1 file changed, 9 deletions(-)
Documentation/rust/quick-start.rst +0 -9
index 5bbe059a8fa3..a6ec3fa94d33 100644
@@ -352,12 +352,3 @@ Hacking
 To dive deeper, take a look at the source code of the samples
 at ``samples/rust/``, the Rust support code under ``rust/`` and
 the ``Rust hacking`` menu under ``Kernel hacking``.
-
-If GDB/Binutils is used and Rust symbols are not getting demangled, the reason
-is the toolchain does not support Rust's new v0 mangling scheme yet.
-There are a few ways out:
-
-- Install a newer release (GDB >= 10.2, Binutils >= 2.36).
-
-- Some versions of GDB (e.g. vanilla GDB 10.1) are able to use
-  the pre-demangled names embedded in the debug info (``CONFIG_DEBUG_INFO``).
Signature · 1 line
2.53.0
author maintainer
#41 lore raw

PATCH v2 29/33 docs: rust: general-information: simplify Kconfig example

In reply to Miguel Ojeda

There is no need to use def_bool y if <expr> -- one can simply write def_bool <expr>.

In fact, the simpler form is how we actually use them in practice in init/Kconfig.

Thus simplify the example.

---
 Documentation/rust/general-information.rst | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
Documentation/rust/general-information.rst +1 -1
index 6146b49b6a98..91535b2306ed 100644
@@ -158,4 +158,4 @@ numerical comparisons, one may define a new Kconfig symbol:
 .. code-block:: kconfig
 
 	config RUSTC_VERSION_MIN_107900
-		def_bool y if RUSTC_VERSION >= 107900
+		def_bool RUSTC_VERSION >= 107900
Signature · 1 line
2.53.0
author maintainer
#42 lore raw

PATCH v2 30/33 docs: rust: general-information: use real example

In reply to Miguel Ojeda

Currently the example in the documentation shows a version-based name for the Kconfig example:

    RUSTC_VERSION_MIN_107900

The reason behind it was to possibly avoid repetition in case several features used the same minimum.

However, we ended up preferring to give them a descriptive name for each feature added even if that could lead to some repetition. In practice, the repetition has not happened so far, and even if it does at some point, it is not a big deal.

Thus replace the example in the documentation with one of our current examples (after removing previous ones from the bump), to show how they actually look like, and in case someone greps for it.

In addition, it has the advantage that it shows the RUSTC_HAS_* pattern we follow in init/Kconfig, similar to the C side.

---
 Documentation/rust/general-information.rst | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
Documentation/rust/general-information.rst +2 -2
index 91535b2306ed..09234bed272c 100644
@@ -157,5 +157,5 @@ numerical comparisons, one may define a new Kconfig symbol:
 
 .. code-block:: kconfig
 
-	config RUSTC_VERSION_MIN_107900
-		def_bool RUSTC_VERSION >= 107900
+	config RUSTC_HAS_SPAN_FILE
+		def_bool RUSTC_VERSION >= 108800
Signature · 1 line
2.53.0
author maintainer
#43 lore raw

PATCH v2 31/33 rust: declare cfi_encoding for lru_status

In reply to Miguel Ojeda

From: Alice Ryhl <[email protected]>

By default bindgen will convert 'enum lru_status' into a typedef for an integer. For the most part, an integer of the same size as the enum results in the correct ABI, but in the specific case of CFI, that is not the case. The CFI encoding is supposed to be the same as a struct called 'lru_status' rather than the name of the underlying native integer type.

To fix this, tell bindgen to generate a newtype and set the CFI type explicitly. Note that we need to set the CFI attribute explicitly as bindgen is using repr(transparent), which is otherwise identical to the inner type for ABI purposes.

This allows us to remove the page range helper C function in Binder without risking a CFI failure when list_lru_walk calls the provided function pointer.

The --with-attribute-custom-enum argument requires bindgen v0.71 or greater.

[ In particular, the feature was added in 0.71.0 [1][2].

In addition, feature(cfi_encoding) has been available since Rust 1.71.0 [3].

- Miguel ]

My testing procedure was to add this to the android17-6.18 branch and verify that rust_shrink_free_page is successfully called without crash, and verify that it does in fact crash when the cfi_encoding is set to other values. Note that I couldn't test this on android16-6.12 as that branch uses a bindgen version that is too old.

[ Rebased on top of the minimum Rust version bump series which provide
the required bindgen version. - Miguel ]

---
 drivers/android/binder/Makefile            |  3 +--
 drivers/android/binder/page_range.rs       |  6 +++---
 drivers/android/binder/page_range_helper.c | 24 ----------------------
 drivers/android/binder/page_range_helper.h | 15 --------------
 rust/bindgen_parameters                    |  4 ++++
 rust/bindings/bindings_helper.h            |  1 -
 rust/bindings/lib.rs                       |  1 +
 rust/uapi/lib.rs                           |  1 +
 8 files changed, 10 insertions(+), 45 deletions(-)
 delete mode 100644 drivers/android/binder/page_range_helper.c
 delete mode 100644 drivers/android/binder/page_range_helper.h
drivers/android/binder/Makefile +1 -2
index 09eabb527fa0..7e0cd9782a8b 100644
@@ -5,5 +5,4 @@ obj-$(CONFIG_ANDROID_BINDER_IPC_RUST) += rust_binder.o
 rust_binder-y := \
 	rust_binder_main.o	\
 	rust_binderfs.o		\
-	rust_binder_events.o	\
-	page_range_helper.o
+	rust_binder_events.o
drivers/android/binder/page_range.rs +3 -3
index fdd97112ef5c..8e9f5c4819d0 100644
@@ -642,15 +642,15 @@ fn drop(self: Pin<&mut Self>) {
     unsafe {
         bindings::list_lru_walk(
             list_lru,
-            Some(bindings::rust_shrink_free_page_wrap),
+            Some(rust_shrink_free_page),
             ptr::null_mut(),
             nr_to_scan,
         )
     }
 }
 
-const LRU_SKIP: bindings::lru_status = bindings::lru_status_LRU_SKIP;
-const LRU_REMOVED_ENTRY: bindings::lru_status = bindings::lru_status_LRU_REMOVED_RETRY;
+const LRU_SKIP: bindings::lru_status = bindings::lru_status::LRU_SKIP;
+const LRU_REMOVED_ENTRY: bindings::lru_status = bindings::lru_status::LRU_REMOVED_RETRY;
 
 /// # Safety
 /// Called by the shrinker.
drivers/android/binder/page_range_helper.c deleted +0 -24
deleted file mode 100644
index 496887723ee0..000000000000
@@ -1,24 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-
-/* C helper for page_range.rs to work around a CFI violation.
- *
- * Bindgen currently pretends that `enum lru_status` is the same as an integer.
- * This assumption is fine ABI-wise, but once you add CFI to the mix, it
- * triggers a CFI violation because `enum lru_status` gets a different CFI tag.
- *
- * This file contains a workaround until bindgen can be fixed.
- *
- * Copyright (C) 2025 Google LLC.
- */
-#include "page_range_helper.h"
-
-unsigned int rust_shrink_free_page(struct list_head *item,
-				   struct list_lru_one *list,
-				   void *cb_arg);
-
-enum lru_status
-rust_shrink_free_page_wrap(struct list_head *item, struct list_lru_one *list,
-			   void *cb_arg)
-{
-	return rust_shrink_free_page(item, list, cb_arg);
-}
drivers/android/binder/page_range_helper.h deleted +0 -15
deleted file mode 100644
index 18dd2dd117b2..000000000000
@@ -1,15 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (C) 2025 Google, Inc.
- */
-
-#ifndef _LINUX_PAGE_RANGE_HELPER_H
-#define _LINUX_PAGE_RANGE_HELPER_H
-
-#include <linux/list_lru.h>
-
-enum lru_status
-rust_shrink_free_page_wrap(struct list_head *item, struct list_lru_one *list,
-			   void *cb_arg);
-
-#endif /* _LINUX_PAGE_RANGE_HELPER_H */
rust/bindgen_parameters +4 -0
index 112ec197ef0a..6f02d9720ad2 100644
@@ -19,6 +19,10 @@
 # warning. We don't need to peek into it anyway.
 --opaque-type spinlock
 
+# enums that appear in indirect function calls should specify a cfi type
+--newtype-enum lru_status
+--with-attribute-custom-enum=lru_status='#[cfi_encoding="10lru_status"]'
+
 # `seccomp`'s comment gets understood as a doctest
 --no-doc-comments
 
rust/bindings/bindings_helper.h +0 -1
index 083cc44aa952..faf3ee634ced 100644
@@ -149,5 +149,4 @@ const vm_flags_t RUST_CONST_HELPER_VM_NOHUGEPAGE = VM_NOHUGEPAGE;
 #if IS_ENABLED(CONFIG_ANDROID_BINDER_IPC_RUST)
 #include "../../drivers/android/binder/rust_binder.h"
 #include "../../drivers/android/binder/rust_binder_events.h"
-#include "../../drivers/android/binder/page_range_helper.h"
 #endif
rust/bindings/lib.rs +1 -0
index e18c160dad17..854e7c471434 100644
@@ -19,6 +19,7 @@
     unreachable_pub,
     unsafe_op_in_unsafe_fn
 )]
+#![feature(cfi_encoding)]
 
 #[allow(dead_code)]
 #[allow(clippy::cast_lossless)]
rust/uapi/lib.rs +1 -0
index 821e286e0daa..b8a515de31ca 100644
@@ -24,6 +24,7 @@
     unsafe_op_in_unsafe_fn
 )]
 #![cfg_attr(CONFIG_RUSTC_HAS_UNNECESSARY_TRANSMUTES, allow(unnecessary_transmutes))]
+#![feature(cfi_encoding)]
 
 // Manual definition of blocklisted types.
 type __kernel_size_t = usize;
Signature · 1 line
2.53.0
author maintainer
#44 lore raw

PATCH v2 32/33 rust: kbuild: support global per-version flags

In reply to Miguel Ojeda

Sometimes it is useful to gate global Rust flags per compiler version. For instance, we may want to disable a lint that has false positives in a single version [1].

We already had helpers like rustc-min-version for that, which we use elsewhere, but we cannot currently use them for rust_common_flags, which contains the global flags for all Rust code (kernel and host), because rustc-min-version depends on CONFIG_RUSTC_VERSION, which does not exist when rust_common_flags is defined.

Thus, to support that, introduce rust_common_flags_per_version, defined after the include/config/auto.conf inclusion (where CONFIG_RUSTC_VERSION becomes available), and append it to rust_common_flags, KBUILD_HOSTRUSTFLAGS and KBUILD_RUSTFLAGS.

In addition, move the expansion of HOSTRUSTFLAGS to the same place, so that users can also override per-version flags [2].

---
 Makefile | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)
Makefile +9 -1
index 78f5ee173eda..a305ae4be522 100644
@@ -506,7 +506,7 @@ KBUILD_HOSTCFLAGS   := $(KBUILD_USERHOSTCFLAGS) $(HOST_LFS_CFLAGS) \
 KBUILD_HOSTCXXFLAGS := -Wall -O2 $(HOST_LFS_CFLAGS) $(HOSTCXXFLAGS) \
 		       -I $(srctree)/scripts/include
 KBUILD_HOSTRUSTFLAGS := $(rust_common_flags) -O -Cstrip=debuginfo \
-			-Zallow-features= $(HOSTRUSTFLAGS)
+			-Zallow-features=
 KBUILD_HOSTLDFLAGS  := $(HOST_LFS_LDFLAGS) $(HOSTLDFLAGS)
 KBUILD_HOSTLDLIBS   := $(HOST_LFS_LIBS) $(HOSTLDLIBS)
 KBUILD_PROCMACROLDFLAGS := $(or $(PROCMACROLDFLAGS),$(KBUILD_HOSTLDFLAGS))
@@ -836,6 +836,14 @@ endif # CONFIG_TRACEPOINTS
 
 export WARN_ON_UNUSED_TRACEPOINTS
 
+# Per-version Rust flags. These are like `rust_common_flags`, but may
+# depend on the Rust compiler version (e.g. using `rustc-min-version`).
+rust_common_flags_per_version :=
+
+rust_common_flags += $(rust_common_flags_per_version)
+KBUILD_HOSTRUSTFLAGS += $(rust_common_flags_per_version) $(HOSTRUSTFLAGS)
+KBUILD_RUSTFLAGS += $(rust_common_flags_per_version)
+
 include $(srctree)/arch/$(SRCARCH)/Makefile
 
 ifdef need-config
Signature · 1 line
2.53.0
reviewer Reviewed-by on v2 32/33
#45 lore raw

Re: [PATCH v2 32/33] rust: kbuild: support global per-version flags

Quoted 11 lines · Miguel Ojeda

Sometimes it is useful to gate global Rust flags per compiler version. For instance, we may want to disable a lint that has false positives in a single version [1].

We already had helpers like rustc-min-version for that, which we use elsewhere, but we cannot currently use them for rust_common_flags, which contains the global flags for all Rust code (kernel and host), because rustc-min-version depends on CONFIG_RUSTC_VERSION, which does not exist when rust_common_flags is defined.

[...]

Signature · 1 line
Tamir Duberstein <[email protected]>
maintainer Acked-by on v2 32/33
#46 lore raw

Re: [PATCH v2 32/33] rust: kbuild: support global per-version flags

In reply to Miguel Ojeda
Quoted 18 lines · Miguel Ojeda

Sometimes it is useful to gate global Rust flags per compiler version. For instance, we may want to disable a lint that has false positives in a single version [1].

We already had helpers like rustc-min-version for that, which we use elsewhere, but we cannot currently use them for rust_common_flags, which contains the global flags for all Rust code (kernel and host), because rustc-min-version depends on CONFIG_RUSTC_VERSION, which does not exist when rust_common_flags is defined.

Thus, to support that, introduce rust_common_flags_per_version, defined after the include/config/auto.conf inclusion (where CONFIG_RUSTC_VERSION becomes available), and append it to rust_common_flags, KBUILD_HOSTRUSTFLAGS and KBUILD_RUSTFLAGS.

In addition, move the expansion of HOSTRUSTFLAGS to the same place, so that users can also override per-version flags [2].

Quoted 8 lines
---
 Makefile | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)
Signature · 1 line
Nicolas
author maintainer
#47 lore raw

PATCH v2 33/33 rust: kbuild: allow `clippy::precedence` for Rust < 1.86.0

In reply to Miguel Ojeda

The Clippy precedence lint was extended in Rust 1.85.0 to include bitmasking and shift operations [1]. However, because it generated many hits, in Rust 1.86.0 it was split into a new precedence_bits lint which is not enabled by default [2].

In other words, only Rust 1.85 has a different behavior. For instance, it reports:

    warning: operator precedence can trip the unwary
      --> drivers/gpu/nova-core/fb/hal/ga100.rs:16:5
       |
    16 | /     u64::from(regs::NV_PFB_NISO_FLUSH_SYSMEM_ADDR::read(bar).adr_39_08()) << FLUSH_SYSMEM_ADDR_SHIFT
    17 | |         | u64::from(regs::NV_PFB_NISO_FLUSH_SYSMEM_ADDR_HI::read(bar).adr_63_40())
    18 | |             << FLUSH_SYSMEM_ADDR_SHIFT_HI
       | |_________________________________________^
       |
       = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#precedence
       = note: `-W clippy::precedence` implied by `-W clippy::all`
       = help: to override `-W clippy::all` add `#[allow(clippy::precedence)]`
    help: consider parenthesizing your expression
       |
    16 ~     (u64::from(regs::NV_PFB_NISO_FLUSH_SYSMEM_ADDR::read(bar).adr_39_08()) << FLUSH_SYSMEM_ADDR_SHIFT) | (u64::from(regs::NV_PFB_NISO_FLUSH_SYSMEM_ADDR_HI::read(bar).adr_63_40())
    17 +             << FLUSH_SYSMEM_ADDR_SHIFT_HI)
       |

While so far we try our best to keep all versions Clippy-clean, the minimum (which is now Rust 1.85.0 after the bump) and the latest stable are the most important ones; and this may be considered a "false positive" with respect to the behavior in other versions.

Thus allow this lint for this version using the per-version flags mechanism introduced in the previous commit.

---
 Makefile | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
Makefile +2 -1
index a305ae4be522..b8c38aa49cf4 100644
@@ -838,7 +838,8 @@ export WARN_ON_UNUSED_TRACEPOINTS
 
 # Per-version Rust flags. These are like `rust_common_flags`, but may
 # depend on the Rust compiler version (e.g. using `rustc-min-version`).
-rust_common_flags_per_version :=
+rust_common_flags_per_version := \
+    $(if $(call rustc-min-version,108600),,-Aclippy::precedence)
 
 rust_common_flags += $(rust_common_flags_per_version)
 KBUILD_HOSTRUSTFLAGS += $(rust_common_flags_per_version) $(HOSTRUSTFLAGS)
Signature · 1 line
2.53.0
maintainer Acked-by on v2 33/33
#48 lore raw

Re: [PATCH v2 33/33] rust: kbuild: allow `clippy::precedence` for Rust < 1.86.0

Quoted 39 lines · Miguel Ojeda

The Clippy precedence lint was extended in Rust 1.85.0 to include bitmasking and shift operations [1]. However, because it generated many hits, in Rust 1.86.0 it was split into a new precedence_bits lint which is not enabled by default [2].

In other words, only Rust 1.85 has a different behavior. For instance, it reports:

    warning: operator precedence can trip the unwary
      --> drivers/gpu/nova-core/fb/hal/ga100.rs:16:5
       |
    16 | /     u64::from(regs::NV_PFB_NISO_FLUSH_SYSMEM_ADDR::read(bar).adr_39_08()) << FLUSH_SYSMEM_ADDR_SHIFT
    17 | |         | u64::from(regs::NV_PFB_NISO_FLUSH_SYSMEM_ADDR_HI::read(bar).adr_63_40())
    18 | |             << FLUSH_SYSMEM_ADDR_SHIFT_HI
       | |_________________________________________^
       |
       = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#precedence
       = note: `-W clippy::precedence` implied by `-W clippy::all`
       = help: to override `-W clippy::all` add `#[allow(clippy::precedence)]`
    help: consider parenthesizing your expression
       |
    16 ~     (u64::from(regs::NV_PFB_NISO_FLUSH_SYSMEM_ADDR::read(bar).adr_39_08()) << FLUSH_SYSMEM_ADDR_SHIFT) | (u64::from(regs::NV_PFB_NISO_FLUSH_SYSMEM_ADDR_HI::read(bar).adr_63_40())
    17 +             << FLUSH_SYSMEM_ADDR_SHIFT_HI)
       |

While so far we try our best to keep all versions Clippy-clean, the minimum (which is now Rust 1.85.0 after the bump) and the latest stable are the most important ones; and this may be considered a "false positive" with respect to the behavior in other versions.

Thus allow this lint for this version using the per-version flags mechanism introduced in the previous commit.

Quoted 4 lines
---
 Makefile | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
Signature · 1 line
Nicolas
Applied
#49 lore raw
In reply to Miguel Ojeda
Quoted 29 lines · Miguel Ojeda

As proposed in the past in e.g. LPC 2025 and the Maintainers Summit [1], we are going to follow Debian Stable's Rust versions as our minimum supported version.

Debian Trixie was released with a Rust 1.85.0 toolchain [2], which it still uses to this day [3] (i.e. no update to Rust 1.85.1).

Debian Trixie was released with bindgen 0.71.1, which it also still uses to this day [4].

Debian Trixie's release happened on 2025-08-09 [5], which means that a fair amount of time has passed since its release for kernel developers to upgrade.

Thus bump the minimum to the new versions, i.e.

- Rust: 1.78.0 -> 1.85.0
- bindgen: 0.65.1 -> 0.71.1

There are a few main parts to the series, in this order:

- A few cleanups that can be performed before the bumps.
- The Rust bump (and its cleanups).
- The bindgen bump (and its cleanups).
- Documentation updates.
- The cfi_encoding patch, added here, which needs the bump.
- The per-version flags support and a Clippy cleanup on top.

Quoted 5 lines

Applied series to rust-next -- thanks everyone!

Let's see if we find any issue in -next.

(If someone wants to give tags today, then I am happy to pick them up)

Cheers,
Miguel

#50 lore raw
Quoted 1 line · Miguel Ojeda

On Mon, Apr 6, 2026 at 1:53 AM Miguel Ojeda <[email protected]> wrote:

...

Quoted 4 lines

Applied series to rust-next -- thanks everyone!

Let's see if we find any issue in -next.

Looks good from the perspective of this patchset. I am seeing one remaining problem that we previously came up with a fix for, so I expect that that fix is staged in another branch. But in case it's not, here is the report:

On today's rust-next, using rustc 1.85.0, at commit 232e79c72f57 ("rust: kbuild: allow clippy::precedence for Rust < 1.86.0"):

CLIPPY [M] drivers/gpu/drm/nova/nova.o
warning: consider removing unnecessary double parentheses

    --> rust/doctests_kernel_generated.rs:4240:14
     |
4240 |     pr_info!("The policy details are: {:?}\n", (policy.cpu(), policy.cur()));
     |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |

= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#double_parens
= note: -W clippy::double-parens implied by -W clippy::all
= help: to override -W clippy::all add #[allow(clippy::double_parens)]

warning: 1 warning emitted

thanks,

Signature · 1 line
John Hubbard
#51 lore raw
Quoted 16 lines · John Hubbard

Looks good from the perspective of this patchset. I am seeing one remaining problem that we previously came up with a fix for, so I expect that that fix is staged in another branch. But in case it's not, here is the report:

On today's rust-next, using rustc 1.85.0, at commit 232e79c72f57 ("rust: kbuild: allow clippy::precedence for Rust < 1.86.0"):

CLIPPY [M] drivers/gpu/drm/nova/nova.o
warning: consider removing unnecessary double parentheses

    --> rust/doctests_kernel_generated.rs:4240:14
     |
4240 |     pr_info!("The policy details are: {:?}\n", (policy.cpu(), policy.cur()));
     |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |
Quoted 5 lines

= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#double_parens
= note: -W clippy::double-parens implied by -W clippy::all
= help: to override -W clippy::all add #[allow(clippy::double_parens)]

warning: 1 warning emitted

That is already fixed and in mainline: 487f9b3dc6e5 ("rust: cpufreq:
suppress clippy::double_parens in Policy doctest").

Cheers,
Miguel

#52 lore raw
Quoted 21 lines · Miguel Ojeda
Quoted 20 lines · John Hubbard

Looks good from the perspective of this patchset. I am seeing one remaining problem that we previously came up with a fix for, so I expect that that fix is staged in another branch. But in case it's not, here is the report:

On today's rust-next, using rustc 1.85.0, at commit 232e79c72f57 ("rust: kbuild: allow clippy::precedence for Rust < 1.86.0"):

CLIPPY [M] drivers/gpu/drm/nova/nova.o
warning: consider removing unnecessary double parentheses

    --> rust/doctests_kernel_generated.rs:4240:14
     |
4240 |     pr_info!("The policy details are: {:?}\n", (policy.cpu(), policy.cur()));
     |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |

= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#double_parens
= note: -W clippy::double-parens implied by -W clippy::all
= help: to override -W clippy::all add #[allow(clippy::double_parens)]

Quoted 5 lines
Quoted 1 line

warning: 1 warning emitted

That is already fixed and in mainline: 487f9b3dc6e5 ("rust: cpufreq:
suppress clippy::double_parens in Policy doctest").

That's what I thought I recalled, too. Weird that it is not in rust-next already, though.

thanks,

Signature · 1 line
John Hubbard
#53 lore raw
Quoted 3 lines · John Hubbard

That's what I thought I recalled, too. Weird that it is not in rust-next already, though.

It is normal -- in the kernel back merges are generally to be avoided.

Cheers,
Miguel

#54 lore raw
In reply to Miguel Ojeda
This series was applied to riscv/linux.git (fixes) by Miguel Ojeda <[email protected]>:

Hello:

This series was applied to riscv/linux.git (fixes) by Miguel Ojeda <[email protected]>:

Quoted 8 lines · On Mon, 6 Apr 2026 01:52:36 +0200 you wrote:

As proposed in the past in e.g. LPC 2025 and the Maintainers Summit [1], we are going to follow Debian Stable's Rust versions as our minimum supported version.

Debian Trixie was released with a Rust 1.85.0 toolchain [2], which it still uses to this day [3] (i.e. no update to Rust 1.85.1).

[...]

Here is the summary with links:
- [v2,01/33] rust: kbuild: remove --remap-path-prefix workarounds

    https://git.kernel.org/riscv/c/c8cbe2fc22e4
  - [v2,02/33] rust: kbuild: remove "`try` keyword" workaround for `bindgen` < 0.59.2
    https://git.kernel.org/riscv/c/518b9ad2fab3
  - [v2,03/33] rust: kbuild: remove unneeded old `allow`s for generated layout tests
    https://git.kernel.org/riscv/c/92cc022f044f
  - [v2,04/33] gpu: nova-core: bindings: remove unneeded `cfg_attr`
    https://git.kernel.org/riscv/c/341c51ee3293
  - [v2,05/33] rust: bump Rust minimum supported version to 1.85.0 (Debian Trixie)
    https://git.kernel.org/riscv/c/f32fb9c58a5b
  - [v2,06/33] rust: bump Clippy's MSRV and clean `incompatible_msrv` allows
    https://git.kernel.org/riscv/c/b6cfba436623
  - [v2,07/33] rust: allow globally `clippy::incompatible_msrv`
    https://git.kernel.org/riscv/c/7ed188605e1d
  - [v2,08/33] rust: simplify `RUSTC_VERSION` Kconfig conditions
    https://git.kernel.org/riscv/c/b28711ac98e8
  - [v2,09/33] rust: remove `RUSTC_HAS_SLICE_AS_FLATTENED` and simplify code
    https://git.kernel.org/riscv/c/9b398d056543
  - [v2,10/33] rust: remove `RUSTC_HAS_COERCE_POINTEE` and simplify code
    https://git.kernel.org/riscv/c/4ab22c543f18
  - [v2,11/33] rust: kbuild: remove skipping of `-Wrustdoc::unescaped_backticks`
    https://git.kernel.org/riscv/c/0f6e1e0705f0
  - [v2,12/33] rust: kbuild: remove `feature(...)`s that are now stable
    https://git.kernel.org/riscv/c/d1aa40daa777
  - [v2,13/33] rust: transmute: simplify code with Rust 1.80.0 `split_at_*checked()`
    https://git.kernel.org/riscv/c/f309a6edda53
  - [v2,14/33] rust: alloc: simplify with `NonNull::add()` now that it is stable
    https://git.kernel.org/riscv/c/161dd7b51e96
  - [v2,15/33] rust: macros: simplify code using `feature(extract_if)`
    https://git.kernel.org/riscv/c/42ec980024f0
  - [v2,16/33] rust: block: update `const_refs_to_static` MSRV TODO comment
    https://git.kernel.org/riscv/c/961b72d45ae4
  - [v2,17/33] rust: bump `bindgen` minimum supported version to 0.71.1 (Debian Trixie)
    https://git.kernel.org/riscv/c/c3a00a3f31ff
  - [v2,18/33] rust: rust_is_available: remove warning for `bindgen` 0.66.[01]
    https://git.kernel.org/riscv/c/41cfbb4295cf
  - [v2,19/33] rust: rust_is_available: remove warning for `bindgen` < 0.69.5 && libclang >= 19.1
    https://git.kernel.org/riscv/c/ae64324ad5c1
  - [v2,20/33] rust: kbuild: update `bindgen --rust-target` version and replace comment
    https://git.kernel.org/riscv/c/276ed30c558e
  - [v2,21/33] rust: kbuild: remove "dummy parameter" workaround for `bindgen` < 0.71.1
    https://git.kernel.org/riscv/c/93553d9922b0
  - [v2,22/33] docs: rust: quick-start: openSUSE provides `rust-src` package nowadays
    https://git.kernel.org/riscv/c/53c9647c0a48
  - [v2,23/33] docs: rust: quick-start: update Ubuntu versioned packages
    https://git.kernel.org/riscv/c/982e1aa6de73
  - [v2,24/33] docs: rust: quick-start: update minimum Ubuntu version
    https://git.kernel.org/riscv/c/6767147cb941
  - [v2,25/33] docs: rust: quick-start: add Ubuntu 26.04 LTS and remove subsection title
    https://git.kernel.org/riscv/c/780f847e1419
  - [v2,26/33] docs: rust: quick-start: remove Gentoo "testing" note
    https://git.kernel.org/riscv/c/99c672426aed
  - [v2,27/33] docs: rust: quick-start: remove Nix "unstable channel" note
    https://git.kernel.org/riscv/c/b69a14650009
  - [v2,28/33] docs: rust: quick-start: remove GDB/Binutils mention
    https://git.kernel.org/riscv/c/a4392ed1c8b9
  - [v2,29/33] docs: rust: general-information: simplify Kconfig example
    https://git.kernel.org/riscv/c/9375ea727d7e
  - [v2,30/33] docs: rust: general-information: use real example
    https://git.kernel.org/riscv/c/86c5d1c6740c
  - [v2,31/33] rust: declare cfi_encoding for lru_status
    https://git.kernel.org/riscv/c/9e5946de3a38
  - [v2,32/33] rust: kbuild: support global per-version flags
    https://git.kernel.org/riscv/c/b2aa1535ecdd
  - [v2,33/33] rust: kbuild: allow `clippy::precedence` for Rust < 1.86.0
    https://git.kernel.org/riscv/c/2e2f8b5a0656

You are awesome, thank you!

Signature · 2 lines
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html