Re: [PATCH v7 16/31] rust: ptr: add const_align_up()

From: David Rheinsberg

Date: Fri Mar 20 2026 - 04:40:01 EST


Hi

On Tue, Mar 17, 2026, at 11:53 PM, John Hubbard wrote:
> Add const_align_up() to kernel::ptr as the const-compatible equivalent
> of Alignable::align_up().
>
> Suggested-by: Danilo Krummrich <dakr@xxxxxxxxxx>
> Suggested-by: Gary Guo <gary@xxxxxxxxxxx>
> Suggested-by: Miguel Ojeda <ojeda@xxxxxxxxxx>
> Signed-off-by: John Hubbard <jhubbard@xxxxxxxxxx>
> ---
> rust/kernel/ptr.rs | 24 ++++++++++++++++++++++++
> 1 file changed, 24 insertions(+)
>
> diff --git a/rust/kernel/ptr.rs b/rust/kernel/ptr.rs
> index bdc2d79ff669..7e99f129543b 100644
> --- a/rust/kernel/ptr.rs
> +++ b/rust/kernel/ptr.rs
> @@ -253,3 +253,27 @@ fn size(p: *const Self) -> usize {
> p.len() * size_of::<T>()
> }
> }
> +
> +/// Aligns `value` up to `align`.
> +///
> +/// This is the const-compatible equivalent of [`Alignable::align_up`].
> +///
> +/// Returns [`None`] on overflow.
> +///
> +/// # Examples
> +///
> +/// ```
> +/// use kernel::ptr::{const_align_up, Alignment};
> +/// use kernel::sizes::SZ_4K;
> +///
> +/// assert_eq!(const_align_up(0x4f, Alignment::new::<16>()), Some(0x50));
> +/// assert_eq!(const_align_up(0x40, Alignment::new::<16>()), Some(0x40));
> +/// assert_eq!(const_align_up(1, Alignment::new::<SZ_4K>()), Some(SZ_4K));
> +/// ```
> +#[inline(always)]
> +pub const fn const_align_up(value: usize, align: Alignment) -> Option<usize> {
> + match value.checked_add(align.as_usize() - 1) {
> + Some(v) => Some(v & align.mask()),
> + None => None,
> + }

This would return `None` if the value is already aligned, but the addition overflows `usize`, right? For instance, this would incorrectly return `None`: `const_align_up(usize::MAX - 1, 2.into())`

FYI, `core` provides `usize::checked_next_multiple_of()` ((const-)stable since 1.73). So an alternative would be:

pub const fn const_align_up(value: usize, align: Alignment) -> Option<usize> {
value.checked_next_multiple_of(align.as_usize())
}

David