> On 25 May 2026, at 17:21, Danilo Krummrich <[email protected]> wrote:
> 
> Add a 'bound lifetime to the associated Data, changing type Data to type
> Data<'bound>.
> 
> This allows the driver's bus device private data to capture the device /
> driver bound lifetime; device resources can be stored directly by
> reference rather than requiring Devres.
> 
> The probe() and disconnect() callbacks thus gain a 'bound lifetime
> parameter on the methods themselves; avoiding a global lifetime on the
> trait impl.
> 
> Existing drivers set type Data<'bound> = Self, preserving the current
> behavior.
> 
> Reviewed-by: Alexandre Courbot <[email protected]>
> Reviewed-by: Greg Kroah-Hartman <[email protected]>
> Reviewed-by: Eliot Courtney <[email protected]>
> Signed-off-by: Danilo Krummrich <[email protected]>
> ---
> rust/kernel/usb.rs              | 37 ++++++++++++++++++++-------------
> samples/rust/rust_driver_usb.rs | 12 +++++------
> 2 files changed, 28 insertions(+), 21 deletions(-)
> 
> diff --git a/rust/kernel/usb.rs b/rust/kernel/usb.rs
> index 1dbb8387b463..7aff0c82d0af 100644
> --- a/rust/kernel/usb.rs
> +++ b/rust/kernel/usb.rs
> @@ -41,7 +41,7 @@
> // - `DEVICE_DRIVER_OFFSET` is the correct byte offset to the embedded 
> `struct device_driver`.
> unsafe impl<T: Driver> driver::DriverLayout for Adapter<T> {
>     type DriverType = bindings::usb_driver;
> -    type DriverData<'bound> = T::Data;
> +    type DriverData<'bound> = T::Data<'bound>;
>     const DEVICE_DRIVER_OFFSET: usize = 
> core::mem::offset_of!(Self::DriverType, driver);
> }
> 
> @@ -109,8 +109,8 @@ extern "C" fn disconnect_callback(intf: *mut 
> bindings::usb_interface) {
> 
>         // SAFETY: `disconnect_callback` is only ever called after a 
> successful call to
>         // `probe_callback`, hence it's guaranteed that 
> `Device::set_drvdata()` has been called
> -        // and stored a `Pin<KBox<T::Data>>`.
> -        let data = unsafe { dev.drvdata_borrow::<T::Data>() };
> +        // and stored a `Pin<KBox<T::Data<'_>>>`.
> +        let data = unsafe { dev.drvdata_borrow::<T::Data<'_>>() };
> 
>         T::disconnect(intf, data);
>     }
> @@ -287,18 +287,22 @@ macro_rules! usb_device_table {
> ///
> /// impl usb::Driver for MyDriver {
> ///     type IdInfo = ();
> -///     type Data = Self;
> +///     type Data<'bound> = Self;
> ///     const ID_TABLE: usb::IdTable<Self::IdInfo> = &USB_TABLE;
> ///
> -///     fn probe(
> -///         _interface: &usb::Interface<Core<'_>>,
> +///     fn probe<'bound>(
> +///         _interface: &'bound usb::Interface<Core<'_>>,
> ///         _id: &usb::DeviceId,
> -///         _info: &Self::IdInfo,
> -///     ) -> impl PinInit<Self::Data, Error> {
> +///         _info: &'bound Self::IdInfo,
> +///     ) -> impl PinInit<Self::Data<'bound>, Error> + 'bound {
> ///         Err(ENODEV)
> ///     }
> ///
> -///     fn disconnect(_interface: &usb::Interface<Core<'_>>, _data: 
> Pin<&Self::Data>) {}
> +///     fn disconnect<'bound>(
> +///         _interface: &'bound usb::Interface<Core<'_>>,
> +///         _data: Pin<&Self::Data<'bound>>,
> +///     ) {
> +///     }
> /// }
> ///```
> pub trait Driver {
> @@ -306,7 +310,7 @@ pub trait Driver {
>     type IdInfo: 'static;
> 
>     /// The type of the driver's bus device private data.
> -    type Data: Send;
> +    type Data<'bound>: Send + 'bound;
> 
>     /// The table of device ids supported by the driver.
>     const ID_TABLE: IdTable<Self::IdInfo>;
> @@ -315,16 +319,19 @@ pub trait Driver {
>     ///
>     /// Called when a new USB interface is bound to this driver.
>     /// Implementers should attempt to initialize the interface here.
> -    fn probe(
> -        interface: &Interface<device::Core<'_>>,
> +    fn probe<'bound>(
> +        interface: &'bound Interface<device::Core<'_>>,
>         id: &DeviceId,
> -        id_info: &Self::IdInfo,
> -    ) -> impl PinInit<Self::Data, Error>;
> +        id_info: &'bound Self::IdInfo,
> +    ) -> impl PinInit<Self::Data<'bound>, Error> + 'bound;
> 
>     /// USB driver disconnect.
>     ///
>     /// Called when the USB interface is about to be unbound from this driver.
> -    fn disconnect(interface: &Interface<device::Core<'_>>, data: 
> Pin<&Self::Data>);
> +    fn disconnect<'bound>(
> +        interface: &'bound Interface<device::Core<'_>>,
> +        data: Pin<&Self::Data<'bound>>,
> +    );
> }
> 
> /// A USB interface.
> diff --git a/samples/rust/rust_driver_usb.rs b/samples/rust/rust_driver_usb.rs
> index e900993335e9..02bd5085f9bc 100644
> --- a/samples/rust/rust_driver_usb.rs
> +++ b/samples/rust/rust_driver_usb.rs
> @@ -26,21 +26,21 @@ struct SampleDriver {
> 
> impl usb::Driver for SampleDriver {
>     type IdInfo = ();
> -    type Data = Self;
> +    type Data<'bound> = Self;
>     const ID_TABLE: usb::IdTable<Self::IdInfo> = &USB_TABLE;
> 
> -    fn probe(
> -        intf: &usb::Interface<Core<'_>>,
> +    fn probe<'bound>(
> +        intf: &'bound usb::Interface<Core<'_>>,
>         _id: &usb::DeviceId,
> -        _info: &Self::IdInfo,
> -    ) -> impl PinInit<Self, Error> {
> +        _info: &'bound Self::IdInfo,
> +    ) -> impl PinInit<Self, Error> + 'bound {
>         let dev: &device::Device<Core<'_>> = intf.as_ref();
>         dev_info!(dev, "Rust USB driver sample probed\n");
> 
>         Ok(Self { _intf: intf.into() })
>     }
> 
> -    fn disconnect(intf: &usb::Interface<Core<'_>>, _data: Pin<&Self>) {
> +    fn disconnect<'bound>(intf: &'bound usb::Interface<Core<'_>>, _data: 
> Pin<&Self>) {
>         let dev: &device::Device<Core<'_>> = intf.as_ref();
>         dev_info!(dev, "Rust USB driver sample disconnected\n");
>     }
> -- 
> 2.54.0
> 
> 

Reviewed-by: Daniel Almeida <[email protected]>

Reply via email to