rust: bump minimum Rust and `bindgen` versions
Subsystems (16)
Miguel Ojeda
maintainerv2 cover rust: bump minimum Rust and `bindgen` versions
As proposed in the past in e.g. LPC 2025 and the Maintainers Summit [1], we are going to follow Debian Stable's Rust versions as our minimum supported version.
Debian Trixie was released with a Rust 1.85.0 toolchain [2], which it still uses to this day [3] (i.e. no update to Rust 1.85.1).
Debian Trixie was released with bindgen 0.71.1, which it also still uses to this day [4].
Debian Trixie's release happened on 2025-08-09 [5], which means that a fair amount of time has passed since its release for kernel developers to upgrade.
Thus bump the minimum to the new versions, i.e.
- Rust: 1.78.0 -> 1.85.0
- bindgen: 0.65.1 -> 0.71.1
There are a few main parts to the series, in this order:
- A few cleanups that can be performed before the bumps.
- The Rust bump (and its cleanups).
- The bindgen bump (and its cleanups).
- Documentation updates.
- The cfi_encoding patch, added here, which needs the bump.
- The per-version flags support and a Clippy cleanup on top.
---
v1: https://lore.kernel.org/rust-for-linux/[email protected]/
v2:
- Added patch to globally allow incompatible_msrv and removed the last instance.
- Replaced --remap-path-prefix patches with one that drops the workaround entirely (and place it as the first one) and summarizes the discussion.
I also noticed that --remap-path-prefix for rustdoc is still unstable (unlike rustc's one), so I added it to our list as usual
(https://github.com/Rust-for-Linux/linux/issues/2). There does not seem to be a tracking issue, so I asked upstream about it.
We will need these two lines as the resolution for the conflict:
$(RUSTDOC) $(filter-out $(skip_flags) --remap-path-scope=%,$(if $(rustdoc_host),$(rust_common_flags),$(rust_flags))) \
$(RUSTDOC) --test $(filter-out --remap-path-scope=%,$(rust_flags)) \
- Reworked the extract_if patch to use it (unstably). The feature last major change happened in Rust 1.85.0, so that is fine.
- Moved $(HOSTRUSTFLAGS) below so that per-version flags (like lints) can be overridden too. Please see the details in the commit and my reply to v1.
- Added feature(extract_if) and feature(non_null_convenience) items to https://github.com/Rust-for-Linux/linux/issues/1223.
Then reworded the commits accordingly to include the references to tracking issues and PRs.
- Other rewords, e.g. the "beyond" typo.
- Rebased on top of rust-next.
- Picked up tags.
Alice Ryhl (1):
rust: declare cfi_encoding for lru_status
Miguel Ojeda (32):
rust: kbuild: remove --remap-path-prefix workarounds
rust: kbuild: remove "try keyword" workaround for bindgen < 0.59.2
rust: kbuild: remove unneeded old allows for generated layout tests
gpu: nova-core: bindings: remove unneeded cfg_attr
rust: bump Rust minimum supported version to 1.85.0 (Debian Trixie)
rust: bump Clippy's MSRV and clean incompatible_msrv allows
rust: allow globally clippy::incompatible_msrv
rust: simplify RUSTC_VERSION Kconfig conditions
rust: remove RUSTC_HAS_SLICE_AS_FLATTENED and simplify code
rust: remove RUSTC_HAS_COERCE_POINTEE and simplify code
rust: kbuild: remove skipping of -Wrustdoc::unescaped_backticks
rust: kbuild: remove feature(...)s that are now stable
rust: transmute: simplify code with Rust 1.80.0 split_at_*checked()
rust: alloc: simplify with NonNull::add() now that it is stable
rust: macros: simplify code using feature(extract_if)
rust: block: update const_refs_to_static MSRV TODO comment
rust: bump bindgen minimum supported version to 0.71.1 (Debian
Trixie)
rust: rust_is_available: remove warning for bindgen 0.66.[01]
rust: rust_is_available: remove warning for bindgen < 0.69.5 &&
libclang >= 19.1
rust: kbuild: update `bindgen --rust-target` version and replace
comment
rust: kbuild: remove "dummy parameter" workaround for `bindgen` <
0.71.1 docs: rust: quick-start: openSUSE provides rust-src package nowadays
docs: rust: quick-start: update Ubuntu versioned packages
docs: rust: quick-start: update minimum Ubuntu version
docs: rust: quick-start: add Ubuntu 26.04 LTS and remove subsection
title
docs: rust: quick-start: remove Gentoo "testing" note
docs: rust: quick-start: remove Nix "unstable channel" note
docs: rust: quick-start: remove GDB/Binutils mention
docs: rust: general-information: simplify Kconfig example
docs: rust: general-information: use real example
rust: kbuild: support global per-version flags
rust: kbuild: allow clippy::precedence for Rust < 1.86.0
.clippy.toml | 2 +- Documentation/process/changes.rst | 4 +- Documentation/rust/general-information.rst | 4 +- Documentation/rust/quick-start.rst | 52 +++++++---------- Makefile | 12 +++- arch/Kconfig | 3 +- arch/arm64/Kconfig | 8 --- arch/riscv/Kconfig | 3 - drivers/android/binder/Makefile | 3 +- drivers/android/binder/page_range.rs | 6 +- drivers/android/binder/page_range_helper.c | 24 -------- drivers/android/binder/page_range_helper.h | 15 ----- drivers/gpu/nova-core/gsp/cmdq.rs | 6 +- drivers/gpu/nova-core/gsp/fw/r570_144.rs | 3 - init/Kconfig | 15 +---- rust/Makefile | 31 ++-------- rust/bindgen_parameters | 8 +-- rust/bindings/bindings_helper.h | 1 - rust/bindings/lib.rs | 5 +- rust/kernel/alloc/allocator/iter.rs | 8 +-- rust/kernel/alloc/kbox.rs | 29 +--------- rust/kernel/block/mq/gen_disk.rs | 4 +- rust/kernel/lib.rs | 30 +--------- rust/kernel/list/arc.rs | 22 +------ rust/kernel/prelude.rs | 3 - rust/kernel/ptr.rs | 1 - rust/kernel/slice.rs | 49 ---------------- rust/kernel/sync/arc.rs | 21 +------ rust/kernel/transmute.rs | 35 ++--------- rust/macros/helpers.rs | 1 - rust/macros/kunit.rs | 9 +-- rust/macros/lib.rs | 3 + rust/uapi/lib.rs | 5 +- scripts/Makefile.build | 6 +- scripts/min-tool-version.sh | 4 +- scripts/rust_is_available.sh | 36 +----------- scripts/rust_is_available_bindgen_0_66.h | 2 - ...ust_is_available_bindgen_libclang_concat.h | 3 - scripts/rust_is_available_test.py | 58 +------------------ 39 files changed, 83 insertions(+), 451 deletions(-) delete mode 100644 drivers/android/binder/page_range_helper.c delete mode 100644 drivers/android/binder/page_range_helper.h delete mode 100644 rust/kernel/slice.rs delete mode 100644 scripts/rust_is_available_bindgen_0_66.h delete mode 100644 scripts/rust_is_available_bindgen_libclang_concat.h
base-commit: 36f5a2b09e650b82d7b2a106e3b93af48c2010d9 --
2.53.0
Miguel Ojeda
maintainerPATCH v2 1/33 rust: kbuild: remove `--remap-path-prefix` workarounds
Commit 8cf5b3f83614 ("Revert "kbuild, rust: use -fremap-path-prefix to make paths relative"") removed --remap-path-prefix from the build system, so the workarounds are not needed anymore.
Thus remove them.
Note that the flag has landed again in parallel in this cycle in commit dda135077ecc ("rust: build: remap path to avoid absolute path"), together with --remap-path-scope=macro [1]. However, they are gated on rustc-option-yn, --remap-path-scope=macro, which means they are both only passed starting with Rust 1.95.0 [2]:
--remap-path-scope is only stable in Rust 1.95, so use rustc-option to detect its presence. This feature has been available as -Zremap-path-scope for all versions that we support; however due to bugs in the Rust compiler, it does not work reliably until 1.94. I opted to not enable it for 1.94 as it's just a single version that we missed.
In turn, that means the workarounds removed here should not be needed again (even with the flag added again above), since:
- rustdoc now recognizes the --remap-path-prefix flag since Rust
1.81.0 [3] (even if it is still an unstable feature [4]).
- The Internal Compiler Error [5] that the comment mentions was fixed in Rust 1.87.0 [6]. We tested that was the case in a previous version of this series by making the workaround conditional [7][8].
...which are both older versions than Rust 1.95.0.
We will still need to skip --remap-path-scope for rustdoc though, since rustdoc does not support that one yet [4].
--- rust/Makefile | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
rust/Makefile +2 -6
@@ -145,14 +145,10 @@ rustdoc_modifiers_workaround := $(if $(call rustc-min-version,108800),-Cunsafe-a # Similarly, for doctests (https://github.com/rust-lang/rust/issues/146465). doctests_modifiers_workaround := $(rustdoc_modifiers_workaround)$(if $(call rustc-min-version,109100),$(comma)sanitizer) -# `rustc` recognizes `--remap-path-prefix` since 1.26.0, but `rustdoc` only -# since Rust 1.81.0. Moreover, `rustdoc` ICEs on out-of-tree builds since Rust -# 1.82.0 (https://github.com/rust-lang/rust/issues/138520). Thus workaround both -# issues skipping the flag. The former also applies to `RUSTDOC TK`. quiet_cmd_rustdoc = RUSTDOC $(if $(rustdoc_host),H, ) $< cmd_rustdoc = \ OBJTREE=$(abspath $(objtree)) \ - $(RUSTDOC) $(filter-out $(skip_flags) --remap-path-prefix=%,$(if $(rustdoc_host),$(rust_common_flags),$(rust_flags))) \ + $(RUSTDOC) $(filter-out $(skip_flags),$(if $(rustdoc_host),$(rust_common_flags),$(rust_flags))) \ $(rustc_target_flags) -L$(objtree)/$(obj) \ -Zunstable-options --generate-link-to-definition \ --output $(rustdoc_output) \
@@ -338,7 +334,7 @@ quiet_cmd_rustdoc_test_kernel = RUSTDOC TK $< rm -rf $(objtree)/$(obj)/test/doctests/kernel; \ mkdir -p $(objtree)/$(obj)/test/doctests/kernel; \ OBJTREE=$(abspath $(objtree)) \ - $(RUSTDOC) --test $(filter-out --remap-path-prefix=%,$(rust_flags)) \ + $(RUSTDOC) --test $(rust_flags) \ -L$(objtree)/$(obj) --extern ffi --extern pin_init \ --extern kernel --extern build_error --extern macros \ --extern bindings --extern uapi \
Signature · 1 line
2.53.0
Re: [PATCH v2 01/33] rust: kbuild: remove `--remap-path-prefix` workarounds
Quoted 33 lines · Miguel Ojeda
Commit
8cf5b3f83614("Revert "kbuild, rust: use -fremap-path-prefix to make paths relative"") removed--remap-path-prefixfrom the build system, so the workarounds are not needed anymore.Thus remove them.
Note that the flag has landed again in parallel in this cycle in commit
dda135077ecc("rust: build: remap path to avoid absolute path"), together with--remap-path-scope=macro[1]. However, they are gated onrustc-option-yn, --remap-path-scope=macro, which means they are both only passed starting with Rust 1.95.0 [2]:
--remap-path-scopeis only stable in Rust 1.95, so userustc-optionto detect its presence. This feature has been available as-Zremap-path-scopefor all versions that we support; however due to bugs in the Rust compiler, it does not work reliably until 1.94. I opted to not enable it for 1.94 as it's just a single version that we missed.In turn, that means the workarounds removed here should not be needed again (even with the flag added again above), since:
-
rustdocnow recognizes the--remap-path-prefixflag since Rust1.81.0 [3] (even if it is still an unstable feature [4]).- The Internal Compiler Error [5] that the comment mentions was fixed in Rust 1.87.0 [6]. We tested that was the case in a previous version of this series by making the workaround conditional [7][8].
...which are both older versions than Rust 1.95.0.
We will still need to skip
--remap-path-scopeforrustdocthough, sincerustdocdoes not support that one yet [4].
Quoted 9 lines
Signed-off-by Miguel Ojeda <[email protected]>
Quoted 3 lines
--- rust/Makefile | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
Re: [PATCH v2 01/33] rust: kbuild: remove `--remap-path-prefix` workarounds
In reply to Miguel OjedaQuoted 6 lines · Miguel Ojeda
Commit
8cf5b3f83614("Revert "kbuild, rust: use -fremap-path-prefix to make paths relative"") removed--remap-path-prefixfrom the build system, so the workarounds are not needed anymore.Thus remove them.
Quoted 7 lines
Note that the flag has landed again in parallel in this cycle in commit
dda135077ecc("rust: build: remap path to avoid absolute path"), together with--remap-path-scope=macro[1]. However, they are gated onrustc-option-yn, --remap-path-scope=macro, which means they are both only passed starting with Rust 1.95.0 [2]:[...]
Signature · 1 line
Tamir Duberstein <[email protected]>
Re: [PATCH v2 01/33] rust: kbuild: remove `--remap-path-prefix` workarounds
In reply to Miguel OjedaQuoted 42 lines · Miguel Ojeda
Commit
8cf5b3f83614("Revert "kbuild, rust: use -fremap-path-prefix to make paths relative"") removed--remap-path-prefixfrom the build system, so the workarounds are not needed anymore.Thus remove them.
Note that the flag has landed again in parallel in this cycle in commit
dda135077ecc("rust: build: remap path to avoid absolute path"), together with--remap-path-scope=macro[1]. However, they are gated onrustc-option-yn, --remap-path-scope=macro, which means they are both only passed starting with Rust 1.95.0 [2]:
--remap-path-scopeis only stable in Rust 1.95, so userustc-optionto detect its presence. This feature has been available as-Zremap-path-scopefor all versions that we support; however due to bugs in the Rust compiler, it does not work reliably until 1.94. I opted to not enable it for 1.94 as it's just a single version that we missed.In turn, that means the workarounds removed here should not be needed again (even with the flag added again above), since:
-
rustdocnow recognizes the--remap-path-prefixflag since Rust1.81.0 [3] (even if it is still an unstable feature [4]).- The Internal Compiler Error [5] that the comment mentions was fixed in Rust 1.87.0 [6]. We tested that was the case in a previous version of this series by making the workaround conditional [7][8].
...which are both older versions than Rust 1.95.0.
We will still need to skip
--remap-path-scopeforrustdocthough, sincerustdocdoes not support that one yet [4].Signed-off-by Miguel Ojeda <[email protected]>
Quoted 4 lines
--- rust/Makefile | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
Signature · 1 line
Nicolas
Miguel Ojeda
maintainerPATCH v2 2/33 rust: kbuild: remove "`try` keyword" workaround for `bindgen` < 0.59.2
In reply to Miguel OjedaThere 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
@@ -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
Miguel Ojeda
maintainerPATCH v2 3/33 rust: kbuild: remove unneeded old `allow`s for generated layout tests
In reply to Miguel OjedaThe 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
@@ -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
@@ -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
Miguel Ojeda
maintainerPATCH v2 4/33 gpu: nova-core: bindings: remove unneeded `cfg_attr`
In reply to Miguel OjedaThese 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
@@ -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
Miguel Ojeda
maintainerPATCH v2 5/33 rust: bump Rust minimum supported version to 1.85.0 (Debian Trixie)
In reply to Miguel OjedaAs 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
@@ -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
@@ -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
Miguel Ojeda
maintainerPATCH v2 6/33 rust: bump Clippy's MSRV and clean `incompatible_msrv` allows
In reply to Miguel OjedaFollowing 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
@@ -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
@@ -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
@@ -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
@@ -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
Miguel Ojeda
maintainerPATCH v2 7/33 rust: allow globally `clippy::incompatible_msrv`
In reply to Miguel Ojedaclippy::incompatible_msrv is not buying us much, and we discussed allowing it several times in the past.
For instance, there was recently another patch sent to allow it where needed [1]. While that particular case would not be needed after the minimum version bump to 1.85.0, it is simpler to just allow it to prevent future instances.
Thus do so, and remove the last instance of locally allowing it we have in the tree (except the one in the vendored proc_macro2 crate).
Note that we still keep the msrv config option in clippy.toml since that affects other lints as well.
--- Makefile | 1 + rust/macros/helpers.rs | 1 - 2 files changed, 1 insertion(+), 1 deletion(-)
Makefile +1 -0
@@ -486,6 +486,7 @@ export rust_common_flags := --edition=2021 \ -Wclippy::as_underscore \ -Wclippy::cast_lossless \ -Wclippy::ignored_unit_patterns \ + -Aclippy::incompatible_msrv \ -Wclippy::mut_mut \ -Wclippy::needless_bitwise_bool \ -Aclippy::needless_lifetimes \
rust/macros/helpers.rs +0 -1
@@ -49,7 +49,6 @@ pub(crate) fn file() -> String { }#[cfg( CONFIG_RUSTC_HAS_SPAN_FILE )] -#[allow(clippy::incompatible_msrv)] { proc_macro::Span ::call_site ().file () }
Signature · 1 line
2.53.0
Re: [PATCH v2 07/33] rust: allow globally `clippy::incompatible_msrv`
Quoted 8 lines · Miguel Ojeda
clippy::incompatible_msrvis not buying us much, and we discussed allowing it several times in the past.For instance, there was recently another patch sent to
allowit where needed [1]. While that particular case would not be needed after the minimum version bump to 1.85.0, it is simpler to just allow it to prevent future instances.
Quoted 8 lines
Thus do so, and remove the last instance of locally allowing it we have in the tree (except the one in the vendored
proc_macro2crate).Note that we still keep the
msrvconfig option inclippy.tomlsince that affects other lints as well.
Quoted 4 lines
--- Makefile | 1 + rust/macros/helpers.rs | 1 - 2 files changed, 1 insertion(+), 1 deletion(-)
Re: [PATCH v2 07/33] rust: allow globally `clippy::incompatible_msrv`
In reply to Miguel OjedaMakefile export rust_common_flags := --edition=2021 \ · line 489
Quoted 9 lines · Miguel Ojeda
Makefile +1
-0@@ -486,6 +486,7 @@ export rust_common_flags := --edition=2021 \ -Wclippy::as_underscore \ -Wclippy::cast_lossless \ -Wclippy::ignored_unit_patterns \ + -Aclippy::incompatible_msrv \
Could you add a reference to the upstream bug report [0] here?
Signature · 1 line
Tamir Duberstein <[email protected]>
Re: [PATCH v2 07/33] rust: allow globally `clippy::incompatible_msrv`
Quoted 2 lines · Tamir Duberstein
Could you add a reference to the upstream bug report [0] here?
Of course, thanks for the tags!
Cheers,
Miguel
Tamir Duberstein
reviewerRe: [PATCH v2 07/33] rust: allow globally `clippy::incompatible_msrv`
Quoted 6 lines · Miguel Ojeda
Quoted 2 lines · Tamir Duberstein
Could you add a reference to the upstream bug report [0] here?
Of course, thanks for the tags!
You're welcome! Actually it seems the lint was already improved upstream, starting with 1.90.0.
Re: [PATCH v2 07/33] rust: allow globally `clippy::incompatible_msrv`
Quoted 5 lines · Tamir Duberstein
You're welcome! Actually it seems the lint was already improved upstream, starting with 1.90.0.
Indeed, I had the PR linked in
https://github.com/Rust-for-Linux/linux/issues/349, and it is nicer, but it would still fire in a case like this patch :(
So we could conditionally enable it for Rust >= 1.90.0 now that we have support for that (and allow locally some cases like this one when they pop up), but it is still simpler to just ignore it (especially since it can be quite confusing for other developers to see it triggering).
I think we may want to eventually re-enable it when we use no unstable language features.
Added:
[ In addition, the lint fired without taking into account the features
that have been enabled in a crate [2]. While this was improved in Rust 1.90.0 [3], it would still fire in a case like this patch. ]
Thanks!
Cheers,
Miguel
Tamir Duberstein
reviewerRe: [PATCH v2 07/33] rust: allow globally `clippy::incompatible_msrv`
Quoted 11 lines · Miguel Ojeda
Quoted 5 lines · Tamir Duberstein
You're welcome! Actually it seems the lint was already improved upstream, starting with 1.90.0.
Indeed, I had the PR linked in
https://github.com/Rust-for-Linux/linux/issues/349, and it is nicer, but it would still fire in a case like this patch :(
Ah, that is possibly https://github.com/rust-lang/rust-clippy/issues/14827.
Miguel Ojeda
maintainerPATCH v2 8/33 rust: simplify `RUSTC_VERSION` Kconfig conditions
In reply to Miguel OjedaWith 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
@@ -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
@@ -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
@@ -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
@@ -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
Miguel Ojeda
maintainerPATCH v2 9/33 rust: remove `RUSTC_HAS_SLICE_AS_FLATTENED` and simplify code
In reply to Miguel OjedaWith 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
@@ -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
@@ -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
@@ -107,6 +107,3 @@// `super::std_vendor` is hidden, which makes the macro inline for some reason. #[doc(no_inline)] pub use super ::dbg; - -#[cfg(not( CONFIG_RUSTC_HAS_SLICE_AS_FLATTENED ))] -pub use super ::slice::AsFlattened ;
rust/kernel/slice.rs deleted +0 -49
49 lines not on this page · raw message
Signature · 1 line
2.53.0
Miguel Ojeda
maintainerPATCH v2 10/33 rust: remove `RUSTC_HAS_COERCE_POINTEE` and simplify code
In reply to Miguel OjedaWith 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
Miguel Ojeda
maintainerPATCH v2 11/33 rust: kbuild: remove skipping of `-Wrustdoc::unescaped_backticks`
In reply to Miguel OjedaBack 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
@@ -75,8 +75,7 @@ core-edition := $(if $(call rustc-min-version,108700),2024,2021) core-skip_flags := \ --edition=2021 \ - -Wunreachable_pub \ - -Wrustdoc::unescaped_backticks + -Wunreachable_pub core-flags := \ --edition=$(core-edition) \
@@ -209,8 +208,6 @@ rustdoc-macros: $(src)/macros/lib.rs rustdoc-clean rustdoc-proc_macro2 \ rustdoc-quote rustdoc-syn FORCE +$(call if_changed,rustdoc) -# Starting with Rust 1.82.0, skipping `-Wrustdoc::unescaped_backticks` should -# not be needed -- see https://github.com/rust-lang/rust/pull/128307. rustdoc-core: private skip_flags = $(core-skip_flags) rustdoc-core: private rustc_target_flags = $(core-flags) rustdoc-core: $(RUST_LIB_SRC)/core/src/lib.rs rustdoc-clean FORCE
Signature · 1 line
2.53.0
Miguel Ojeda
maintainerPATCH v2 12/33 rust: kbuild: remove `feature(...)`s that are now stable
In reply to Miguel OjedaNow 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
@@ -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
@@ -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
@@ -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
Miguel Ojeda
maintainerPATCH v2 13/33 rust: transmute: simplify code with Rust 1.80.0 `split_at_*checked()`
In reply to Miguel Ojedafeature(split_at_checked) [1] has been stabilized in Rust 1.80.0 [2], which is older than our new minimum Rust version (Rust 1.85.0).
Thus simplify the code using split_at_*checked().
--- rust/kernel/transmute.rs | 33 ++++++--------------------------- 1 file changed, 6 insertions(+), 27 deletions(-)
rust/kernel/transmute.rs +6 -27
@@ -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
Miguel Ojeda
maintainerPATCH v2 14/33 rust: alloc: simplify with `NonNull::add()` now that it is stable
In reply to Miguel OjedaCurrently, we need to go through raw pointers and then re-create the NonNull from the result of offsetting the raw pointer.
feature(non_null_convenience) [1] has been stabilized in Rust 1.80.0 [2], which is older than our new minimum Rust version (Rust 1.85.0).
Thus, now that we bump the Rust minimum version, simplify using NonNull::add() and clean the TODO note.
--- rust/kernel/alloc/allocator/iter.rs | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-)
rust/kernel/alloc/allocator/iter.rs +1 -7
@@ -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
Miguel Ojeda
maintainerPATCH v2 15/33 rust: macros: simplify code using `feature(extract_if)`
In reply to Miguel Ojedafeature(extract_if) [1] was stabilized in Rust 1.87.0 [2], and the last significant change happened in Rust 1.85.0 [3] when the range parameter was added.
That is, with our new minimum version, we can start using the feature.
Thus simplify the code using the feature and remove the TODO comment.
--- rust/macros/kunit.rs | 9 +++++---- rust/macros/lib.rs | 3 +++ 2 files changed, 8 insertions(+), 4 deletions(-)
rust/macros/kunit.rs +5 -4
@@ -87,10 +87,11 @@ pub(crate) fn kunit_tests(test_suite: Ident, mut module: ItemMod) -> Result<Tokecontinue ; }; -// 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
@@ -6,6 +6,9 @@// and thus add a dependency on `include/config/RUSTC_VERSION_TEXT`, which is // touched by Kconfig when the version string from the compiler changes. +// Stable since Rust 1.87.0. +#![feature(extract_if)] +// // Stable since Rust 1.88.0 under a different name, `proc_macro_span_file`, // which was added in Rust 1.88.0. This is why `cfg_attr` is used here, i.e. // to avoid depending on the full `proc_macro_span` on Rust >= 1.88.0.
Signature · 1 line
2.53.0
Re: [PATCH v2 15/33] rust: macros: simplify code using `feature(extract_if)`
Quoted 9 lines · Miguel Ojeda
feature(extract_if)[1] was stabilized in Rust 1.87.0 [2], and the last significant change happened in Rust 1.85.0 [3] when the range parameter was added.That is, with our new minimum version, we can start using the feature.
Thus simplify the code using the feature and remove the TODO comment.
[...]
Signature · 1 line
Tamir Duberstein <[email protected]>
Miguel Ojeda
maintainerPATCH v2 16/33 rust: block: update `const_refs_to_static` MSRV TODO comment
In reply to Miguel Ojedafeature(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
@@ -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
Miguel Ojeda
maintainerPATCH v2 17/33 rust: bump `bindgen` minimum supported version to 0.71.1 (Debian Trixie)
In reply to Miguel OjedaAs 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
@@ -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
@@ -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
Miguel Ojeda
maintainerPATCH v2 18/33 rust: rust_is_available: remove warning for `bindgen` 0.66.[01]
In reply to Miguel OjedaIt 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
@@ -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
@@ -1,2 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#define A "\0"
scripts/rust_is_available_test.py +3 -23
@@ -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
Miguel Ojeda
maintainerPATCH v2 19/33 rust: rust_is_available: remove warning for `bindgen` < 0.69.5 && libclang >= 19.1
In reply to Miguel OjedaIt 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
@@ -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
@@ -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
@@ -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
Miguel Ojeda
maintainerPATCH v2 20/33 rust: kbuild: update `bindgen --rust-target` version and replace comment
In reply to Miguel OjedaAs the comment in the Makefile explains, previously, we needed to limit ourselves to the list of Rust versions known by bindgen for its --rust-target option [1].
In other words, we needed to consult the versions known by the minimum version of bindgen that we supported.
Now that we bumped the minimum version of bindgen, that limitation does not apply anymore since bindgen 0.71.0 [2].
Thus replace the comment and simply write our minimum supported Rust version there, which is much simpler.
See commit 7a5f93ea5862 ("rust: kbuild: set bindgen's Rust target version") for more details.
--- rust/Makefile | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-)
rust/Makefile +2 -14
@@ -441,22 +441,10 @@ endif # architecture instead of generating `usize`. bindgen_c_flags_final = $(bindgen_c_flags_lto) -fno-builtin -D__BINDGEN__ -# Each `bindgen` release may upgrade the list of Rust target versions. By -# default, the highest stable release in their list is used. Thus we need to set -# a `--rust-target` to avoid future `bindgen` releases emitting code that -# `rustc` may not understand. On top of that, `bindgen` does not support passing -# an unknown Rust target version. -# -# Therefore, the Rust target for `bindgen` can be only as high as the minimum -# Rust version the kernel supports and only as high as the greatest stable Rust -# target supported by the minimum `bindgen` version the kernel supports (that -# is, if we do not test the actual `rustc`/`bindgen` versions running). -# -# Starting with `bindgen` 0.71.0, we will be able to set any future Rust version -# instead, i.e. we will be able to set here our minimum supported Rust version. +# `--rust-target` points to our minimum supported Rust version. quiet_cmd_bindgen = BINDGEN $@ cmd_bindgen = \ - $(BINDGEN) $< $(bindgen_target_flags) --rust-target 1.68 \ + $(BINDGEN) $< $(bindgen_target_flags) --rust-target 1.85 \ --use-core --with-derive-default --ctypes-prefix ffi --no-layout-tests \ --no-debug '.*' --enable-function-attribute-detection \ -o $@ -- $(bindgen_c_flags_final) -DMODULE \
Signature · 1 line
2.53.0
Miguel Ojeda
maintainerPATCH v2 21/33 rust: kbuild: remove "dummy parameter" workaround for `bindgen` < 0.71.1
In reply to Miguel OjedaUntil 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
@@ -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
@@ -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
Miguel Ojeda
maintainerPATCH v2 22/33 docs: rust: quick-start: openSUSE provides `rust-src` package nowadays
In reply to Miguel OjedaBoth 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
@@ -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
Miguel Ojeda
maintainerPATCH v2 23/33 docs: rust: quick-start: update Ubuntu versioned packages
In reply to Miguel OjedaNow 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
@@ -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
Miguel Ojeda
maintainerPATCH v2 24/33 docs: rust: quick-start: update minimum Ubuntu version
In reply to Miguel OjedaUbuntu 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
@@ -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
Re: [PATCH v2 24/33] docs: rust: quick-start: update minimum Ubuntu version
Quoted 8 lines · Miguel Ojeda
Ubuntu 25.04 is out of support [1], and Ubuntu 25.10 is the latest supported one.
Moreover, Ubuntu 25.10 is the first that provides a recent enough Rust given the minimum bump -- they provide 1.85.1 [2].
Thus update it.
Quoted 8 lines
Link https://packages.ubuntu.com/search?keywords=rustc&searchon=names&exact=1&suite=all§ion=all [2]Reviewed-by Tamir Duberstein <[email protected]>Signed-off-by Miguel Ojeda <[email protected]>--- Documentation/rust/quick-start.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Signature · 1 line
Nicolas
Miguel Ojeda
maintainerPATCH v2 25/33 docs: rust: quick-start: add Ubuntu 26.04 LTS and remove subsection title
In reply to Miguel OjedaUbuntu 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
@@ -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
Re: [PATCH v2 25/33] docs: rust: quick-start: add Ubuntu 26.04 LTS and remove subsection title
Quoted 13 lines · Miguel Ojeda
Ubuntu 26.04 LTS (Resolute Raccoon) is scheduled to be released in a few weeks [1], and it has a recent enough Rust toolchain, just like Ubuntu 25.10 has [2][3].
We could update the title and the paragraph, but to simplify and to make it more consistent with the other distributions' sections, let's instead just remove that title. It will also reduce the differences later on to keep it updated. Eventually, when we remove the remaining subsection for older LTSs, Ubuntu should be a small section like the other distributions.
Thus remove the title and add the mention of Ubuntu 26.04 LTS.
Quoted 9 lines
Link https://packages.ubuntu.com/search?keywords=rustc&searchon=names&exact=1&suite=all§ion=all [2]Link https://packages.ubuntu.com/search?keywords=bindgen&searchon=names&exact=1&suite=all§ion=all [3]Reviewed-by Tamir Duberstein <[email protected]>Signed-off-by Miguel Ojeda <[email protected]>--- Documentation/rust/quick-start.rst | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
Signature · 1 line
Nicolas
Miguel Ojeda
maintainerPATCH v2 26/33 docs: rust: quick-start: remove Gentoo "testing" note
In reply to Miguel OjedaGentoo 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
@@ -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
Miguel Ojeda
maintainerPATCH v2 27/33 docs: rust: quick-start: remove Nix "unstable channel" note
In reply to Miguel OjedaNix 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
@@ -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
Miguel Ojeda
maintainerPATCH v2 28/33 docs: rust: quick-start: remove GDB/Binutils mention
In reply to Miguel OjedaThe 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
@@ -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
Miguel Ojeda
maintainerPATCH v2 29/33 docs: rust: general-information: simplify Kconfig example
In reply to Miguel OjedaThere 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
@@ -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
Miguel Ojeda
maintainerPATCH v2 30/33 docs: rust: general-information: use real example
In reply to Miguel OjedaCurrently 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
@@ -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
Miguel Ojeda
maintainerPATCH v2 31/33 rust: declare cfi_encoding for lru_status
In reply to Miguel OjedaFrom: 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
Miguel Ojeda
maintainerPATCH v2 32/33 rust: kbuild: support global per-version flags
In reply to Miguel OjedaSometimes it is useful to gate global Rust flags per compiler version. For instance, we may want to disable a lint that has false positives in a single version [1].
We already had helpers like rustc-min-version for that, which we use elsewhere, but we cannot currently use them for rust_common_flags, which contains the global flags for all Rust code (kernel and host), because rustc-min-version depends on CONFIG_RUSTC_VERSION, which does not exist when rust_common_flags is defined.
Thus, to support that, introduce rust_common_flags_per_version, defined after the include/config/auto.conf inclusion (where CONFIG_RUSTC_VERSION becomes available), and append it to rust_common_flags, KBUILD_HOSTRUSTFLAGS and KBUILD_RUSTFLAGS.
In addition, move the expansion of HOSTRUSTFLAGS to the same place, so that users can also override per-version flags [2].
--- Makefile | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
Makefile +9 -1
@@ -506,7 +506,7 @@ KBUILD_HOSTCFLAGS := $(KBUILD_USERHOSTCFLAGS) $(HOST_LFS_CFLAGS) \ KBUILD_HOSTCXXFLAGS := -Wall -O2 $(HOST_LFS_CFLAGS) $(HOSTCXXFLAGS) \ -I $(srctree)/scripts/include KBUILD_HOSTRUSTFLAGS := $(rust_common_flags) -O -Cstrip=debuginfo \ - -Zallow-features= $(HOSTRUSTFLAGS) + -Zallow-features= KBUILD_HOSTLDFLAGS := $(HOST_LFS_LDFLAGS) $(HOSTLDFLAGS) KBUILD_HOSTLDLIBS := $(HOST_LFS_LIBS) $(HOSTLDLIBS) KBUILD_PROCMACROLDFLAGS := $(or $(PROCMACROLDFLAGS),$(KBUILD_HOSTLDFLAGS))
@@ -836,6 +836,14 @@ endif # CONFIG_TRACEPOINTS export WARN_ON_UNUSED_TRACEPOINTS +# Per-version Rust flags. These are like `rust_common_flags`, but may +# depend on the Rust compiler version (e.g. using `rustc-min-version`). +rust_common_flags_per_version := + +rust_common_flags += $(rust_common_flags_per_version) +KBUILD_HOSTRUSTFLAGS += $(rust_common_flags_per_version) $(HOSTRUSTFLAGS) +KBUILD_RUSTFLAGS += $(rust_common_flags_per_version) + include $(srctree)/arch/$(SRCARCH)/Makefile ifdef need-config
Signature · 1 line
2.53.0
Re: [PATCH v2 32/33] rust: kbuild: support global per-version flags
Quoted 11 lines · Miguel Ojeda
Sometimes it is useful to gate global Rust flags per compiler version. For instance, we may want to disable a lint that has false positives in a single version [1].
We already had helpers like
rustc-min-versionfor that, which we use elsewhere, but we cannot currently use them forrust_common_flags, which contains the global flags for all Rust code (kernel and host), becauserustc-min-versiondepends onCONFIG_RUSTC_VERSION, which does not exist whenrust_common_flagsis defined.[...]
Signature · 1 line
Tamir Duberstein <[email protected]>
Re: [PATCH v2 32/33] rust: kbuild: support global per-version flags
In reply to Miguel OjedaQuoted 18 lines · Miguel Ojeda
Sometimes it is useful to gate global Rust flags per compiler version. For instance, we may want to disable a lint that has false positives in a single version [1].
We already had helpers like
rustc-min-versionfor that, which we use elsewhere, but we cannot currently use them forrust_common_flags, which contains the global flags for all Rust code (kernel and host), becauserustc-min-versiondepends onCONFIG_RUSTC_VERSION, which does not exist whenrust_common_flagsis defined.Thus, to support that, introduce
rust_common_flags_per_version, defined after theinclude/config/auto.confinclusion (whereCONFIG_RUSTC_VERSIONbecomes available), and append it torust_common_flags,KBUILD_HOSTRUSTFLAGSandKBUILD_RUSTFLAGS.In addition, move the expansion of
HOSTRUSTFLAGSto the same place, so that users can also override per-version flags [2].
Quoted 8 lines
Link https://lore.kernel.org/rust-for-linux/CANiq72mWdFU11GcCZRchzhy0Gi1QZShvZtyRkHV2O+WA2uTdVQ@mail.gmail.com/ [1] open hereLink https://lore.kernel.org/rust-for-linux/CANiq72mTaA2tjhkLKf0-2hrrrt9rxWPgy6SfNSbponbGOegQvA@mail.gmail.com/ [2] open hereSigned-off-by Miguel Ojeda <[email protected]>--- Makefile | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
Signature · 1 line
Nicolas
Miguel Ojeda
maintainerPATCH v2 33/33 rust: kbuild: allow `clippy::precedence` for Rust < 1.86.0
In reply to Miguel OjedaThe Clippy precedence lint was extended in Rust 1.85.0 to include bitmasking and shift operations [1]. However, because it generated many hits, in Rust 1.86.0 it was split into a new precedence_bits lint which is not enabled by default [2].
In other words, only Rust 1.85 has a different behavior. For instance, it reports:
warning: operator precedence can trip the unwary
--> drivers/gpu/nova-core/fb/hal/ga100.rs:16:5
|
16 | / u64::from(regs::NV_PFB_NISO_FLUSH_SYSMEM_ADDR::read(bar).adr_39_08()) << FLUSH_SYSMEM_ADDR_SHIFT
17 | | | u64::from(regs::NV_PFB_NISO_FLUSH_SYSMEM_ADDR_HI::read(bar).adr_63_40())
18 | | << FLUSH_SYSMEM_ADDR_SHIFT_HI
| |_________________________________________^
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#precedence
= note: `-W clippy::precedence` implied by `-W clippy::all`
= help: to override `-W clippy::all` add `#[allow(clippy::precedence)]`
help: consider parenthesizing your expression
|
16 ~ (u64::from(regs::NV_PFB_NISO_FLUSH_SYSMEM_ADDR::read(bar).adr_39_08()) << FLUSH_SYSMEM_ADDR_SHIFT) | (u64::from(regs::NV_PFB_NISO_FLUSH_SYSMEM_ADDR_HI::read(bar).adr_63_40())
17 + << FLUSH_SYSMEM_ADDR_SHIFT_HI)
|While so far we try our best to keep all versions Clippy-clean, the minimum (which is now Rust 1.85.0 after the bump) and the latest stable are the most important ones; and this may be considered a "false positive" with respect to the behavior in other versions.
Thus allow this lint for this version using the per-version flags mechanism introduced in the previous commit.
--- Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
Makefile +2 -1
@@ -838,7 +838,8 @@ export WARN_ON_UNUSED_TRACEPOINTS # Per-version Rust flags. These are like `rust_common_flags`, but may # depend on the Rust compiler version (e.g. using `rustc-min-version`). -rust_common_flags_per_version := +rust_common_flags_per_version := \ + $(if $(call rustc-min-version,108600),,-Aclippy::precedence) rust_common_flags += $(rust_common_flags_per_version) KBUILD_HOSTRUSTFLAGS += $(rust_common_flags_per_version) $(HOSTRUSTFLAGS)
Signature · 1 line
2.53.0
Re: [PATCH v2 33/33] rust: kbuild: allow `clippy::precedence` for Rust < 1.86.0
Quoted 39 lines · Miguel Ojeda
The Clippy
precedencelint 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 newprecedence_bitslint which is not enabled by default [2].In other words, only Rust 1.85 has a different behavior. For instance, it reports:
warning: operator precedence can trip the unwary --> drivers/gpu/nova-core/fb/hal/ga100.rs:16:5 | 16 | / u64::from(regs::NV_PFB_NISO_FLUSH_SYSMEM_ADDR::read(bar).adr_39_08()) << FLUSH_SYSMEM_ADDR_SHIFT 17 | | | u64::from(regs::NV_PFB_NISO_FLUSH_SYSMEM_ADDR_HI::read(bar).adr_63_40()) 18 | | << FLUSH_SYSMEM_ADDR_SHIFT_HI | |_________________________________________^ | = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#precedence = note: `-W clippy::precedence` implied by `-W clippy::all` = help: to override `-W clippy::all` add `#[allow(clippy::precedence)]` help: consider parenthesizing your expression | 16 ~ (u64::from(regs::NV_PFB_NISO_FLUSH_SYSMEM_ADDR::read(bar).adr_39_08()) << FLUSH_SYSMEM_ADDR_SHIFT) | (u64::from(regs::NV_PFB_NISO_FLUSH_SYSMEM_ADDR_HI::read(bar).adr_63_40()) 17 + << FLUSH_SYSMEM_ADDR_SHIFT_HI) |While so far we try our best to keep all versions Clippy-clean, the minimum (which is now Rust 1.85.0 after the bump) and the latest stable are the most important ones; and this may be considered a "false positive" with respect to the behavior in other versions.
Thus allow this lint for this version using the per-version flags mechanism introduced in the previous commit.
Reviewed-by Tamir Duberstein <[email protected]>Reviewed-by Gary Guo <[email protected]>Signed-off-by Miguel Ojeda <[email protected]>
Quoted 4 lines
--- Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
Signature · 1 line
Nicolas
Miguel Ojeda
AppliedQuoted 29 lines · Miguel Ojeda
As proposed in the past in e.g. LPC 2025 and the Maintainers Summit [1], we are going to follow Debian Stable's Rust versions as our minimum supported version.
Debian Trixie was released with a Rust 1.85.0 toolchain [2], which it still uses to this day [3] (i.e. no update to Rust 1.85.1).
Debian Trixie was released with
bindgen0.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.1There are a few main parts to the series, in this order:
- A few cleanups that can be performed before the bumps.
- The Rust bump (and its cleanups).
- Thebindgenbump (and its cleanups).
- Documentation updates.
- Thecfi_encodingpatch, added here, which needs the bump.
- The per-version flags support and a Clippy cleanup on top.
Quoted 5 lines
Link https://lwn.net/Articles/1050174/ [1]
Applied series to rust-next -- thanks everyone!
Let's see if we find any issue in -next.
(If someone wants to give tags today, then I am happy to pick them up)
Cheers,
Miguel
Quoted 1 line · Miguel Ojeda
On Mon, Apr 6, 2026 at 1:53 AM Miguel Ojeda <[email protected]> wrote:
...
Quoted 4 lines
Applied series to
rust-next-- thanks everyone!Let's see if we find any issue in -next.
Looks good from the perspective of this patchset. I am seeing one remaining problem that we previously came up with a fix for, so I expect that that fix is staged in another branch. But in case it's not, here is the report:
On today's rust-next, using rustc 1.85.0, at commit 232e79c72f57 ("rust: kbuild: allow clippy::precedence for Rust < 1.86.0"):
CLIPPY [M] drivers/gpu/drm/nova/nova.o
warning: consider removing unnecessary double parentheses
--> rust/doctests_kernel_generated.rs:4240:14
|
4240 | pr_info!("The policy details are: {:?}\n", (policy.cpu(), policy.cur()));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#double_parens
= note: -W clippy::double-parens implied by -W clippy::all
= help: to override -W clippy::all add #[allow(clippy::double_parens)]
warning: 1 warning emitted
thanks,
Signature · 1 line
John Hubbard
Quoted 16 lines · John Hubbard
Looks good from the perspective of this patchset. I am seeing one remaining problem that we previously came up with a fix for, so I expect that that fix is staged in another branch. But in case it's not, here is the report:
On today's rust-next, using rustc 1.85.0, at commit
232e79c72f57("rust: kbuild: allowclippy::precedencefor Rust < 1.86.0"):CLIPPY [M]
drivers/gpu/drm/nova/nova.o
warning: consider removing unnecessary double parentheses--> rust/doctests_kernel_generated.rs:4240:14 | 4240 | pr_info!("The policy details are: {:?}\n", (policy.cpu(), policy.cur())); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
Quoted 5 lines
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#double_parens
= note:-W clippy::double-parensimplied by-W clippy::all
= help: to override-W clippy::alladd#[allow(clippy::double_parens)]warning: 1 warning emitted
That is already fixed and in mainline: 487f9b3dc6e5 ("rust: cpufreq:
suppress clippy::double_parens in Policy doctest").
Cheers,
Miguel
Quoted 21 lines · Miguel Ojeda
Quoted 20 lines · John Hubbard
Looks good from the perspective of this patchset. I am seeing one remaining problem that we previously came up with a fix for, so I expect that that fix is staged in another branch. But in case it's not, here is the report:
On today's rust-next, using rustc 1.85.0, at commit
232e79c72f57("rust: kbuild: allowclippy::precedencefor Rust < 1.86.0"):CLIPPY [M]
drivers/gpu/drm/nova/nova.o
warning: consider removing unnecessary double parentheses--> rust/doctests_kernel_generated.rs:4240:14 | 4240 | pr_info!("The policy details are: {:?}\n", (policy.cpu(), policy.cur())); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#double_parens
= note:-W clippy::double-parensimplied by-W clippy::all
= help: to override-W clippy::alladd#[allow(clippy::double_parens)]
Quoted 5 lines
Quoted 1 line
warning: 1 warning emitted
That is already fixed and in mainline:
487f9b3dc6e5("rust: cpufreq:
suppressclippy::double_parensin Policy doctest").
That's what I thought I recalled, too. Weird that it is not in rust-next already, though.
thanks,
Signature · 1 line
John Hubbard
Quoted 3 lines · John Hubbard
That's what I thought I recalled, too. Weird that it is not in rust-next already, though.
It is normal -- in the kernel back merges are generally to be avoided.
Cheers,
Miguel
This series was applied to riscv/linux.git (fixes) by Miguel Ojeda <[email protected]>:
Hello:
This series was applied to riscv/linux.git (fixes) by Miguel Ojeda <[email protected]>:
Quoted 8 lines · On Mon, 6 Apr 2026 01:52:36 +0200 you wrote:
As proposed in the past in e.g. LPC 2025 and the Maintainers Summit [1], we are going to follow Debian Stable's Rust versions as our minimum supported version.
Debian Trixie was released with a Rust 1.85.0 toolchain [2], which it still uses to this day [3] (i.e. no update to Rust 1.85.1).
[...]
Here is the summary with links:
- [v2,01/33] rust: kbuild: remove --remap-path-prefix workarounds
https://git.kernel.org/riscv/c/c8cbe2fc22e4 - [v2,02/33] rust: kbuild: remove "`try` keyword" workaround for `bindgen` < 0.59.2 https://git.kernel.org/riscv/c/518b9ad2fab3 - [v2,03/33] rust: kbuild: remove unneeded old `allow`s for generated layout tests https://git.kernel.org/riscv/c/92cc022f044f - [v2,04/33] gpu: nova-core: bindings: remove unneeded `cfg_attr` https://git.kernel.org/riscv/c/341c51ee3293 - [v2,05/33] rust: bump Rust minimum supported version to 1.85.0 (Debian Trixie) https://git.kernel.org/riscv/c/f32fb9c58a5b - [v2,06/33] rust: bump Clippy's MSRV and clean `incompatible_msrv` allows https://git.kernel.org/riscv/c/b6cfba436623 - [v2,07/33] rust: allow globally `clippy::incompatible_msrv` https://git.kernel.org/riscv/c/7ed188605e1d - [v2,08/33] rust: simplify `RUSTC_VERSION` Kconfig conditions https://git.kernel.org/riscv/c/b28711ac98e8 - [v2,09/33] rust: remove `RUSTC_HAS_SLICE_AS_FLATTENED` and simplify code https://git.kernel.org/riscv/c/9b398d056543 - [v2,10/33] rust: remove `RUSTC_HAS_COERCE_POINTEE` and simplify code https://git.kernel.org/riscv/c/4ab22c543f18 - [v2,11/33] rust: kbuild: remove skipping of `-Wrustdoc::unescaped_backticks` https://git.kernel.org/riscv/c/0f6e1e0705f0 - [v2,12/33] rust: kbuild: remove `feature(...)`s that are now stable https://git.kernel.org/riscv/c/d1aa40daa777 - [v2,13/33] rust: transmute: simplify code with Rust 1.80.0 `split_at_*checked()` https://git.kernel.org/riscv/c/f309a6edda53 - [v2,14/33] rust: alloc: simplify with `NonNull::add()` now that it is stable https://git.kernel.org/riscv/c/161dd7b51e96 - [v2,15/33] rust: macros: simplify code using `feature(extract_if)` https://git.kernel.org/riscv/c/42ec980024f0 - [v2,16/33] rust: block: update `const_refs_to_static` MSRV TODO comment https://git.kernel.org/riscv/c/961b72d45ae4 - [v2,17/33] rust: bump `bindgen` minimum supported version to 0.71.1 (Debian Trixie) https://git.kernel.org/riscv/c/c3a00a3f31ff - [v2,18/33] rust: rust_is_available: remove warning for `bindgen` 0.66.[01] https://git.kernel.org/riscv/c/41cfbb4295cf - [v2,19/33] rust: rust_is_available: remove warning for `bindgen` < 0.69.5 && libclang >= 19.1 https://git.kernel.org/riscv/c/ae64324ad5c1 - [v2,20/33] rust: kbuild: update `bindgen --rust-target` version and replace comment https://git.kernel.org/riscv/c/276ed30c558e - [v2,21/33] rust: kbuild: remove "dummy parameter" workaround for `bindgen` < 0.71.1 https://git.kernel.org/riscv/c/93553d9922b0 - [v2,22/33] docs: rust: quick-start: openSUSE provides `rust-src` package nowadays https://git.kernel.org/riscv/c/53c9647c0a48 - [v2,23/33] docs: rust: quick-start: update Ubuntu versioned packages https://git.kernel.org/riscv/c/982e1aa6de73 - [v2,24/33] docs: rust: quick-start: update minimum Ubuntu version https://git.kernel.org/riscv/c/6767147cb941 - [v2,25/33] docs: rust: quick-start: add Ubuntu 26.04 LTS and remove subsection title https://git.kernel.org/riscv/c/780f847e1419 - [v2,26/33] docs: rust: quick-start: remove Gentoo "testing" note https://git.kernel.org/riscv/c/99c672426aed - [v2,27/33] docs: rust: quick-start: remove Nix "unstable channel" note https://git.kernel.org/riscv/c/b69a14650009 - [v2,28/33] docs: rust: quick-start: remove GDB/Binutils mention https://git.kernel.org/riscv/c/a4392ed1c8b9 - [v2,29/33] docs: rust: general-information: simplify Kconfig example https://git.kernel.org/riscv/c/9375ea727d7e - [v2,30/33] docs: rust: general-information: use real example https://git.kernel.org/riscv/c/86c5d1c6740c - [v2,31/33] rust: declare cfi_encoding for lru_status https://git.kernel.org/riscv/c/9e5946de3a38 - [v2,32/33] rust: kbuild: support global per-version flags https://git.kernel.org/riscv/c/b2aa1535ecdd - [v2,33/33] rust: kbuild: allow `clippy::precedence` for Rust < 1.86.0 https://git.kernel.org/riscv/c/2e2f8b5a0656
You are awesome, thank you!
Signature · 2 lines
Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html