From: Deborah Brouwer <deborah.brouwer@collabora.com>
To: sashiko-reviews@lists.linux.dev
Cc: Ke Sun <sunke@kylinos.cn>,
dri-devel@lists.freedesktop.org, ojeda@kernel.org,
gary@garyguo.net
Subject: Re: [PATCH v6 04/10] drm/tyr: add per-file VM pool
Date: Thu, 12 Nov 2026 18:17:50 -0700 [thread overview]
Message-ID: <avZlPvHqlxmu2hNO@um790> (raw)
In-Reply-To: <sashiko-outbox-204259@kernel.org>
On Mon, Nov 09, 2026 at 12:48:15AM +0000, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential
> issue to consider:
> - [Medium] drm/tyr: off-by-one IdPool capacity in VmPool::new() on
> 32-bit builds
> --
>
> commit 6b8d6be457daf3e5e905977c364059ce3d3249e4
> Author: Alvin Sun <alvin.sun@linux.dev>
>
> drm/tyr: add per-file VM pool
>
> This commit introduces VmPool to manage up to 32 GPU address spaces per open
> file using an IdPool and an XArray, tearing down remaining VMs when the pool
> is dropped.
>
> > diff --git a/drivers/gpu/drm/tyr/vm.rs b/drivers/gpu/drm/tyr/vm.rs
> > index 1dd11b2b12532..6f5518652a03f 100644
> > --- a/drivers/gpu/drm/tyr/vm.rs
> > +++ b/drivers/gpu/drm/tyr/vm.rs
>
> [ ... ]
>
> > @@ -947,3 +953,135 @@ fn pt_unmap(dev: &Device, pt: &IoPageTable<'_, ARM64LPAES1>, range: Range<u64>)
> >
> > Ok(())
> > }
> > +
> > +/// Maximum number of VMs a single file may hold, matching panthor's
> > +/// `PANTHOR_MAX_VMS_PER_FILE`.
> > +const MAX_VMS_PER_FILE: usize = 32;
>
> [ ... ]
>
> > +impl<'drm> VmPool<'drm> {
> > + /// Creates a new [`VmPool`].
> > + #[expect(dead_code)]
> > + pub(crate) fn new(dev: &'drm Device<Bound>) -> impl PinInit<Self> {
> > + let ids = IdPool::new();
> > + pin_init!(Self {
> > + dev,
> > + ids <- new_mutex!(ids),
> > + vms <- XArray::new(AllocKind::Alloc),
> > + })
> > + }
> > +
> > + /// Stores the VM and returns the allocated ID.
> > + ///
> > + /// On failure - ID space exhausted or a store failure - the VM is
> > + /// returned in an [`AddError`] so the caller owns the teardown.
> > + // TODO: allocate IDs with the XArray directly (once it grows range
> > + // allocation, the equivalent of C's `XA_LIMIT`) and drop the IdPool.
> > + #[expect(dead_code)]
> > + pub(crate) fn add(&self, vm: Arc<Vm<'drm>>) -> Result<u32, AddError<'drm>> {
> > + let id = (|| {
> > + let mut ids = self.ids.lock();
> > + let unused = ids.find_unused_id(1).ok_or(ENOSPC)?;
> > + if unused.as_usize() > MAX_VMS_PER_FILE {
> > + return Err(ENOSPC);
> > + }
> > + Ok(unused.acquire())
> > + })();
>
> [Severity: Medium]
> Can VmPool::add() fail with ENOSPC on the 32nd VM on 32-bit builds?
>
> IdPool::new() creates an inline bitmap of length usize::BITS, which is 32 on
> 32-bit platforms (indices 0..=31). Because find_unused_id(1) skips bit 0,
> allocating 32 VMs requires bit index 32, so only 31 VMs (IDs 1..=31) can be
> allocated before find_unused_id(1) returns None. Searching from bit 0 and
> adding 1 to form the 1-based VM ID (subtracting 1 on release_id()) would fit
> all 32 VMs within indices 0..=31.
Yes, this makes sense, on 32-bit builds the bitmap will stop at bit 31
and since we won't use bit 0, this gives us only 31 possible vm ids.
Instead of adding an off-by-one offset which seems like it could add
more confusion, what do you think of using the IdPool::with_capacity()
function? Something like:
let ids = IdPool::with_capacity(MAX_VMS_PER_FILE + 1, GFP_KERNEL)?;
We would need to adjust the error handlings since this
is fallible but it might be simpler overall.
Deborah
>
> --
> Sashiko AI review · https://sashiko.dev/#/patchset/20261109-tyr-ioctls-v6-0-b2896bf2b3c9@kylinos.cn?part=4
next prev parent reply other threads:[~2026-11-13 1:18 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-09 0:36 [PATCH v6 00/10] drm/tyr: add VM and BO ioctl support Ke Sun via B4 Relay
2026-11-09 0:36 ` Ke Sun
2026-11-09 0:36 ` [PATCH v6 01/10] rust: sizes: add SZ_4G constant Ke Sun via B4 Relay
2026-11-09 0:36 ` Ke Sun
2026-11-09 0:36 ` [PATCH v6 02/10] rust: task: add task_size() Ke Sun via B4 Relay
2026-11-09 0:36 ` Ke Sun
2026-11-09 0:36 ` [PATCH v6 03/10] rust: sync: arc: relax `ForeignOwnable` for `Arc<T>` Ke Sun via B4 Relay
2026-11-09 0:36 ` Ke Sun
2026-11-09 0:36 ` [PATCH v6 04/10] drm/tyr: add per-file VM pool Ke Sun via B4 Relay
2026-11-09 0:36 ` Ke Sun
2026-11-09 0:48 ` sashiko-bot
2026-11-13 1:17 ` Deborah Brouwer [this message]
2026-11-09 0:36 ` [PATCH v6 05/10] drm/tyr: add user and MCU VM specifications Ke Sun via B4 Relay
2026-11-09 0:36 ` Ke Sun
2026-11-09 0:36 ` [PATCH v6 06/10] drm/tyr: add BO creation and lookup helpers Ke Sun via B4 Relay
2026-11-09 0:36 ` Ke Sun
2026-11-09 0:36 ` [PATCH v6 07/10] drm/tyr: add VM-related ioctls Ke Sun via B4 Relay
2026-11-09 0:36 ` Ke Sun
2026-11-09 1:01 ` sashiko-bot
2026-11-09 0:36 ` [PATCH v6 08/10] rust: device: expose the device DMA attribute Ke Sun via B4 Relay
2026-11-09 0:36 ` Ke Sun
2026-11-09 0:36 ` [PATCH v6 09/10] drm/tyr: support write-combine BO mappings Ke Sun via B4 Relay
2026-11-09 0:36 ` Ke Sun
2026-11-09 1:10 ` sashiko-bot
2026-11-09 0:36 ` [PATCH v6 10/10] drm/tyr: add BO-related ioctls Ke Sun via B4 Relay
2026-11-09 0:36 ` Ke Sun
2026-11-09 1:05 ` sashiko-bot
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=avZlPvHqlxmu2hNO@um790 \
--to=deborah.brouwer@collabora.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=gary@garyguo.net \
--cc=ojeda@kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
--cc=sunke@kylinos.cn \
/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.