Re: [PATCH v7 04/10] rust: sizes: implement SizeConstants for Alignment

From: Alexandre Courbot

Date: Fri Aug 21 2026 - 03:47:23 EST


On Mon Aug 17, 2026 at 4:04 PM JST, Eliot Courtney wrote:
> Currently, constructing an alignment is quite verbose:
>
> `Alignment::new::<8>()`
>
> It's unfortunate because it disincentivizes using it at interface
> boundaries. Implement `SizeConstants` for `Alignment` and add some more
> size constants (mirroring include/linux/sizes.h) so we can write e.g.
> `Alignment::SZ_8` instead.

These are two good ideas, but since they are orthogonal they ought to be
in their own separate patch. :)

<...>
> @@ -99,13 +125,22 @@ macro_rules! define_sizes {
> /// choose the width that matches their hardware. All `SZ_*` values fit
> /// in a [`u32`], so all implementations are lossless.
> ///
> + /// Also implemented for [`Alignment`], providing each size as a
> + /// compile-time validated alignment.
> + ///
> + /// [`Alignment`]: crate::ptr::Alignment
> + ///
> /// # Examples
> ///
> /// ```
> - /// use kernel::sizes::SizeConstants;
> + /// use kernel::{
> + /// ptr::Alignment,
> + /// sizes::SizeConstants, //
> + /// };
> ///
> /// let gpu_heap = 14 * u64::SZ_1M;
> /// let mmio_window = u32::SZ_16M;
> + /// let page_align = Alignment::SZ_4K;
> /// ```
> pub trait SizeConstants {
> $(
> @@ -117,6 +152,16 @@ pub trait SizeConstants {
>
> (@impls [] $($(#[$meta:meta])* $name:ident,)*) => {};
>
> + (@impl_alignment $($(#[$meta:meta])* $name:ident,)*) => {
> + impl SizeConstants for crate::ptr::Alignment {
> + $(
> + $(#[$meta])*
> + // A non-power-of-two constant will fail the build here if used.
> + const $name: Self = crate::ptr::Alignment::new_checked(self::$name).unwrap();

Since this is a const, you can use:

const $name: Self = crate::ptr::Alignment::new::<{ self::$name }>();

Which we should prefer over using `unwrap`, even compile-time checked ones.