Skip to contentSkip to conversation

rust: bump minimum Rust and `bindgen` versions

PATCH Superseded Miguel Ojeda 7 participants 118 messages Apr 1 – Apr 6

Subsystems (16)

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore

Miguel Ojeda

author maintainer
#0 lore raw

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:

- The Rust bump (and cleanups).
- The bindgen bump (and cleanups).
- Documentation updates.
- The cfi_encoding patch, added here, which needs the bump.
- The per-version flags support and a Clippy cleanup on top.

---
The cleanups should cover most of it -- there may be more we can do later e.g. in linux-next.

Most patches are optional, so if there are concerns with any, they can be dropped or be done later. Most are straightforward, though, and e.g. a couple of them update TODO comments to keep the series even simpler.

The patches have been split as much as possible to be able to add as much context as possible and to make it easier to review and to drop any if needed.

All in all, it is a nice --stat of deletions I think :)

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

Miguel Ojeda (32):
rust: bump Rust minimum supported version to 1.85.0 (Debian Trixie)
rust: bump Clippy's MSRV and clean incompatible_msrv allows
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: kbuild: simplify --remap-path-prefix workaround
rust: kbuild: make --remap-path-prefix workaround conditional
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: update extract_if MSRV TODO comment
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 0.66.[01] buggy versions
rust: rust_is_available: remove warning for < 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

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
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                                      |  9 +++
 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                                 | 36 ++++--------
 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/kunit.rs                          |  2 +-
 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 +------------------
 37 files changed, 79 insertions(+), 446 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

--
2.53.0

author maintainer
#1 lore raw

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

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
maintainer Acked-by on v1 1/33
#2 lore raw

Re: [PATCH 01/33] rust: bump Rust minimum supported version to 1.85.0 (Debian Trixie)

Quoted 6 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 really *should* pick up 1.85.1. It contains bugfixes serious enough that the Rust team decided it was reasonble to release a point release.

Quoted 20 lines

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].

Quoted 7 lines
#3 lore raw

Re: [PATCH 01/33] rust: bump Rust minimum supported version to 1.85.0 (Debian Trixie)

Quoted 4 lines · Alice Ryhl

Debian really *should* pick up 1.85.1. It contains bugfixes serious enough that the Rust team decided it was reasonble to release a point release.

I asked them about their policy yesterday here:

https://lore.kernel.org/rust-for-linux/[email protected]/

Perhaps they just prefer to apply patches on top.

The issue linked above is the only one I noticed so far, and it is quite specific.

Anyway, it is up to them.

Cheers,
Miguel

maintainer Acked-by on v1 1/33
#4 lore raw

Re: [PATCH 01/33] rust: bump Rust minimum supported version to 1.85.0 (Debian Trixie)

In reply to Miguel Ojeda
Quoted 27 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'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].

Quoted 7 lines
maintainer Acked-by on v1 1/33
#5 lore raw

Re: [PATCH 01/33] rust: bump Rust minimum supported version to 1.85.0 (Debian Trixie)

In reply to Miguel Ojeda
Quoted 27 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'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].

Quoted 7 lines
Quoted 4 lines
---
 Documentation/process/changes.rst | 2 +-
 scripts/min-tool-version.sh       | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
maintainer
#6 lore raw

Re: [PATCH 01/33] rust: bump Rust minimum supported version to 1.85.0 (Debian Trixie)

In reply to Miguel Ojeda

Documentation/process/changes.rst

Quoted 43 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'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 +0 -0
index 6b373e193548..474594bd4831 100644

This diff fails to apply on linux-next, due to conflict with ece7e57afd51 ("docs: changes.rst and ver_linux: sort the lists").

Best,
Gary

Quoted 22 lines
Documentation/process/changes.rst +1 -1
@@ -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
#7 lore raw

Re: [PATCH 01/33] rust: bump Rust minimum supported version to 1.85.0 (Debian Trixie)

Quoted 3 lines · Gary Guo

This diff fails to apply on linux-next, due to conflict with ece7e57afd51 ("docs: changes.rst and ver_linux: sort the lists").

Yeah, sorry, I should have added --base-commit -- it is rust-next, i.e. 3a2486cc1da5 ("kbuild: rust: provide an option to inline C helpers into Rust").

There will be other conflicts too, e.g. in the list of features in scripts/Makefile.build.

Cheers,
Miguel

reviewer Acked-by on v1 1/33
#8 lore raw

Re: [PATCH 01/33] rust: bump Rust minimum supported version to 1.85.0 (Debian Trixie)

In reply to Miguel Ojeda
Quoted 27 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'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].

Quoted 7 lines

Very happy to see this!

Cheers,
Benno

Quoted 4 lines
---
 Documentation/process/changes.rst | 2 +-
 scripts/min-tool-version.sh       | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
reviewer Acked-by on v1 1/33
#9 lore raw

Re: [PATCH 01/33] rust: bump Rust minimum supported version to 1.85.0 (Debian Trixie)

In reply to Miguel Ojeda
Quoted 8 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).

[...]

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

PATCH 2/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 512e2eabe3ad..bd669e74e1cc 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
maintainer Reviewed-by on v1 2/33
#11 lore raw

Re: [PATCH 02/33] rust: bump Clippy's MSRV and clean `incompatible_msrv` allows

Quoted 6 lines · 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.

Quoted 6 lines
---
 .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(-)
reviewer Reviewed-by on v1 2/33
#13 lore raw

Re: [PATCH 02/33] rust: bump Clippy's MSRV and clean `incompatible_msrv` allows

In reply to Miguel Ojeda
Quoted 4 lines · 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.

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

PATCH 3/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
maintainer Reviewed-by on v1 3/33
#15 lore raw

Re: [PATCH 03/33] rust: simplify `RUSTC_VERSION` Kconfig conditions

Quoted 10 lines · 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.

Quoted 6 lines
---
 arch/Kconfig       | 3 +--
 arch/arm64/Kconfig | 8 --------
 arch/riscv/Kconfig | 3 ---
 init/Kconfig       | 2 --
 4 files changed, 1 insertion(+), 15 deletions(-)
reviewer Reviewed-by on v1 3/33
#16 lore raw

Re: [PATCH 03/33] rust: simplify `RUSTC_VERSION` Kconfig conditions

In reply to Miguel Ojeda
Quoted 10 lines · 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.

[...]

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

PATCH 4/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 6a54597fa0a2..1cf051b83394 100644
@@ -53,6 +53,3 @@
 pub use super::current;
 
 pub use super::uaccess::UserPtr;
-
-#[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
maintainer Reviewed-by on v1 4/33
#18 lore raw

Re: [PATCH 04/33] rust: remove `RUSTC_HAS_SLICE_AS_FLATTENED` and simplify code

Quoted 10 lines · 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.

Quoted 7 lines
---
 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
reviewer Reviewed-by on v1 4/33
#19 lore raw

Re: [PATCH 04/33] rust: remove `RUSTC_HAS_SLICE_AS_FLATTENED` and simplify code

In reply to Miguel Ojeda
Quoted 10 lines · 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.

[...]

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

PATCH 5/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
maintainer Reviewed-by on v1 5/33
#21 lore raw

Re: [PATCH 05/33] rust: remove `RUSTC_HAS_COERCE_POINTEE` and simplify code

Quoted 10 lines · 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).

Quoted 7 lines
---
 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(-)
reviewer Reviewed-by on v1 5/33
#23 lore raw

Re: [PATCH 05/33] rust: remove `RUSTC_HAS_COERCE_POINTEE` and simplify code

In reply to Miguel Ojeda
Quoted 10 lines · 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).

[...]

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

PATCH 6/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 5eca6a817966..212759b5eb7d 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) \
@@ -213,8 +212,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
maintainer Reviewed-by on v1 6/33
#25 lore raw

Re: [PATCH 06/33] rust: kbuild: remove skipping of `-Wrustdoc::unescaped_backticks`

Quoted 7 lines · 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.

Quoted 3 lines
---
 rust/Makefile | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)
reviewer Reviewed-by on v1 6/33
#26 lore raw

Re: [PATCH 06/33] rust: kbuild: remove skipping of `-Wrustdoc::unescaped_backticks`

In reply to Miguel Ojeda
Quoted 4 lines · 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.

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

PATCH 7/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 212759b5eb7d..193cf06eea64 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 a6d1a2b210aa..d71193a45e1c 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
maintainer Reviewed-by on v1 7/33
#28 lore raw

Re: [PATCH 07/33] rust: kbuild: remove `feature(...)`s that are now stable

Quoted 6 lines · 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.

Quoted 5 lines
---
 rust/Makefile          |  2 --
 rust/kernel/lib.rs     | 21 ---------------------
 scripts/Makefile.build |  6 +-----
 3 files changed, 1 insertion(+), 28 deletions(-)
author maintainer
#30 lore raw

PATCH 8/33 rust: kbuild: simplify `--remap-path-prefix` workaround

In reply to Miguel Ojeda

With the minimum version bump in place, rustdoc now always recognizes the --remap-path-prefix flag.

In addition, the Internal Compiler Error that the comment mentions [1] was fixed in Rust 1.87.0 [2], so we still need to skip the flag for the normal rustdoc case, but not for --test since the ICE does not reproduce there -- please see commit 2c8725c1dca3 ("rust: kbuild: skip --remap-path-prefix for rustdoc").

Thus update the comment and remove the skipping of the flag for the --test case.

Note that commit dda135077ecc ("rust: build: remap path to avoid absolute path") re-landed the --remap-path-prefix flag (together with --remap-path-scope), so we keep the workaround, i.e. an alternative could have been to simply delete the skip entirely, but since we still have it and it will be needed when this gets merged, let's keep it.

---
 rust/Makefile | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)
rust/Makefile +4 -5
index 193cf06eea64..708530ee3613 100644
@@ -142,10 +142,9 @@ 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`.
+# `rustdoc` ICEs on out-of-tree builds in Rust < 1.87.0
+# (https://github.com/rust-lang/rust/issues/138520). Thus workaround the
+# issue skipping the flag.
 quiet_cmd_rustdoc = RUSTDOC $(if $(rustdoc_host),H, ) $<
       cmd_rustdoc = \
 	OBJTREE=$(abspath $(objtree)) \
@@ -333,7 +332,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
#31 lore raw

Re: [PATCH 08/33] rust: kbuild: simplify `--remap-path-prefix` workaround

Quoted 9 lines · Miguel Ojeda

With the minimum version bump in place, rustdoc now always recognizes the --remap-path-prefix flag.

In addition, the Internal Compiler Error that the comment mentions [1] was fixed in Rust 1.87.0 [2], so we still need to skip the flag for the normal rustdoc case, but not for --test since the ICE does not reproduce there -- please see commit 2c8725c1dca3 ("rust: kbuild: skip --remap-path-prefix for rustdoc").

Quoted 8 lines

Thus update the comment and remove the skipping of the flag for the --test case.

Note that commit dda135077ecc ("rust: build: remap path to avoid absolute path") re-landed the --remap-path-prefix flag (together with --remap-path-scope), so we keep the workaround, i.e. an alternative could have been to simply delete the skip entirely, but since we still have it and it will be needed when this gets merged, let's keep it.

I'm not sure that I parse this. You do remove the filter-out completely below?

Quoted 27 lines
---
 rust/Makefile | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)
rust/Makefile +3 -4
index 193cf06eea64..708530ee3613 100644
@@ -142,10 +142,9 @@ 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`.
+# `rustdoc` ICEs on out-of-tree builds in Rust < 1.87.0
+# (https://github.com/rust-lang/rust/issues/138520). Thus workaround the
+# issue skipping the flag.
 quiet_cmd_rustdoc = RUSTDOC $(if $(rustdoc_host),H, ) $<
       cmd_rustdoc = \
 	OBJTREE=$(abspath $(objtree)) \

rust/Makefile quiet_cmd_rustdoc_test_kernel = RUSTDOC TK $< · line 336

Quoted 4 lines
rust/Makefile +0 -1
@@ -333,7 +332,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)) \

Looks like this is going to conflict with rust-fixes (which adds the --remap-path-scope). Perhaps worth doing a back merge?

Best,
Gary

Quoted 4 lines
rust/Makefile +1 -0
+	$(RUSTDOC) --test $(rust_flags) \
 		-L$(objtree)/$(obj) --extern ffi --extern pin_init \
 		--extern kernel --extern build_error --extern macros \
 		--extern bindings --extern uapi \
#32 lore raw

Re: [PATCH 08/33] rust: kbuild: simplify `--remap-path-prefix` workaround

Quoted 2 lines · Gary Guo

I'm not sure that I parse this. You do remove the filter-out completely below?

(I see you saw the other commit)

Quoted 2 lines

Looks like this is going to conflict with rust-fixes (which adds the --remap-path-scope). Perhaps worth doing a back merge?

It would be only a couple lines conflicting, so it should be fine.

Having said that, when I was doing this, I wondered if we should even consider keeping the workaround. In other words, locally for rust-next, the "normal" commit would be to remove the workaround entirely because there the flag doesn't exist to begin with (i.e. the workaround should have been removed back when the revert landed).

Then, when conflict happens in linux-next, we can just keep the addition of the flag from your commit -- the rest can say as-is, i.e. no workaround needed, because you only enable both flags in a version (1.95.0) where there is no need for the workaround (which was for < 1.87.0).

It is also why I added the second commit here, i.e. the "make it conditional", because I was testing that indeed we didn't need the workaround anymore.

So it may just simpler to do that. What I thought was that perhaps the workaround is good even if we ourselves don't pass the flag, e.g. someone else may be passing it. But the chances are very low, restricted to a couple versions, and the error is obvious and at build time anyway.

Cheers,
Miguel

reviewer Reviewed-by on v1 8/33
#33 lore raw

Re: [PATCH 08/33] rust: kbuild: simplify `--remap-path-prefix` workaround

In reply to Miguel Ojeda

On Wed, 01 Apr 2026 13:45:15 +0200, Miguel Ojeda <[email protected]> wrote:

Does this simplify the workaround, or just remove one instance of it?

Quoted 7 lines

[...]

Note that commit dda135077ecc ("rust: build: remap path to avoid absolute path") re-landed the --remap-path-prefix flag (together with --remap-path-scope), so we keep the workaround, i.e. an alternative could have been to simply delete the skip entirely, but since we still have it and it will be needed when this gets merged, let's keep it.

The use of "re-landed" is confusing without a mention of commit 8cf5b3f83614 ("Revert "kbuild, rust: use -fremap-path-prefix to make paths relative""). Though this whole thing might be clearer without a mention of that history; the important part is that there's no conditional use of --remap-path-scope in the base commit but there will be when dda135077ecc is merged (the use of "this" in "this gets merged" is also ambiguous).

Quoted 7 lines
rust/Makefile +0 -0
index 193cf06eea64..708530ee3613 100644

rust/Makefile rustdoc_modifiers_workaround := $(if $(call rustc-min-version,108800),-Cunsafe-a · line 147

Quoted 10 lines
rust/Makefile +3 -4
@@ -142,10 +142,9 @@ 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`.
+# `rustdoc` ICEs on out-of-tree builds in Rust < 1.87.0
+# (https://github.com/rust-lang/rust/issues/138520). Thus workaround the
+# issue skipping the flag.

_by_ skipping the flag? this is preexisting, though.

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

PATCH 9/33 rust: kbuild: make `--remap-path-prefix` workaround conditional

In reply to Miguel Ojeda

The Internal Compiler Error that the comment mentions [1] was fixed in Rust 1.87.0 [2]. And, for other workarounds, we plan on limiting where we apply them [3].

Thus limit the ICE one too.

This will help to make sure the workaround is not needed anymore on newer versions.

---
 rust/Makefile | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
rust/Makefile +3 -1
index 708530ee3613..163d2258e93f 100644
@@ -145,10 +145,12 @@ doctests_modifiers_workaround := $(rustdoc_modifiers_workaround)$(if $(call rust
 # `rustdoc` ICEs on out-of-tree builds in Rust < 1.87.0
 # (https://github.com/rust-lang/rust/issues/138520). Thus workaround the
 # issue skipping the flag.
+rustdoc_remap_workaround := $(if $(call rustc-min-version,108700),,--remap-path-prefix=%)
+
 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) $(rustdoc_remap_workaround),$(if $(rustdoc_host),$(rust_common_flags),$(rust_flags))) \
 		$(rustc_target_flags) -L$(objtree)/$(obj) \
 		-Zunstable-options --generate-link-to-definition \
 		--output $(rustdoc_output) \
Signature · 1 line
2.53.0
maintainer
#35 lore raw

Re: [PATCH 09/33] rust: kbuild: make `--remap-path-prefix` workaround conditional

Quoted 22 lines · Miguel Ojeda

The Internal Compiler Error that the comment mentions [1] was fixed in Rust 1.87.0 [2]. And, for other workarounds, we plan on limiting where we apply them [3].

Thus limit the ICE one too.

This will help to make sure the workaround is not needed anymore on newer versions.

---
 rust/Makefile | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
rust/Makefile +0 -0
index 708530ee3613..163d2258e93f 100644

rust/Makefile doctests_modifiers_workaround := $(rustdoc_modifiers_workaround)$(if $(call rust · line 148

Quoted 4 lines
rust/Makefile +1 -0
@@ -145,10 +145,12 @@ doctests_modifiers_workaround := $(rustdoc_modifiers_workaround)$(if $(call rust
 # `rustdoc` ICEs on out-of-tree builds in Rust < 1.87.0
 # (https://github.com/rust-lang/rust/issues/138520). Thus workaround the
 # issue skipping the flag.
+rustdoc_remap_workaround := $(if $(call rustc-min-version,108700),,--remap-path-prefix=%)

Okay, I see what the comments mean now. Perhaps squash this to the previous commit?

Best,
Gary

Quoted 9 lines
rust/Makefile +2 -1
+
 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) $(rustdoc_remap_workaround),$(if $(rustdoc_host),$(rust_common_flags),$(rust_flags))) \
 		$(rustc_target_flags) -L$(objtree)/$(obj) \
 		-Zunstable-options --generate-link-to-definition \
 		--output $(rustdoc_output) \
#36 lore raw

Re: [PATCH 09/33] rust: kbuild: make `--remap-path-prefix` workaround conditional

Quoted 3 lines · Gary Guo

Okay, I see what the comments mean now. Perhaps squash this to the previous commit?

This one was mostly to ensure the workaround was not needed anymore, i.e. it is more "optional" than the other.

In fact, we may want to just not have neither of the patches, i.e. we could just remove the workaround given the timelines of the branches -- please see my reply on the previous one on this.

Cheers,
Miguel

reviewer Reviewed-by on v1 9/33
#37 lore raw

Re: [PATCH 09/33] rust: kbuild: make `--remap-path-prefix` workaround conditional

In reply to Miguel Ojeda
Quoted 10 lines · Miguel Ojeda

The Internal Compiler Error that the comment mentions [1] was fixed in Rust 1.87.0 [2]. And, for other workarounds, we plan on limiting where we apply them [3].

Thus limit the ICE one too.

This will help to make sure the workaround is not needed anymore on newer versions.

[...]

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

PATCH 10/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 beyond 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
maintainer Reviewed-by on v1 10/33
#39 lore raw

Re: [PATCH 10/33] rust: transmute: simplify code with Rust 1.80.0 `split_at_*checked()`

Quoted 8 lines · Miguel Ojeda

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

Thus simplify the code using split_at_*checked().

Quoted 3 lines
---
 rust/kernel/transmute.rs | 33 ++++++---------------------------
 1 file changed, 6 insertions(+), 27 deletions(-)
reviewer Reviewed-by on v1 10/33
#40 lore raw

Re: [PATCH 10/33] rust: transmute: simplify code with Rust 1.80.0 `split_at_*checked()`

In reply to Miguel Ojeda
Quoted 2 lines · Miguel Ojeda

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

"beyond" is probably not the right word here?

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

Re: [PATCH 10/33] rust: transmute: simplify code with Rust 1.80.0 `split_at_*checked()`

Quoted 2 lines · Tamir Duberstein

"beyond" is probably not the right word here?

I think you are right -- reworded.

Thanks!

Cheers,
Miguel

author maintainer
#42 lore raw

PATCH 11/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.

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
maintainer Acked-by on v1 11/33
#43 lore raw

Re: [PATCH 11/33] rust: alloc: simplify with `NonNull::add()` now that it is stable

Quoted 7 lines · Miguel Ojeda

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

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

maintainer Reviewed-by on v1 11/33
#44 lore raw

Re: [PATCH 11/33] rust: alloc: simplify with `NonNull::add()` now that it is stable

In reply to Miguel Ojeda
Quoted 7 lines · Miguel Ojeda

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

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

Quoted 3 lines
---
 rust/kernel/alloc/allocator/iter.rs | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)
reviewer Reviewed-by on v1 11/33
#45 lore raw

Re: [PATCH 11/33] rust: alloc: simplify with `NonNull::add()` now that it is stable

In reply to Miguel Ojeda
Quoted 5 lines · Miguel Ojeda

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

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

This description is inconsistent with the previous one which had citations for both the feature (function in this case) and the feature in which it became stable (available in this case). I don't prefer either style in particular, just that things are consistent.

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

Re: [PATCH 11/33] rust: alloc: simplify with `NonNull::add()` now that it is stable

Quoted 5 lines · Tamir Duberstein

This description is inconsistent with the previous one which had citations for both the feature (function in this case) and the feature in which it became stable (available in this case). I don't prefer either style in particular, just that things are consistent.

Sure, I added a couple references. I think it is good to be consistent (well, at least within a patch series, but I wouldn't say no to more information even if it is inconsistent sometimes, especially across different patch series, since everyone writes messages a bit differently...).

Cheers,
Miguel

author maintainer
#47 lore raw

PATCH 12/33 rust: macros: update `extract_if` MSRV TODO comment

In reply to Miguel Ojeda

feature(extract_if) was stabilized in Rust 1.87.0 [1].

Thus update the comment to reflect that.

Alternatively, we could use it unstably already.

---
 rust/macros/kunit.rs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
rust/macros/kunit.rs +1 -1
index 6be880d634e2..6f6d746b8dbb 100644
@@ -87,7 +87,7 @@ 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.
+        // TODO: Replace with `extract_if` when MSRV is >= 1.87.0.
         let before_len = f.attrs.len();
         f.attrs.retain(|attr| !attr.path().is_ident("test"));
         if f.attrs.len() == before_len {
Signature · 1 line
2.53.0
maintainer
#48 lore raw

Re: [PATCH 12/33] rust: macros: update `extract_if` MSRV TODO comment

Quoted 17 lines · Miguel Ojeda

feature(extract_if) was stabilized in Rust 1.87.0 [1].

Thus update the comment to reflect that.

Alternatively, we could use it unstably already.

---
 rust/macros/kunit.rs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
rust/macros/kunit.rs +0 -0
index 6be880d634e2..6f6d746b8dbb 100644

rust/macros/kunit.rs pub(crate) fn kunit_tests(test_suite: Ident, mut module: ItemMod) -> Result<Toke · line 93

Quoted 8 lines
rust/macros/kunit.rs +1 -1
@@ -87,7 +87,7 @@ 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.
+        // TODO: Replace with `extract_if` when MSRV is >= 1.87.0.
         let before_len = f.attrs.len();
         f.attrs.retain(|attr| !attr.path().is_ident("test"));
         if f.attrs.len() == before_len {

When I write the comment the intention is to enable the unstable feature and switch.

Best,
Gary

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.
#49 lore raw

Re: [PATCH 12/33] rust: macros: update `extract_if` MSRV TODO comment

Quoted 3 lines · Gary Guo

When I write the comment the intention is to enable the unstable feature and switch.

Yeah, that is what I meant as the alternative in the commit message.

I am OK with either.

(By the way, I wondered why you mentioned 1.85 in the comment, I guess it was supposed to be 1.86 instead originally, i.e. "above" as in > 1.86)

Cheers,
Miguel

reviewer Reviewed-by on v1 12/33
#50 lore raw

Re: [PATCH 12/33] rust: macros: update `extract_if` MSRV TODO comment

In reply to Miguel Ojeda
Quoted 5 lines · Miguel Ojeda

feature(extract_if) was stabilized in Rust 1.87.0 [1].

Thus update the comment to reflect that.

Alternatively, we could use it unstably already.

Perhaps the TODO could mention this alternative. Would probably make a good first issue.

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

PATCH 13/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
maintainer Reviewed-by on v1 13/33
#52 lore raw

Re: [PATCH 13/33] rust: block: update `const_refs_to_static` MSRV TODO comment

Quoted 6 lines · Miguel Ojeda

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

Thus update the comment to reflect that.

Quoted 3 lines
---
 rust/kernel/block/mq/gen_disk.rs | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)
reviewer Reviewed-by on v1 13/33
#53 lore raw

Re: [PATCH 13/33] rust: block: update `const_refs_to_static` MSRV TODO comment

In reply to Miguel Ojeda

rust/kernel/block/mq/gen_disk.rs pub fn build<T: Operations>( · line 143

Quoted 12 lines · Miguel Ojeda
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`.

Good first issue?

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

Re: [PATCH 13/33] rust: block: update `const_refs_to_static` MSRV TODO comment

Quoted 15 lines · Tamir Duberstein

rust/kernel/block/mq/gen_disk.rs pub fn build<T: Operations>( · line 143

Quoted 12 lines · Miguel Ojeda
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`.

Good first issue?

It's actually quite tricky. There're already attempts on the list, although I'm not very happy with the solution.

The tricky part is that THIS_MODULE needs to be supplied by the leaf module, it cannot be constructed inside the kernel crate.

Best,
Gary

Quoted 2 lines
author maintainer
#55 lore raw

PATCH 14/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
maintainer Reviewed-by on v1 14/33
#56 lore raw

Re: [PATCH 14/33] rust: bump `bindgen` minimum supported version to 0.71.1 (Debian Trixie)

Quoted 20 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 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].

Quoted 6 lines
Quoted 4 lines
---
 Documentation/process/changes.rst | 2 +-
 scripts/min-tool-version.sh       | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
reviewer Acked-by on v1 14/33
#57 lore raw

Re: [PATCH 14/33] rust: bump `bindgen` minimum supported version to 0.71.1 (Debian Trixie)

In reply to Miguel Ojeda
Quoted 8 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 bindgen versions as our minimum supported version.

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

[...]

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

PATCH 15/33 rust: rust_is_available: remove warning for 0.66.[01] buggy versions

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
maintainer
#59 lore raw

Re: [PATCH 15/33] rust: rust_is_available: remove warning for 0.66.[01] buggy versions

Quoted 4 lines · 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.

The scripts/rust_is_available.sh change looks correct to me, although I couldn't get scripts/rust_is_available_test.py to run on NixOS.

Looks like it filtered out PATH but uses /usr/bin/env to find python binary? For obvious reasons that will only work if python is located /usr/bin/python.

Best,
Gary

Quoted 104 lines
---
 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 })
#60 lore raw

Re: [PATCH 15/33] rust: rust_is_available: remove warning for 0.66.[01] buggy versions

Quoted 6 lines · Gary Guo

The scripts/rust_is_available.sh change looks correct to me, although I couldn't get scripts/rust_is_available_test.py to run on NixOS.

Looks like it filtered out PATH but uses /usr/bin/env to find python binary? For obvious reasons that will only work if python is located /usr/bin/python.

Yeah, the script has some assumptions on it (e.g. it also assumes dash behavior vs. bash in a couple tests which I should relax too). Happy to change that.

Thanks for testing it :)

Cheers,
Miguel

reviewer Reviewed-by on v1 15/33
#61 lore raw

Re: [PATCH 15/33] rust: rust_is_available: remove warning for 0.66.[01] buggy versions

In reply to Miguel Ojeda
Quoted 4 lines · 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.

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

PATCH 16/33 rust: rust_is_available: remove warning for < 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
reviewer Reviewed-by on v1 16/33
#63 lore raw

Re: [PATCH 16/33] rust: rust_is_available: remove warning for < 0.69.5 && libclang >= 19.1

Quoted 4 lines · 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.

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

PATCH 17/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.

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.

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

---
 rust/Makefile | 16 ++--------------
 1 file changed, 2 insertions(+), 14 deletions(-)
rust/Makefile +2 -14
index 163d2258e93f..34f21b735993 100644
@@ -446,22 +446,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
maintainer Reviewed-by on v1 17/33
#65 lore raw

Re: [PATCH 17/33] rust: kbuild: update `bindgen --rust-target` version and replace comment

Quoted 7 lines · 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.

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

Quoted 7 lines

Now that we bumped the minimum version of bindgen, that limitation does not apply anymore.

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

Quoted 3 lines
---
 rust/Makefile | 16 ++--------------
 1 file changed, 2 insertions(+), 14 deletions(-)
reviewer Reviewed-by on v1 17/33
#66 lore raw

Re: [PATCH 17/33] rust: kbuild: update `bindgen --rust-target` version and replace comment

In reply to Miguel Ojeda
Quoted 9 lines · 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.

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.

Some citations pointing to the upstream changes would be good.

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

Re: [PATCH 17/33] rust: kbuild: update `bindgen --rust-target` version and replace comment

Quoted 2 lines · Tamir Duberstein

Some citations pointing to the upstream changes would be good.

I added a couple links as usual, plus a reference to commit 7a5f93ea5862 ("rust: kbuild: set bindgen's Rust target version") that has most of the details.

[ The comment already mentioned the version, and the commit that added that message has the details, but I agree it is a good idea to add some references. ]

Cheers,
Miguel

author maintainer
#68 lore raw

PATCH 18/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
maintainer Reviewed-by on v1 18/33
#69 lore raw

Re: [PATCH 18/33] rust: kbuild: remove "dummy parameter" workaround for `bindgen` < 0.71.1

Quoted 6 lines · Miguel Ojeda

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

Thus remove it.

Quoted 4 lines
---
 init/Kconfig                 | 7 +------
 scripts/rust_is_available.sh | 8 +-------
 2 files changed, 2 insertions(+), 13 deletions(-)
author maintainer
#71 lore raw

PATCH 19/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
maintainer Reviewed-by on v1 19/33
#72 lore raw

Re: [PATCH 19/33] rust: kbuild: remove "`try` keyword" workaround for `bindgen` < 0.59.2

Quoted 6 lines · 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.

Quoted 3 lines
---
 rust/bindgen_parameters | 4 ----
 1 file changed, 4 deletions(-)
author maintainer
#74 lore raw

PATCH 20/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
maintainer Reviewed-by on v1 20/33
#75 lore raw

Re: [PATCH 20/33] rust: kbuild: remove unneeded old `allow`s for generated layout tests

Quoted 9 lines · 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.

Quoted 4 lines
---
 rust/bindings/lib.rs | 4 ----
 rust/uapi/lib.rs     | 4 ----
 2 files changed, 8 deletions(-)
reviewer Reviewed-by on v1 20/33
#76 lore raw

Re: [PATCH 20/33] rust: kbuild: remove unneeded old `allow`s for generated layout tests

In reply to Miguel Ojeda
Quoted 4 lines · 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.

How about ordering this, the previous patch, and the next patch ahead of the version bump to avoid the need to mention it here?

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

Re: [PATCH 20/33] rust: kbuild: remove unneeded old `allow`s for generated layout tests

Quoted 3 lines · Tamir Duberstein

How about ordering this, the previous patch, and the next patch ahead of the version bump to avoid the need to mention it here?

That is reasonable, yeah.

Cheers,
Miguel

author maintainer
#78 lore raw

PATCH 21/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
maintainer Acked-by on v1 21/33
#79 lore raw

Re: [PATCH 21/33] gpu: nova-core: bindings: remove unneeded `cfg_attr`

Quoted 9 lines · 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.

maintainer Reviewed-by on v1 21/33
#80 lore raw

Re: [PATCH 21/33] gpu: nova-core: bindings: remove unneeded `cfg_attr`

In reply to Miguel Ojeda
Quoted 9 lines · 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.

Quoted 2 lines
---
 drivers/gpu/nova-core/gsp/fw/r570_144.rs | 3 ---

I believe drivers/gpu/nova-core/gsp/fw/r570_144/bindings.rs is generated manually and checked in to the source tree? It might be useful to actually have the command line and bindgen version used to generate the file present somewhere for knowing about possible compatibility issues like this one and reproducibility..

Best,
Gary

Quoted 1 line
 1 file changed, 3 deletions(-)
reviewer Reviewed-by on v1 21/33
#81 lore raw

Re: [PATCH 21/33] gpu: nova-core: bindings: remove unneeded `cfg_attr`

In reply to Miguel Ojeda
Quoted 9 lines · 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.

[...]

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

PATCH 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
reviewer Reviewed-by on v1 22/33
#83 lore raw

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

Quoted 4 lines · 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.

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

PATCH 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
reviewer Reviewed-by on v1 23/33
#85 lore raw

Re: [PATCH 23/33] docs: rust: quick-start: update Ubuntu versioned packages

Quoted 6 lines · 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.

RUST_LIB_SRC is also mentioned in the nix section, do you know if it is still needed there?

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

Re: [PATCH 23/33] docs: rust: quick-start: update Ubuntu versioned packages

Quoted 3 lines · Tamir Duberstein

RUST_LIB_SRC is also mentioned in the nix section, do you know if it is still needed there?

Yeah, that would be nice to know.

I tried on my own, and it does seem still required (at least with those packages mentioned in the example). But perhaps a Nix user knows of a better way to do it, anyway.

So I kept it.

By the way, I think it would be nice to have a "standard", well-maintained shell.nix (or a flake or whatever is best nowadays) in the kernel tree somewhere, i.e. one that is known to work, that covers most tooling used in the kernel, etc.

Cheers,
Miguel

maintainer
#87 lore raw

Re: [PATCH 23/33] docs: rust: quick-start: update Ubuntu versioned packages

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

RUST_LIB_SRC is also mentioned in the nix section, do you know if it is still needed there?

Yeah, that would be nice to know.

It's still required. It's used here:
https://github.com/NixOS/nixpkgs/blob/acf7ae578589bb8bdd6f9273141d7053fed84bed/pkgs/os-specific/linux/kernel/generic.nix#L186

Quoted 7 lines

I tried on my own, and it does seem still required (at least with those packages mentioned in the example). But perhaps a Nix user knows of a better way to do it, anyway.

So I kept it.

Quoted 7 lines

By the way, I think it would be nice to have a "standard", well-maintained shell.nix (or a flake or whatever is best nowadays) in the kernel tree somewhere, i.e. one that is known to work, that covers most tooling used in the kernel, etc.

Cheers,
Miguel

I have my dev shell here in case it helps:
https://github.com/nbdd0121/nix-collection/blob/trunk/dev/linux.nix

It makes use of oxalica's rust-overlay. It can be used with shell.nix by a fetchTarball, but for obvious reasons you want that to be pinned and not be fetching latest version everytime.

Flake is good for pinning, but using flake is a two-edged sword -- it both gives you superb reproducibility so years down the line you can still build an old environment (assuming the source tarballs used are still available or NixOS cache server still has a copy).

But it also means that it can be outdated. So people (myself included) usually combine pinning + regular updating by having flake.lock routinely updated. I'm not sure that really fits well inside kernel.

If we don't use anything outside nixpkgs though, we can use "channel" feature of imperative nix which says import <nixpkgs> will import user's local nixpkgs version. A shell.nix using only that should work, but it will only be able to use latest rustc/clippy/cargo/bindgen in nixpkgs and won't be able to include things like klint.

Perhaps having a repo in rust-for-linux GitHub org (or somewhere else in kernel.org SCM) where we can point people to?

Best,
Gary

#88 lore raw

Re: [PATCH 23/33] docs: rust: quick-start: update Ubuntu versioned packages

Quoted 2 lines · Gary Guo

It's still required.

Thanks for confirming!

Quoted 2 lines

Perhaps having a repo in rust-for-linux GitHub org (or somewhere else in kernel.org SCM) where we can point people to?

...and for all these details :)

I agree that it doesn't fit perfectly within the kernel, but an update every kernel cycle or so should be fine, I think, if you think that is enough.

Otherwise, regarding the repository, that sounds great to me -- we already had an old https://github.com/Rust-for-Linux/nix and
https://github.com/Rust-for-Linux/nixpkgs. Not sure if Fiona (Cc'd) wants them, but perhaps you could reuse them (otherwise we should archive them).

Cheers,
Miguel

author maintainer
#89 lore raw

PATCH 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
reviewer Reviewed-by on v1 24/33
#90 lore raw

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

Quoted 9 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.

[...]

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

PATCH 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
reviewer Reviewed-by on v1 25/33
#92 lore raw

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

Quoted 4 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].

Quoted 8 lines

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.

[...]

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

PATCH 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
reviewer Reviewed-by on v1 26/33
#94 lore raw

Re: [PATCH 26/33] docs: rust: quick-start: remove Gentoo "testing" note

Quoted 4 lines · 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.

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

PATCH 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
maintainer Reviewed-by on v1 27/33
#96 lore raw

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

Quoted 8 lines · 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.

Quoted 3 lines
---
 Documentation/rust/quick-start.rst | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
author maintainer
#98 lore raw

PATCH 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
maintainer Reviewed-by on v1 28/33
#99 lore raw

Re: [PATCH 28/33] docs: rust: quick-start: remove GDB/Binutils mention

Quoted 10 lines · 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.

I suppose people could have been using an old LTS distro + rustup and run into this issue. Albeit it's probably quite unlikely.

Quoted 28 lines

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``).
reviewer Reviewed-by on v1 28/33
#100 lore raw

Re: [PATCH 28/33] docs: rust: quick-start: remove GDB/Binutils mention

In reply to Miguel Ojeda
Quoted 5 lines · 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.

Quoted 7 lines

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.

[...]

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

PATCH 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
maintainer Reviewed-by on v1 29/33
#102 lore raw

Re: [PATCH 29/33] docs: rust: general-information: simplify Kconfig example

Quoted 9 lines · 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.

Quoted 3 lines
---
 Documentation/rust/general-information.rst | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
reviewer Reviewed-by on v1 29/33
#103 lore raw

Re: [PATCH 29/33] docs: rust: general-information: simplify Kconfig example

In reply to Miguel Ojeda
Quoted 9 lines · 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.

[...]

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

PATCH 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
maintainer Reviewed-by on v1 30/33
#105 lore raw

Re: [PATCH 30/33] docs: rust: general-information: use real example

Quoted 13 lines · 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.

Quoted 8 lines

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.

Quoted 3 lines
---
 Documentation/rust/general-information.rst | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
reviewer Reviewed-by on v1 30/33
#106 lore raw

Re: [PATCH 30/33] docs: rust: general-information: use real example

In reply to Miguel Ojeda
Quoted 9 lines · 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.

[...]

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

PATCH 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
maintainer Reviewed-by on v1 31/33
#108 lore raw

Re: [PATCH 31/33] rust: declare cfi_encoding for lru_status

Quoted 37 lines · 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.

Quoted 5 lines

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

Quoted 12 lines
---
 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
author maintainer
#109 lore raw

PATCH 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.

An alternative is moving all those three down, but that would mean separating them from the other KBUILD_* variables.

---
 Makefile | 8 ++++++++
 1 file changed, 8 insertions(+)
Makefile +8 -0
index 1a219bf1c771..20c8179d96ee 100644
@@ -834,6 +834,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)
+KBUILD_RUSTFLAGS += $(rust_common_flags_per_version)
+
 include $(srctree)/arch/$(SRCARCH)/Makefile
 
 ifdef need-config
Signature · 1 line
2.53.0
maintainer
#110 lore raw

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

Quoted 10 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.

Quoted 7 lines

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.

An alternative is moving all those three down, but that would mean separating them from the other KBUILD_* variables.

I think I would prefer moving these down.

The current approach append the flags to all variables, which will cause the following equivalence to stop holding after the flag update.

KBUILD_HOSTRUSTFLAGS := $(rust_common_flags) -O -Cstrip=debuginfo \
			-Zallow-features= $(HOSTRUSTFLAGS)

(Per version flags doesn't go before -O anymore, it comes after HOSTRUSTFLAGS).

Best,
Gary

Quoted 27 lines
---
 Makefile | 8 ++++++++
 1 file changed, 8 insertions(+)
Makefile +8 -0
index 1a219bf1c771..20c8179d96ee 100644
@@ -834,6 +834,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)
+KBUILD_RUSTFLAGS += $(rust_common_flags_per_version)
+
 include $(srctree)/arch/$(SRCARCH)/Makefile
 
 ifdef need-config
#111 lore raw

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

Quoted 10 lines · Gary Guo

I think I would prefer moving these down.

The current approach append the flags to all variables, which will cause the following equivalence to stop holding after the flag update.

KBUILD_HOSTRUSTFLAGS := $(rust_common_flags) -O -Cstrip=debuginfo \
                        -Zallow-features= $(HOSTRUSTFLAGS)

(Per version flags doesn't go before -O anymore, it comes after HOSTRUSTFLAGS).

[ For context for others, Sashiko reported the same and we also talked about it in a Rust for Linux call. ]

I have been thinking about this, and about potential other ways to achieve the same thing. I think the best at the moment is to move just the $(HOSTRUSTFLAGS) below, but not the rest.

The reason is that it is closer to what we do with other user (kernel) flags (e.g. arch flags come after the general ones). But I am wondering if we should/could set all the user variables later in the Makefile in general HOST*FLAGS later in the Makefile.

In fact, there is already a limitation with the host flags: -Werror, i.e. that one gets appended later, and so users cannot override it.

This may be considered a bug, because commit 7ded7d37e5f5 ("scripts/Makefile.extrawarn: Respect CONFIG_WERROR / W=e for hostprogs") says:

While it is
possible to avoid this behavior by passing HOSTCFLAGS=-w or HOSTCFLAGS=-Wno-error, it may not be the most intuitive for regular users not intimately familiar with Kbuild.

But passing HOSTCFLAGS=-Wno-error doesn't work, since it comes earlier (-w does work, but because it turns off everything).

I am also a bit confused with:

While this means there is a small portion of
the build that does not have -Werror enabled (namely scripts/kconfig/* and scripts/basic/fixdep)

because it gets enabled in the build (I think it is referring to other targets like the config ones).

Anyway, for now I moved the expansion of HOSTRUSTFLAGS in v2. If Kbuild (Nathan, Nicolas) think it is a good idea to do one of the bigger changes (e.g. for more HOST* flags, appending it even later), then we can do it afterwards.

Cheers,
Miguel

maintainer
#112 lore raw

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

Quoted 19 lines · Miguel Ojeda
Quoted 10 lines · Gary Guo

I think I would prefer moving these down.

The current approach append the flags to all variables, which will cause the following equivalence to stop holding after the flag update.

KBUILD_HOSTRUSTFLAGS := $(rust_common_flags) -O -Cstrip=debuginfo \
                        -Zallow-features= $(HOSTRUSTFLAGS)

(Per version flags doesn't go before -O anymore, it comes after HOSTRUSTFLAGS).

[ For context for others, Sashiko reported the same and we also talked about it in a Rust for Linux call. ]

I have been thinking about this, and about potential other ways to achieve the same thing. I think the best at the moment is to move just the $(HOSTRUSTFLAGS) below, but not the rest.

Quoted 7 lines

The reason is that it is closer to what we do with other user (kernel) flags (e.g. arch flags come after the general ones). But I am wondering if we should/could set all the user variables later in the Makefile in general HOST*FLAGS later in the Makefile.

In fact, there is already a limitation with the host flags: -Werror, i.e. that one gets appended later, and so users cannot override it.

I cared a bit more about the code clarity (where appending to all variables feel like a hack, while moving the code block is natural).

Best,
Gary

Quoted 9 lines

[...]

Anyway, for now I moved the expansion of HOSTRUSTFLAGS in v2. If Kbuild (Nathan, Nicolas) think it is a good idea to do one of the bigger changes (e.g. for more HOST* flags, appending it even later), then we can do it afterwards.

Cheers,
Miguel

#113 lore raw

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

In reply to Miguel Ojeda
Quoted 7 lines · Miguel Ojeda

[...]
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.

An alternative is moving all those three down, but that would mean separating them from the other KBUILD_* variables.

My prefernece is avoiding duplication over grouping, but either choice should be justified by a code comment that acknowledges the duplication/inconsisntecy.

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

PATCH 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)
       |

    warning: operator precedence can trip the unwary
       --> drivers/gpu/nova-core/vbios.rs:511:17
        |
    511 | /                 u32::from(data[29]) << 24
    512 | |                     | u32::from(data[28]) << 16
    513 | |                     | u32::from(data[27]) << 8
        | |______________________________________________^
        |
        = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#precedence
    help: consider parenthesizing your expression
        |
    511 ~                 u32::from(data[29]) << 24
    512 +                     | u32::from(data[28]) << 16 | (u32::from(data[27]) << 8)
        |

    warning: operator precedence can trip the unwary
       --> drivers/gpu/nova-core/vbios.rs:511:17
        |
    511 | /                 u32::from(data[29]) << 24
    512 | |                     | u32::from(data[28]) << 16
        | |_______________________________________________^ help: consider parenthesizing your expression: `(u32::from(data[29]) << 24) | (u32::from(data[28]) << 16)`
        |
        = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#precedence

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 "false positives" 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 20c8179d96ee..a0d6ed050c8a 100644
@@ -836,7 +836,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)
Signature · 1 line
2.53.0
maintainer Reviewed-by on v1 33/33
#115 lore raw

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

Quoted 54 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)
       |

    warning: operator precedence can trip the unwary
       --> drivers/gpu/nova-core/vbios.rs:511:17
        |
    511 | /                 u32::from(data[29]) << 24
    512 | |                     | u32::from(data[28]) << 16
    513 | |                     | u32::from(data[27]) << 8
        | |______________________________________________^
        |
        = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#precedence
    help: consider parenthesizing your expression
        |
    511 ~                 u32::from(data[29]) << 24
    512 +                     | u32::from(data[28]) << 16 | (u32::from(data[27]) << 8)
        |

    warning: operator precedence can trip the unwary
       --> drivers/gpu/nova-core/vbios.rs:511:17
        |
    511 | /                 u32::from(data[29]) << 24
    512 | |                     | u32::from(data[28]) << 16
        | |_______________________________________________^ help: consider parenthesizing your expression: `(u32::from(data[29]) << 24) | (u32::from(data[28]) << 16)`
        |
        = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#precedence

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 "false positives" with respect to the behavior in other versions.

Quoted 6 lines

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

Quoted 3 lines
---
 Makefile | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
reviewer Reviewed-by on v1 33/33
#116 lore raw

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

In reply to Miguel Ojeda
Quoted 4 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].

Might be good to retain some of this in a code comment.

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

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

Quoted 2 lines · Tamir Duberstein

Might be good to retain some of this in a code comment.

Bah, I missed this note among the rest, sorry (I didn't reply to the ones where the commit went away due to the changes in v2) -- I agree it wouldn't hurt to remember why it is there, even if it is already in the Git log.

I will probably add it for tomorrow, especially if I have to rebase.

Thanks!

Cheers,
Miguel