On Fri May 22, 2026 at 8:34 AM JST, Danilo Krummrich 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 unbind() 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]>
> Signed-off-by: Danilo Krummrich <[email protected]>
> ---
>  rust/kernel/usb.rs              | 39 +++++++++++++++++++--------------
>  samples/rust/rust_driver_usb.rs | 14 ++++++------
>  2 files changed, 30 insertions(+), 23 deletions(-)
>
> diff --git a/rust/kernel/usb.rs b/rust/kernel/usb.rs
> index 1dbb8387b463..616e22e34c6f 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);
>  }
>  
> @@ -110,7 +110,7 @@ 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>() };
> +        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<'_>>,
> -///         _id: &usb::DeviceId,
> -///         _info: &Self::IdInfo,
> -///     ) -> impl PinInit<Self::Data, Error> {
> +///     fn probe<'bound>(
> +///         _interface: &'bound usb::Interface<Core<'_>>,
> +///         _id: &'bound usb::DeviceId,
> +///         _info: &'bound Self::IdInfo,
> +///     ) -> impl PinInit<Self::Data<'bound>, Error> + 'bound {

Are we sure that usb::DeviceId can have its lifetime extended to more
than the callback lifetime?

Reviewed-by: Eliot Courtney <[email protected]>

if it's guaranteed safe to extend the lifetime, or if not, with removing
the 'bound lifetime.

Reply via email to