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 v11 4/5] rust: id_pool: do not round capacity up to BitmapVec::MAX_INLINE_LEN
Date: Tue, 10 Nov 2026 16:29:32 +0900 [thread overview]
Message-ID: <DMRCRMCFK31H.3GH97ALPTUEKU@nvidia.com> (raw)
In-Reply-To: <DMQOOESYWNCC.2SKYV8O6YSYOA@garyguo.net>
On Mon Nov 9, 2026 at 9:36 PM JST, Gary Guo wrote:
> On Mon Nov 9, 2026 at 8:32 AM GMT, Eliot Courtney wrote:
>> Current code in IdPool::with_capacity rounds the capacity up to
>> BitmapVec::MAX_INLINE_LEN, but BitmapVec::new works fine with values
>> smaller than this and still uses an inline representation. Remove this
>> behaviour.
>>
>> This allows specifying a real capacity of 0, which was not previously
>> possible. This breaks `grow_request` in this case, so change it to grow
>> to at least `BitmapVec::MAX_INLINE_LEN`, mirroring the capacity floor in
>> `shrink_request`.
>>
>> Reviewed-by: Alice Ryhl <aliceryhl@google.com>
>> Reviewed-by: Burak Emir <burak.emir@gmail.com>
>> Signed-off-by: Eliot Courtney <ecourtney@nvidia.com>
>> ---
[...]
>> /// Returns a [`ReallocRequest`] for growing this [`IdPool`], if possible.
>> ///
>> + /// Grows to at least [`MAX_INLINE_LEN`].
>> /// The capacity of an [`IdPool`] cannot be grown above [`MAX_LEN`].
>> ///
>> + /// [`MAX_INLINE_LEN`]: BitmapVec::MAX_INLINE_LEN
>> /// [`MAX_LEN`]: BitmapVec::MAX_LEN
>> + ///
>> + /// # Examples
>> + ///
>> + /// ```
>> + /// use kernel::{
>> + /// alloc::AllocError,
>> + /// bitmap::BitmapVec,
>> + /// id_pool::IdPool, //
>> + /// };
>> + ///
>> + /// // Grow goes to at least BitmapVec::MAX_INLINE_LEN.
>> + /// let mut pool = IdPool::with_capacity(1, GFP_KERNEL)?;
>> + /// let resizer = pool.grow_request().ok_or(AllocError)?.realloc(GFP_KERNEL)?;
>> + /// pool.grow(resizer);
>> + /// assert_eq!(pool.capacity(), BitmapVec::MAX_INLINE_LEN);
>> + ///
>> + /// // Grow doubles if at least BitmapVec::MAX_INLINE_LEN.
>> + /// let resizer = pool.grow_request().ok_or(AllocError)?.realloc(GFP_KERNEL)?;
>> + /// pool.grow(resizer);
>> + /// assert_eq!(pool.capacity(), 2 * BitmapVec::MAX_INLINE_LEN);
>> + /// # Ok::<(), AllocError>(())
>> + /// ```
>> #[inline]
>> pub fn grow_request(&self) -> Option<ReallocRequest> {
>> - let num_ids = self.capacity() * 2;
>> + let num_ids = usize::max(BitmapVec::MAX_INLINE_LEN, self.capacity() * 2);
>
> It looks like your want the `IdPool` have a controlled capacity. However, as
> soon as `grow_request` is used, the capacity becomes uncontrolled.
>
> It feels that this actually means that there are two use cases here: unbounded
> IdPool (where capacity just means the _current_ capacity) and bounded IdPool
> (where capacity means the _max_ capacity).
>
> This is more similar to a difference between `len()` and `capacity()`. It feels
> to me that you're merrging `Vec<bool>` and `Box<[bool]>` into a single type
> where it shouldn't.
Yerp I agree there are two use cases here and this is adding the
"fixed+controlled capacity" use case. But e.g. for `Vec`, we also have
this "double use case" with `push_within_capacity`. So you can use `Vec`
in both use cases as well.
The analogy would be:
Vec::len <=> # of actually allocated ids
Vec::capacity <=> # of available or allocated ids
Vec::push_within_capacity <=> IdPool::find_unused_id / reserve_ids
Vec::reserve <=> IdPool::grow / IdPool::grow_request
Vec::shrink_to <=> IdPool::shrink / IdPool::shrink_request
Vec::push equivalent doesn't exist because neither binder's use case
(needs to separate allocation) nor nova's use case (uses fixed capacity)
requires a combined "reserve and push_within_capacity".
That said with this patch `IdPool::with_capacity` provides a guarantee
of the capacity which `Vec::with_capacity` doesn't (altho I think it
could for non-ZSTs). So I agree that there is a conceptual difference
here w.r.t. "controlled" (guaranteed) capacity. The reason I did it this
way is that I think that providing this extra guarantee is easy to do
(removes code) without unduly complicating IdPool, plus adding
to/allowing reuse of the existing common API functions.
We could consider in a follow-up to introduce a typestate, like Fixed vs
Growable (defaulting to Growable) and grow/shrink is only implemented
for `Growable`. But IMO it's overcomplicated to do this - if you don't
want to grow it, just don't grow it. It's currently very hard to
accidentally grow IdPool (compared to Vec where it would be far easier
to mess it up if you tried to control the capacity). Perhaps if later
many more things are added to IdPool then it'll then be worth to split
it.
WDYT?
next prev parent reply other threads:[~2026-11-10 7:30 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-09 8:32 [PATCH v11 0/5] rust: Add support for reserving of ranges of IDs Eliot Courtney
2026-11-09 8:32 ` [PATCH v11 1/5] rust: io: use Alignment size constants Eliot Courtney
2026-11-09 12:37 ` Gary Guo
2026-11-09 8:32 ` [PATCH v11 2/5] rust: gpu: buddy: " Eliot Courtney
2026-11-09 12:37 ` Gary Guo
2026-11-09 8:32 ` [PATCH v11 3/5] gpu: nova-core: " Eliot Courtney
2026-11-09 12:37 ` Gary Guo
2026-11-09 8:32 ` [PATCH v11 4/5] rust: id_pool: do not round capacity up to BitmapVec::MAX_INLINE_LEN Eliot Courtney
2026-11-09 12:08 ` Alexandre Courbot
2026-11-09 12:36 ` Gary Guo
2026-11-10 7:29 ` Eliot Courtney [this message]
2026-11-09 8:32 ` [PATCH v11 5/5] gpu: nova-core: add ChannelIdPool Eliot Courtney
2026-11-09 21:21 ` (subset) [PATCH v11 0/5] rust: Add support for reserving of ranges of IDs Danilo Krummrich
2026-11-09 21:33 ` Danilo Krummrich
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=DMRCRMCFK31H.3GH97ALPTUEKU@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
all inboxes | Powered by JetHome®