NVIDIA GPU driver infrastructure
 help / color / mirror / Atom feed
From: "Eliot Courtney" <ecourtney@nvidia.com>
To: "Gary Guo" <gary@garyguo.net>,
	"Eliot Courtney" <ecourtney@nvidia.com>,
	"Alice Ryhl" <aliceryhl@google.com>,
	"Burak Emir" <burak.emir@gmail.com>,
	"Yury Norov" <yury.norov@gmail.com>,
	"Miguel Ojeda" <ojeda@kernel.org>,
	"Boqun Feng" <boqun@kernel.org>,
	"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
	"Benno Lossin" <lossin@kernel.org>,
	"Andreas Hindborg" <a.hindborg@kernel.org>,
	"Trevor Gross" <tmgross@umich.edu>,
	"Danilo Krummrich" <dakr@kernel.org>,
	"Daniel Almeida" <daniel.almeida@collabora.com>,
	"Tamir Duberstein" <tamird@kernel.org>,
	"Alexandre Courbot" <acourbot@nvidia.com>,
	"Onur Özkan" <work@onurozkan.dev>,
	"David Airlie" <airlied@gmail.com>,
	"Simona Vetter" <simona@ffwll.ch>
Cc: "Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	"John Hubbard" <jhubbard@nvidia.com>,
	"Alistair Popple" <apopple@nvidia.com>,
	"Timur Tabi" <ttabi@nvidia.com>, "Zhi Wang" <zhiw@nvidia.com>,
	<rust-for-linux@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<nova-gpu@lists.linux.dev>, <dri-devel@lists.freedesktop.org>,
	"dri-devel" <dri-devel-bounces@lists.freedesktop.org>
Subject: Re: [PATCH v7 03/10] rust: num: add nz! macro for compile time NonZero values
Date: Tue, 25 Aug 2026 20:10:54 +0900	[thread overview]
Message-ID: <DKXZ9607IET4.3HNWMX2KULKIC@nvidia.com> (raw)
In-Reply-To: <DKT6WNPI2OA5.3RCBNYHHAFAD9@garyguo.net>

On Thu Aug 20, 2026 at 5:07 AM JST, Gary Guo wrote:
> On Mon Aug 17, 2026 at 8:04 AM BST, Eliot Courtney wrote:
>> Currently, using NonZero constants is quite verbose. It's unfortunate
>> because it disincentivizes using it in interface boundaries. Introduce a
>> macro to make it nicer to use.
>>
>> Link: https://lore.kernel.org/DKO414SNC0B2.248FUBGJGSPLU@kernel.org
>> Signed-off-by: Eliot Courtney <ecourtney@nvidia.com>
>> ---
>>  rust/kernel/num.rs | 23 +++++++++++++++++++++++
>>  1 file changed, 23 insertions(+)
>>
>> diff --git a/rust/kernel/num.rs b/rust/kernel/num.rs
>> index 8532b511384c..055d23ca7fd1 100644
>> --- a/rust/kernel/num.rs
>> +++ b/rust/kernel/num.rs
>> @@ -7,6 +7,29 @@
>>  pub mod bounded;
>>  pub use bounded::*;
>>  
>> +/// Infallibly creates a [`NonZero`] value from a constant expression.
>> +///
>> +/// [`NonZero`]: core::num::NonZero
>> +///
>> +/// # Examples
>> +///
>> +/// ```
>> +/// use core::num::NonZero;
>> +/// use kernel::nz;
>> +///
>> +/// let v: NonZero<usize> = nz!(8);
>> +/// assert_eq!(v.get(), 8);
>> +///
>> +/// const N: NonZero<u32> = nz!(0x10);
>> +/// assert_eq!(N.get(), 0x10);
>> +/// ```
>> +#[macro_export]
>> +macro_rules! nz {
>> +    ($v:expr) => {
>> +        const { ::core::num::NonZero::new($v).unwrap() }
>> +    };
>> +}
>
> I wonder if if we can have a generic macro for creating types from literals,
> given that this is needed for bounded too. Something like
>
>     trait FromLiteral {
>         fn from_literal<const N: i64>() -> Self;
>     }
>
>     impl FromLiteral for NonZero<u32> {
>         #[inline]
>         fn from_literal<const N: i64>() -> Self {
>             const_assert!(N > 0 && N < u32::MAX as i64);
>             const { NonZero::new(N as u32).unwrap() }
>         }
>     }
>
>     macro_rules! lit {
>         ($x:expr) => {
>             FromLiteral::from_literal::<{$x}>()
>         }
>     }
>
>     let nz: NonZero<u32> = lit!(1);
>     let bounded: Bounded<..> = lit!(1);
>
> I think the only downside is that this expression isn't const expr anymore. We
> can change this to be
>
>     const trait FromLiteral {
>         fn from_literal(v: i64) -> Self;
>     }
>
> when const trait impl is stable upstream and we have MSRV bumped high enough to
> have an impl of it.
>
> Best,
> Gary

I think this is a great idea. I would further generalise it to work on
any integer const expression (Maybe FromConst::from_const, and cv!
instead of lit! if we want to make the distinction of literals vs const
expression values). One example where only literals are not enough is in
the Bitmap tests we have nz!(usize::MAX).

We still have some usages in const contexts for Alignment so I still
think it's valuable to keep the SizeConstants on Alignment. And I think
Alignment::SZ_* is more informative than cv!(...) (or lit!(...)). But of
course we can completely replace nz! with this.


  reply	other threads:[~2026-08-25 11:11 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-17  7:04 [PATCH v7 00/10] rust: Add support for reserving of ranges of IDs Eliot Courtney
2026-08-17  7:04 ` [PATCH v7 01/10] rust: bitmap: use function-level cfg on kunit test Eliot Courtney
2026-08-17 10:29   ` Gary Guo
2026-08-17 19:42     ` Burak Emir
2026-08-17  7:04 ` [PATCH v7 02/10] rust: bitmap: restrict bitmap length to at most i32::MAX Eliot Courtney
2026-08-17 19:51   ` Burak Emir
2026-08-21  7:37   ` Alexandre Courbot
2026-08-24 12:04     ` Eliot Courtney
2026-08-17  7:04 ` [PATCH v7 03/10] rust: num: add nz! macro for compile time NonZero values Eliot Courtney
2026-08-19 20:07   ` Gary Guo
2026-08-25 11:10     ` Eliot Courtney [this message]
2026-08-21  7:39   ` Alexandre Courbot
2026-08-17  7:04 ` [PATCH v7 04/10] rust: sizes: implement SizeConstants for Alignment Eliot Courtney
2026-08-21  7:46   ` Alexandre Courbot
2026-08-25  6:59     ` Eliot Courtney
2026-08-17  7:04 ` [PATCH v7 05/10] rust: bitmap: add contiguous area operations Eliot Courtney
2026-08-17 20:12   ` Burak Emir
2026-08-21  8:11   ` Alexandre Courbot
2026-08-21  8:31     ` Miguel Ojeda
2026-08-21 11:04       ` Alexandre Courbot
2026-08-21 19:35         ` Miguel Ojeda
2026-08-25  8:33     ` Eliot Courtney
2026-08-17  7:04 ` [PATCH v7 06/10] rust: id_pool: take a NonZero capacity in with_capacity Eliot Courtney
2026-08-17 20:13   ` Burak Emir
2026-08-21  8:39   ` Alexandre Courbot
2026-08-25 11:09     ` Eliot Courtney
2026-08-25 13:12       ` Alice Ryhl
2026-08-25 12:10   ` Alice Ryhl
2026-08-17  7:04 ` [PATCH v7 07/10] rust: id_pool: add contiguous ID reservation Eliot Courtney
2026-08-17 20:21   ` Burak Emir
2026-08-21  8:30   ` Alexandre Courbot
2026-08-17  7:04 ` [PATCH v7 08/10] rust: id_pool: do not round capacity up to BitmapVec::MAX_INLINE_LEN Eliot Courtney
2026-08-17 20:39   ` Burak Emir
2026-08-17  7:04 ` [PATCH v7 09/10] gpu: nova-core: add ChannelIdPool Eliot Courtney
2026-08-17  7:04 ` [PATCH v7 10/10] rust: use Alignment size constants Eliot Courtney
2026-08-21 11:04   ` Alexandre Courbot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=DKXZ9607IET4.3HNWMX2KULKIC@nvidia.com \
    --to=ecourtney@nvidia.com \
    --cc=a.hindborg@kernel.org \
    --cc=acourbot@nvidia.com \
    --cc=airlied@gmail.com \
    --cc=aliceryhl@google.com \
    --cc=apopple@nvidia.com \
    --cc=bjorn3_gh@protonmail.com \
    --cc=boqun@kernel.org \
    --cc=burak.emir@gmail.com \
    --cc=dakr@kernel.org \
    --cc=daniel.almeida@collabora.com \
    --cc=dri-devel-bounces@lists.freedesktop.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=gary@garyguo.net \
    --cc=gregkh@linuxfoundation.org \
    --cc=jhubbard@nvidia.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lossin@kernel.org \
    --cc=nova-gpu@lists.linux.dev \
    --cc=ojeda@kernel.org \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=simona@ffwll.ch \
    --cc=tamird@kernel.org \
    --cc=tmgross@umich.edu \
    --cc=ttabi@nvidia.com \
    --cc=work@onurozkan.dev \
    --cc=yury.norov@gmail.com \
    --cc=zhiw@nvidia.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox