Rust changes for v6.13

Toolchain and infrastructure:

 - Enable a series of lints, including safety-related ones, e.g. the
   compiler will now warn about missing safety comments, as well as
   unnecessary ones. How safety documentation is organized is a frequent
   source of review comments, thus having the compiler guide new
   developers on where they are expected (and where not) is very nice.

 - Start using '#[expect]': an interesting feature in Rust (stabilized
   in 1.81.0) that makes the compiler warn if an expected warning was
   _not_ emitted. This is useful to avoid forgetting cleaning up locally
   ignored diagnostics ('#[allow]'s).

 - Introduce '.clippy.toml' configuration file for Clippy, the Rust
   linter, which will allow us to tweak its behaviour. For instance, our
   first use cases are declaring a disallowed macro and, more
   importantly, enabling the checking of private items.

 - Lints-related fixes and cleanups related to the items above.

 - Migrate from 'receiver_trait' to 'arbitrary_self_types': to get the
   kernel into stable Rust, one of the major pieces of the puzzle is the
   support to write custom types that can be used as 'self', i.e. as
   receivers, since the kernel needs to write types such as 'Arc' that
   common userspace Rust would not. 'arbitrary_self_types' has been
   accepted to become stable, and this is one of the steps required to
   get there.

 - Remove usage of the 'new_uninit' unstable feature.

 - Use custom C FFI types. Includes a new 'ffi' crate to contain our
   custom mapping, instead of using the standard library 'core::ffi'
   one. The actual remapping will be introduced in a later cycle.

 - Map '__kernel_{size_t,ssize_t,ptrdiff_t}' to 'usize'/'isize' instead
   of 32/64-bit integers.

 - Fix 'size_t' in bindgen generated prototypes of C builtins.

 - Warn on bindgen < 0.69.5 and libclang >= 19.1 due to a double issue
   in the projects, which we managed to trigger with the upcoming
   tracepoint support. It includes a build test since some distributions
   backported the fix (e.g. Debian -- thanks!). All major distributions
   we list should be now OK except Ubuntu non-LTS.

'macros' crate:

 - Adapt the build system to be able run the doctests there too; and
   clean up and enable the corresponding doctests.

'kernel' crate:

 - Add 'alloc' module with generic kernel allocator support and remove
   the dependency on the Rust standard library 'alloc' and the extension
   traits we used to provide fallible methods with flags.

   Add the 'Allocator' trait and its implementations '{K,V,KV}malloc'.
   Add the 'Box' type (a heap allocation for a single value of type 'T'
   that is also generic over an allocator and considers the kernel's GFP
   flags) and its shorthand aliases '{K,V,KV}Box'. Add 'ArrayLayout'
   type. Add 'Vec' (a contiguous growable array type) and its shorthand
   aliases '{K,V,KV}Vec', including iterator support.

   For instance, now we may write code such as:

       let mut v = KVec::new();
       v.push(1, GFP_KERNEL)?;
       assert_eq!(&v, &[1]);

   Treewide, move as well old users to these new types.

 - 'sync' module: add global lock support, including the
   'GlobalLockBackend' trait; the 'Global{Lock,Guard,LockedBy}' types
    and the 'global_lock!' macro. Add the 'Lock::try_lock' method.

 - 'error' module: optimize 'Error' type to use 'NonZeroI32' and make
   conversion functions public.

 - 'page' module: add 'page_align' function.

 - Add 'transmute' module with the existing 'FromBytes' and 'AsBytes'
   traits.

 - 'block::mq::request' module: improve rendered documentation.

 - 'types' module: extend 'Opaque' type documentation and add simple
   examples for the 'Either' types.

drm/panic:

 - Clean up a series of Clippy warnings.

Documentation:

 - Add coding guidelines for lints and the '#[expect]' feature.

 - Add Ubuntu to the list of distributions in the Quick Start guide.

MAINTAINERS:
 - Add Danilo Krummrich as maintainer of the new 'alloc' module.

And a few other small cleanups and fixes.
rust: alloc: Fix `ArrayLayout` allocations

We were accidentally allocating a layout for the *square* of the object
size due to a variable shadowing mishap.

Fixes memory bloat and page allocation failures in drm/asahi.

Reported-by: Janne Grunau <j@jannau.net>
Fixes: 9e7bbfa18276 ("rust: alloc: introduce `ArrayLayout`")
Signed-off-by: Asahi Lina <lina@asahilina.net>
Acked-by: Danilo Krummrich <dakr@kernel.org>
Reviewed-by: Neal Gompa <neal@gompa.dev>
Link: https://lore.kernel.org/r/20241123-rust-fix-arraylayout-v1-1-197e64c95bd4@asahilina.net
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
1 file changed