Re: [PATCH v17 4/6] rust: faux: Allow retrieving a bound Device
From: lyude
Date: Thu Jun 04 2026 - 14:55:29 EST
I mentioned this already to Danilo via alternate channels, but to
clarify - this patch -is- actually needed, as we make use of
`AsRef<Device<Bound>>` in the kunit test for SGTable
On Thu, 2026-06-04 at 15:25 +0200, Danilo Krummrich wrote:
> On Wed Jun 3, 2026 at 9:42 PM CEST, Lyude Paul wrote:
> > When writing up some rust code that used faux devices for unit
> > testing, I
> > noticed that we never actually added the Bound device context to
> > faux::Registration's AsRef<device::Device> implementation. This
> > being said:
> > the Registration object itself is proof that a driver is bound to
> > the
> > device - so this should be safe.
>
> Yes, it should be, but the reasons are non-trivial and should be part
> of the
> safety comment below.
>
> - faux_match() always returns 1, and probe runs synchronously
> (PROBE_FORCE_SYNCHRONOUS)
>
> - suppress_bind_attrs = true on faux_driver prevents userspace-
> triggered
> unbind via sysfs
>
> - mem::forget(Registration) is not a problem; if the Registration
> is leaked,
> the faux device stays bound forever
>
> > Signed-off-by: Lyude Paul <lyude@xxxxxxxxxx>
>
> I can pick this through the driver-core tree already, as it seems
> this it not
> needed by this series. Feel free to resend as individual patch for
> thus purpose.
>
> > ---
> > rust/kernel/faux.rs | 7 ++++---
> > 1 file changed, 4 insertions(+), 3 deletions(-)
> >
> > diff --git a/rust/kernel/faux.rs b/rust/kernel/faux.rs
> > index 43b4974f48cd2..e0856b2964a2c 100644
> > --- a/rust/kernel/faux.rs
> > +++ b/rust/kernel/faux.rs
> > @@ -25,7 +25,8 @@
> > ///
> > /// # Invariants
> > ///
> > -/// `self.0` always holds a valid pointer to an initialized and
> > registered [`struct faux_device`].
> > +/// - `self.0` always holds a valid pointer to an initialized and
> > registered [`struct faux_device`].
> > +/// - This object is proof that the object described by this
> > `Registration` is bound to a device.
> > ///
> > /// [`struct faux_device`]: srctree/include/linux/device/faux.h
> > pub struct Registration(NonNull<bindings::faux_device>);
> > @@ -59,8 +60,8 @@ fn as_raw(&self) -> *mut bindings::faux_device {
> > }
> > }
> >
> > -impl AsRef<device::Device> for Registration {
> > - fn as_ref(&self) -> &device::Device {
> > +impl AsRef<device::Device<device::Bound>> for Registration {
> > + fn as_ref(&self) -> &device::Device<device::Bound> {
> > // SAFETY: The underlying `device` in `faux_device` is
> > guaranteed by the C API to be
> > // a valid initialized `device`.
> > unsafe {
> > device::Device::from_raw(addr_of_mut!((*self.as_raw()).dev)) }
> > --
> > 2.54.0