From: "Alexandre Courbot" <acourbot@nvidia.com>
To: "Yury Norov" <ynorov@nvidia.com>
Cc: "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>, "Gary Guo" <gary@garyguo.net>,
"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>,
"Onur Özkan" <work@onurozkan.dev>,
"David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"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
Subject: Re: [PATCH v9 8/9] rust: id_pool: do not round capacity up to BitmapVec::MAX_INLINE_LEN
Date: Fri, 09 Oct 2026 23:07:51 +0900 [thread overview]
Message-ID: <DM0D75ZTTQXJ.2XADVI38UGH7C@nvidia.com> (raw)
In-Reply-To: <ase7IBtZjQsPVWSN@yury>
On Fri Oct 9, 2026 at 12:47 AM JST, Yury Norov wrote:
> On Thu, Oct 01, 2026 at 03:20:40PM +0900, Alexandre Courbot wrote:
>> On Wed Sep 30, 2026 at 2:05 PM JST, Yury Norov wrote:
>
> ...
>
>> > Allocating a pool with 0-bit capacity is wrong. Please don't put it
>> > in the examples. I recall I pointed that this object would panic the
>> > kernel if, for example, you call pool.next_zero_bit(0) immediately
>> > after this. Sorry, but NAK.
>> >
>> > This .with_capacity() should take num_ids: NonZero, after all...
>>
>> This panic is not specific to the size zero, any size triggers the same
>> behavior when accessed out of bounds.
>
> In C, malloc(0) is implementation defined behavior, i.e. it can return
> a pointer valid for free(), or NULL (which is also valid for free).
>
> This is a very old legacy coming from K&R implementation, then rejected
> in C89, and later this all became an impl-def, mostly for compatibility
> reasons. See 7.20.3 in
>
> https://www.open-std.org/jtc1/sc22/wg14/www/docs/n937.pdf
>
> Rust adopted C bitmaps, thus creating 0-bit bitmap may go through, and
> hit that questionable behavior. You add this example without any
> discussion about all that possible complications, and with no
> protection for users.
>
> Interestingly, you're doing it for the reason that has been considered
> a bad practice for over 30 years ago - malloc(0) with the immediate
> realloc(). See the above link for details.
>
> To me it looks like pulling legacy with a potential of undefined behavior
> into Rust.
>
> Bitmaps is a way more simple case than the generic malloc(). There's the
> only user of bitmaps - the Linux kernel, so we know exactly all users and
> their user patterns. I'm not aware of any in-tree user allocating 0-length
> bitmap for whatever reason, and such a coding style is highly unwelcome
> nowadays (30+ years).
>
> When it comes to rust, things are even simpler. Rust has much stricter
> memory policy - no undefined behavior, no implementation-defined behavior
> is allowed, no 50-years old legacy has to be considered.
>
> Rust community decided to take the existing in-kernel implementation of
> bitmaps written in C, for a reason. But with that it pulls all undefined
> and poorly defined behavior associate to C language. We did quite well
> spotting such places and fencing them with safety checks.
>
> The 0-length bitmaps is just another case that should be resolved.
As it turns out we would never perform a zero-sized malloc, even for a
zero-sized bitmap. `IdPool` is backed by a `BitmapVec`, which up to
`usize::BITS` uses an inline member as backing storage. So we would
never call `bitmap_zalloc` with a value of 0, making the safety concern
moot.
>
> If you still think that you need 0-length bitmaps in Rust, can you please
> give the clear and thorough explanation why rust needs those 0-length
> bitmaps. Are there any in-kernel examples? Any language concepts requiring
> it? If not, it's still a NAK.
I don't know of an in-kernel example, but please look at the
`bitmap_vec_new` test which has been here since the API was initially
merged last year: the first thing it does is create a zero-sized bitmap.
It is also easy to imagine a user starting with an empty pool and
growing it on-demand. Having the ability to create a zero-sized pool is
convenient to avoid special-casing user code, and in this case I'd say
expected, just like you can create a zero-sized vector. Again a size of
zero does not trigger anything that a larger capacity cannot trigger, so
I don't see a reason to forbid it.
>
>> A size of zero has nothing special
>> in that respect, so why make an exception and forbid it? We had this
>> discussion some time ago [1][2], and I'd recommend instead making e.g.
>> `next_zero_bit` return `None` on out-of-bounds accesses, which is
>> semantically correct.
>
> No. out-of-bound access should panic because every caller of bitmap
> API knows the length of that bitmap.
Right now out-of-bound accesses are allowed if
`CONFIG_RUST_BITMAP_HARDENED` is not set. The Kconfig documentation for
that option even says "if unsure, say N", which suggests that not
panicking (and thus the behavior I described above for `next_zero_bit`)
is the default. If out-of-bound accesses should panic, then the Kconfig
does not reflect that.
>
> But if you make that 0-length bitmap a valid case, we need to revisit
> every function and make sure it returns ENOENT or something instead of
> panicking. That, again, must be very well explained and justified, and
> all this has to be done before adding 0-length bitmap support in code
> and examples.
With hardening off, every function already behaves in that way, and
existing user code is already written to not trigger that condition
anyway (because of the possibility of a panic), so that would be a
pretty innocuous change.
next prev parent reply other threads:[~2026-10-09 14:07 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-30 2:42 [PATCH v9 0/9] rust: Add support for reserving of ranges of IDs Eliot Courtney
2026-09-30 2:42 ` [PATCH v9 1/9] rust: bitmap: use function-level cfg on kunit test Eliot Courtney
2026-09-30 2:42 ` [PATCH v9 2/9] rust: bitmap: restrict bitmap length to at most i32::MAX Eliot Courtney
2026-09-30 2:42 ` [PATCH v9 3/9] rust: sizes: add sub-1K size constants Eliot Courtney
2026-09-30 9:12 ` Miguel Ojeda
2026-09-30 11:04 ` Alexandre Courbot
2026-09-30 11:22 ` Miguel Ojeda
2026-10-01 0:40 ` Gary Guo
2026-10-01 5:23 ` Eliot Courtney
2026-09-30 2:42 ` [PATCH v9 4/9] rust: sizes: implement SizeConstants for Alignment Eliot Courtney
2026-09-30 9:12 ` Miguel Ojeda
2026-09-30 2:42 ` [PATCH v9 5/9] rust: use Alignment size constants Eliot Courtney
2026-09-30 2:42 ` [PATCH v9 6/9] rust: bitmap: add contiguous area operations Eliot Courtney
2026-09-30 4:41 ` Yury Norov
2026-09-30 2:42 ` [PATCH v9 7/9] rust: id_pool: add contiguous ID reservation Eliot Courtney
2026-09-30 2:51 ` sashiko-bot
2026-09-30 4:50 ` Yury Norov
2026-09-30 2:42 ` [PATCH v9 8/9] rust: id_pool: do not round capacity up to BitmapVec::MAX_INLINE_LEN Eliot Courtney
2026-09-30 2:52 ` sashiko-bot
2026-09-30 5:05 ` Yury Norov
2026-10-01 6:20 ` Alexandre Courbot
2026-10-08 15:47 ` Yury Norov
2026-10-08 16:04 ` Gary Guo
2026-10-09 14:07 ` Alexandre Courbot [this message]
2026-10-09 18:48 ` Burak Emir
2026-09-30 2:42 ` [PATCH v9 9/9] gpu: nova-core: add ChannelIdPool Eliot Courtney
2026-10-08 15:04 ` [PATCH v9 0/9] rust: Add support for reserving of ranges of IDs Alexandre Courbot
2026-10-11 9:15 ` Miguel Ojeda
2026-10-13 13:26 ` Miguel Ojeda
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=DM0D75ZTTQXJ.2XADVI38UGH7C@nvidia.com \
--to=acourbot@nvidia.com \
--cc=a.hindborg@kernel.org \
--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@lists.freedesktop.org \
--cc=ecourtney@nvidia.com \
--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=ynorov@nvidia.com \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.