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 <[email protected]>
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