Skip to content

rust-6.14

@ojeda ojeda tagged this 19 Jan 22:11
Toolchain and infrastructure:

 - Finish the move to custom FFI integer types started in the previous
   cycle and finally map 'long' to 'isize' and 'char' to 'u8'. Do a few
   cleanups on top thanks to that.

 - Start to use 'derive(CoercePointee)' on Rust >= 1.84.0.

   This is a major milestone on the path to build the kernel using only
   stable Rust features. In particular, previously we were using the
   unstable features 'coerce_unsized', 'dispatch_from_dyn' and 'unsize',
   and now we will use the new 'derive_coerce_pointee' one, which is on
   track to stabilization. This new feature is a macro that essentially
   expands into code that internally uses the unstable features that we
   were using before, without having to expose those.

   With it, stable Rust users, including the kernel, will be able to
   build custom smart pointers that work with trait objects, e.g.:

       fn f(p: &Arc<dyn Display>) {
           pr_info!("{p}\n");
       }

       let a: Arc<dyn Display> = Arc::new(42i32, GFP_KERNEL)?;
       let b: Arc<dyn Display> = Arc::new("hello there", GFP_KERNEL)?;

       f(&a); // Prints "42".
       f(&b); // Prints "hello there".

   Together with the 'arbitrary_self_types' feature that we started
   using in the previous cycle, using our custom smart pointers like
   'Arc' will eventually only rely in stable Rust.

 - Introduce 'PROCMACROLDFLAGS' environment variable to allow to link
   Rust proc macros using different flags than those used for linking
   Rust host programs (e.g. when 'rustc' uses a different C library
   than the host programs' one), which Android needs.

 - Help kernel builds under macOS with Rust enabled by accomodating
   other naming conventions for dynamic libraries (i.e. '.so' vs.
   '.dylib') which are used for Rust procedural macros. The actual
   support for macOS (i.e. the rest of the pieces needed) is provided
   out-of-tree by others, following the policy used for other parts of
   the kernel by Kbuild.

 - Run Clippy for 'rusttest' code too and clean the bits it spotted.

 - Provide Clippy with the minimum supported Rust version to improve
   the suggestions it gives.

 - Document 'bindgen' 0.71.0 regression.

'kernel' crate:

 - 'build_error!': move users of the hidden function to the documented
   macro, prevent such uses in the future by moving the function
   elsewhere and add the macro to the prelude.

 - 'types' module: add improved version of 'ForeignOwnable::borrow_mut'
   (which was removed in the past since it was problematic); change
   'ForeignOwnable' pointer type to '*mut'.

 - 'alloc' module: implement 'Display' for 'Box' and align the 'Debug'
   implementation to it; add example (doctest) for 'ArrayLayout::new()'.

 - 'sync' module: document 'PhantomData' in 'Arc'; use
   'NonNull::new_unchecked' in 'ForeignOwnable for Arc' impl.

 - 'uaccess' module: accept 'Vec's with different allocators in
   'UserSliceReader::read_all'.

 - 'workqueue' module: enable run-testing a couple more doctests.

 - 'error' module: simplify 'from_errno()'.

 - 'block' module: fix formatting in code documentation (a lint to catch
   these is being implemented).

 - Avoid 'unwrap()'s in doctests, which also improves the examples by
   showing how kernel code is supposed to be written.

 - Avoid 'as' casts with 'cast{,_mut}' calls which are a bit safer.

And a few other cleanups.
Assets 2
Loading