Re: [PATCH v3 2/2] drm/tyr: allow userspace buffers to be mismatched
From: Deborah Brouwer
Date: Mon Oct 19 2026 - 19:49:36 EST
On Mon, Oct 19, 2026 at 08:01:59AM +0000, Alice Ryhl wrote:
> On Fri, Oct 16, 2026 at 01:44:21PM -0700, Deborah Brouwer wrote:
> > Allow userspace to provide a buffer that is smaller or larger than the
> > object that the kernel expects to write into it.
> >
> > Set a minimum buffer size to match those in PANTHOR_UOBJ_MIN_SIZE. If
> > userspace provides at least the minimum buffer size, then simply write
> > until the buffer is full.
> >
> > If userspace provides a larger buffer than necessary, then zero out the
> > remaining buffer.
> >
> > This ensures UAPI compatibility with Panthor.
> >
> > Signed-off-by: Deborah Brouwer <deborah.brouwer@xxxxxxxxxxxxx>
> > ---
> > drivers/gpu/drm/tyr/file.rs | 47 +++++++++++++++++++++++++++++++++++++--------
> > 1 file changed, 39 insertions(+), 8 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/tyr/file.rs b/drivers/gpu/drm/tyr/file.rs
> > index 9f60a90d4948..a153aa453ed1 100644
> > --- a/drivers/gpu/drm/tyr/file.rs
> > +++ b/drivers/gpu/drm/tyr/file.rs
> > @@ -1,11 +1,18 @@
> > // SPDX-License-Identifier: GPL-2.0 or MIT
> >
> > +use core::mem::{
> > + offset_of,
> > + size_of_val, //
> > +};
>
> size_of_val is present in kernel::prelude::* and does not need explicit
> import.
Ack, will fix in next version.
>
> > + transmute::AsBytes,
>
> Usie the trait from zerocopy instead.
If this other series making zerocopy available to Tyr gets merged,
then I could rebase this series on it and switch over to IntoBytes:
https://lore.kernel.org/rust-for-linux/20261019-b4-gpu_info_intobytes-v4-0-0bc04df46549@xxxxxxxxxxxxx/T/#m9a9a24e0cf1ae10451e3fc84955873b405d0da0b
>
> > + let mut writer = UserSlice::new(UserPtr::from_addr(usr_dst as usize), size).writer();
>
> On 32-bit this will truncate upper bits. I guess that probably matches
> what Panthor does. Is it what we want?
Yes, that's what Panthor does; it uses the "u64_to_user_ptr()" macro to do
this deliberately.
Since UserPtr only accepts a usize argument, I have to cast in Tyr,
but instead, what do you think if I added another method to UserPtr
to accept a u64 address and cast it to usize just like in the C macro.
Something like:
/// Create a `UserPtr` from a u64 userspace address.
///
/// Deliberately truncate upper bits for 32-bit systems.
#[doc(alias = "u64_to_user_ptr")]
#[inline]
pub fn from_u64(addr: u64) -> Self {
Self::from_addr(addr as usize)
}
>
> Alice