Skip to content

Tags: Rust-for-Linux/linux

Tags

v7.0-rc1

Toggle v7.0-rc1's commit message
Linux 7.0-rc1

rust-fixes-7.0

Toggle rust-fixes-7.0's commit message

Verified

This tag was signed with the committer’s verified signature.
ojeda Miguel Ojeda
Rust fixes for v7.0-rc1

Toolchain and infrastructure:

 - Pass '-Zunstable-options' flag required by the future Rust 1.95.0.

 - Fix 'objtool' warning for Rust 1.84.0.

'kernel' crate:

 - 'irq' module: add missing bound detected by the future Rust 1.95.0.

 - 'list' module: add missing 'unsafe' blocks and placeholder safety
   comments to macros (an issue for future callers within the crate).

'pin-init' crate:

 - Clean Clippy warning that changed behavior in the future Rust 1.95.0.

v6.19

Toggle v6.19's commit message
Linux 6.19

rust-6.20-7.0

Toggle rust-6.20-7.0's commit message

Verified

This tag was signed with the committer’s verified signature.
ojeda Miguel Ojeda
Rust changes for v6.20 / v7.0

Toolchain and infrastructure:

 - Add '__rust_helper' annotation to the C helpers.

   This is needed to inline these helpers into Rust code.

 - Remove imports available via the prelude, treewide.

   This was possible thanks to a new lint in Klint that Gary has
   implemented -- more Klint-related changes, including initial upstream
   support, are coming.

 - Deduplicate pin-init flags.

'kernel' crate:

 - Add support for calling a function exactly once with the new
   'do_once_lite!' macro (and 'OnceLite' type).

   Based on this, add 'pr_*_once!' macros to print only once.

 - Add 'impl_flags!' macro for defining common bitflags operations:

       impl_flags!(
           /// Represents multiple permissions.
           #[derive(Debug, Clone, Default, Copy, PartialEq, Eq)]
           pub struct Permissions(u32);

           /// Represents a single permission.
           #[derive(Debug, Clone, Copy, PartialEq, Eq)]
           pub enum Permission {
               /// Read permission.
               Read = 1 << 0,

               /// Write permission.
               Write = 1 << 1,

               /// Execute permission.
               Execute = 1 << 2,
           }
       );

       let mut f: Permissions = Permission::Read | Permission::Write;
       assert!(f.contains(Permission::Read));
       assert!(!f.contains(Permission::Execute));

       f |= Permission::Execute;
       assert!(f.contains(Permission::Execute));

       let f2: Permissions = Permission::Write | Permission::Execute;
       assert!((f ^ f2).contains(Permission::Read));
       assert!(!(f ^ f2).contains(Permission::Write));

 - 'bug' module: support 'CONFIG_DEBUG_BUGVERBOSE_DETAILED' in the
   'warn_on!' macro in order to show the evaluated condition alongside
   the file path:

        ------------[ cut here ]------------
        WARNING: [val == 1] linux/samples/rust/rust_minimal.rs:27 at ...
        Modules linked in: rust_minimal(+)

 - Add safety module with 'unsafe_precondition_assert!' macro, currently
   a wrapper for 'debug_assert!', intended to mark the validation of
   safety preconditions where possible:

       /// # Safety
       ///
       /// The caller must ensure that `index` is less than `N`.
       unsafe fn set_unchecked(&mut self, index: usize, value: T) {
           unsafe_precondition_assert!(
               index < N,
               "set_unchecked() requires index ({index}) < N ({N})"
           );

           ...
       }

 - Add instructions to 'build_assert!' documentation requesting to
   always inline functions when used with function arguments.

 - 'ptr' module: replace 'build_assert!' with a 'const' one.

 - 'rbtree' module: reduce unsafe blocks on pointer derefs.

 - 'transmute' module: implement 'FromBytes' and 'AsBytes' for
   inhabited ZSTs, and use it in Nova.

 - More treewide replacements of 'c_str!' with C string literals.

'macros' crate:

 - Rewrite most procedural macros ('module!', 'concat_idents!',
   '#[export]', '#[vtable]', '#[kunit_tests]') to use the 'syn' parsing
   library which we introduced last cycle, with better diagnostics.

   This also allows to support '#[cfg]' properly in the '#[vtable]'
   macro, to support arbitrary types in 'module!' macro (not just an
   identifier) and to remove several custom parsing helpers we had.

 - Use 'quote!' from the recently vendored 'quote' library and remove
   our custom one.

   The vendored one also allows us to avoid quoting '"' and '{}' inside
   the template anymore and editors can now highlight it. In addition,
   it improves robustness as it eliminates the need for string quoting
   and escaping.

 - Use 'pin_init::zeroed()' to simplify KUnit code.

'pin-init' crate:

 - Rewrite all procedural macros ('[pin_]init!', '#[pin_data]',
   '#[pinned_drop]', 'derive([Maybe]Zeroable)') to use the 'syn' parsing
   library which we introduced last cycle, with better diagnostics.

 - Implement 'InPlaceWrite' for '&'static mut MaybeUninit<T>'. This
   enables users to use external allocation mechanisms such as
   'static_cell'.

 - Support tuple structs in 'derive([Maybe]Zeroable)'.

 - Support attributes on fields in '[pin_]init!' (such as
   '#[cfg(...)]').

 - Add a '#[default_error(<type>)]' attribute to '[pin_]init!' to
   override the default error (when no '? Error' is specified).

 - Support packed structs in '[pin_]init!' with
   '#[disable_initialized_field_access]'.

 - Remove 'try_[pin_]init!' in favor of merging their feature
   with '[pin_]init!'. Update the kernel's own 'try_[pin_]init!'
   macros to use the 'default_error' attribute.

 - Correct 'T: Sized' bounds to 'T: ?Sized' in the generated
   'PinnedDrop' check by '#[pin_data]'.

Documentation:

 - Conclude the Rust experiment.

MAINTAINERS:

 - Add "RUST [RUST-ANALYZER]" entry for the rust-analyzer support. Tamir
   and Jesung will take care of it. They have both been active around it
   for a while. The new tree will flow through the Rust one.

 - Add Gary as maintainer for "RUST [PIN-INIT]".

 - Update Boqun and Tamir emails to their kernel.org accounts.

And a few other cleanups and improvements.

rust-fixes-6.19

Toggle rust-fixes-6.19's commit message

Verified

This tag was signed with the committer’s verified signature.
ojeda Miguel Ojeda
Rust fixes for v6.19

Toolchain and infrastructure:

  - Trigger rebuilds of the newly added 'proc-macro2' crate (and its
    dependencies) when the Rust compiler version changes.

  - Fix error in '.rsi' targets (macro expanding single targets) under
    'O=' pointing to an external (not subdir) folder.

  - Fix off-by-one line number in 'rustdoc' KUnit tests.

  - Add '-fdiagnostics-show-context' to GCC flags skipped by 'bindgen'.

  - Clean objtool warning by adding one more 'noreturn' function.

  - Clean 'libpin_init_internal.{so,dylib}' in 'mrproper'.

'kernel' crate:

  - Fix build error when using expressions in formatting arguments.

  - Mark 'num::Bounded::__new()' as unsafe and clean documentation
    accordingly.

  - Always inline functions using 'build_assert' with arguments.

  - Fix 'rusttest' build error providing the right 'isize_atomic_repr'
    type for the host.

'macros' crate:

  - Fix 'rusttest' build error by ignoring example.

rust-analyzer:

  - Remove assertion that was not true for distributions like NixOS.

  - Add missing dependency edges and fix editions for 'quote' and
    sysroot crates to provide correct IDE support.

DRM Tyr:

  - Fix build error by adding missing dependency on 'CONFIG_COMMON_CLK'.

Plus clean a few typos in docs and comments.

pin-init-v7.0

Toggle pin-init-v7.0's commit message
pin-init changes for v7.0

Added:

- '&'static mut MaybeUninit<T>' now implements 'InPlaceWrite'. This
  enables users to use external allocation mechanisms such as
  'static_cell'.

- Gary Guo as a Maintainer.

Changed:

- Rewrote all proc-macros ('[pin_]init!', '#[pin_data]',
  '#[pinned_drop]', 'derive([Maybe]Zeroable)'),  using 'syn' with better
  diagnostics.

- 'derive([Maybe]Zeroable)' now support tuple structs.

- '[pin_]init!' now supports attributes on fields (such as
  '#[cfg(...)]').

- Add a '#[default_error(<type>)]' attribute to '[pin_]init!' to
  override the default error (when no '? Error' is specified).

- Support packed struct in '[pin_]init!' with
  '#[disable_initialized_field_access]'.

Removed:

- 'try_[pin_]init!' have been removed in favor of merging their feature
  with '[pin_]init!'. The kernel's own 'try_[pin_]init!' macros have
  been updated to use the 'default_error' attribute.

Fixed:

- Corrected 'T: Sized' bounds to 'T: ?Sized' in the generated
  'PinnedDrop' check by '#[pin_data]'.

rust-xarray-for-v6.20-v7.0

Toggle rust-xarray-for-v6.20-v7.0's commit message
Rust XArray abstraction changes for v6.20/v7.0

 - Add `__rust_helper` to xarray abstraction C helpers.

rust-6.19

Toggle rust-6.19's commit message

Verified

This tag was signed with the committer’s verified signature.
ojeda Miguel Ojeda
Rust changes for v6.19

Toolchain and infrastructure:

 - Add support for 'syn'.

     Syn is a parsing library for parsing a stream of Rust tokens into a
     syntax tree of Rust source code.

     Currently this library is geared toward use in Rust procedural
     macros, but contains some APIs that may be useful more generally.

   'syn' allows us to greatly simplify writing complex macros such as
   'pin-init' (Benno has already prepared the 'syn'-based version). We
   will use it in the 'macros' crate too.

   'syn' is the most downloaded Rust crate (according to crates.io), and
   it is also used by the Rust compiler itself. While the amount of code
   is substantial, there should not be many updates needed for these
   crates, and even if there are, they should not be too big, e.g. +7k
   -3k lines across the 3 crates in the last year.

   'syn' requires two smaller dependencies: 'quote' and 'proc-macro2'.
   I only modified their code to remove a third dependency
   ('unicode-ident') and to add the SPDX identifiers. The code can be
   easily verified to exactly match upstream with the provided scripts.

   They are all licensed under "Apache-2.0 OR MIT", like the other
   vendored 'alloc' crate we had for a while.

   Please see the merge commit with the cover letter for more context.

 - Allow 'unreachable_pub' and 'clippy::disallowed_names' for doctests.

   Examples (i.e. doctests) may want to do things like show public items
   and use names such as 'foo'.

   Nevertheless, we still try to keep examples as close to real code as
   possible (this is part of why running Clippy on doctests is important
   for us, e.g. for safety comments, which userspace Rust does not
   support yet but we are stricter).

'kernel' crate:

 - Replace our custom 'CStr' type with 'core::ffi::CStr'.

   Using the standard library type reduces our custom code footprint,
   and we retain needed custom functionality through an extension trait
   and a new 'fmt!' macro which replaces the previous 'core' import.

   This started in 6.17 and continued in 6.18, and we finally land the
   replacement now. This required quite some stamina from Tamir, who
   split the changes in steps to prepare for the flag day change here.

 - Replace 'kernel::c_str!' with C string literals.

   C string literals were added in Rust 1.77, which produce '&CStr's
   (the 'core' one), so now we can write:

       c"hi"

   instead of:

       c_str!("hi")

 - Add 'num' module for numerical features.

   It includes the 'Integer' trait, implemented for all primitive
   integer types.

   It also includes the 'Bounded' integer wrapping type: an integer
   value that requires only the 'N' less significant bits of the wrapped
   type to be encoded:

       // An unsigned 8-bit integer, of which only the 4 LSBs are used.
       let v = Bounded::<u8, 4>::new::<15>();
       assert_eq!(v.get(), 15);

   'Bounded' is useful to e.g. enforce guarantees when working with
   bitfields that have an arbitrary number of bits.

   Values can be constructed from simple non-constant expressions or,
   for more complex ones, validated at runtime.

   'Bounded' also comes with comparison and arithmetic operations (with
   both their backing type and other 'Bounded's with a compatible
   backing type), casts to change the backing type, extending/shrinking
   and infallible/fallible conversions from/to primitives as applicable.

 - 'rbtree' module: add immutable cursor ('Cursor').

   It enables to use just an immutable tree reference where appropriate.
   The existing fully-featured mutable cursor is renamed to 'CursorMut'.

kallsyms:

 - Fix wrong "big" kernel symbol type read from procfs.

'pin-init' crate:

 - A couple minor fixes (Benno asked me to pick these patches up for
   him this cycle).

Documentation:

 - Quick Start guide: add Debian 13 (Trixie).

   Debian Stable is now able to build Linux, since Debian 13 (released
   2025-08-09) packages Rust 1.85.0, which is recent enough.

   We are planning to propose that the minimum supported Rust version in
   Linux follows Debian Stable releases, with Debian 13 being the first
   one we upgrade to, i.e. Rust 1.85.

MAINTAINERS:

 - Add entry for the new 'num' module.

 - Remove Alex as Rust maintainer: he hasn't had the time to contribute
   for a few years now, so it is a no-op change in practice.

And a few other cleanups and improvements.

rust-fixes-6.18-2

Toggle rust-fixes-6.18-2's commit message

Verified

This tag was signed with the committer’s verified signature.
ojeda Miguel Ojeda
Rust fixes for v6.18 (2nd)

Toolchain and infrastructure:

  - Fix a Rust 1.91.0 build issue due to 'bindings.o' not containing
    DWARF debug information anymore by teaching gendwarfksyms to skip
    object files without exports.

rust-fixes-6.18

Toggle rust-fixes-6.18's commit message

Verified

This tag was signed with the committer’s verified signature.
ojeda Miguel Ojeda
Rust fixes for v6.18

Toolchain and infrastructure:

  - Fix/workaround a couple Rust 1.91.0 build issues when sanitizers are
    enabled due to extra checking performed by the compiler and an
    upstream issue already fixed for Rust 1.93.0.

  - Fix future Rust 1.93.0 builds by supporting the stabilized name for
    the 'no-jump-tables' flag.

  - Fix a couple private/broken intra-doc links uncovered by the future
    move of pin-init to 'syn'.