On Mon, Apr 14, 2025 at 10:49:49AM +0000, Benno Lossin wrote: > On Sun Apr 13, 2025 at 7:37 PM CEST, Danilo Krummrich wrote: > > The Bound device context indicates that a device is bound to a driver. > > It must be used for APIs that require the device to be bound, such as > > Devres or dma::CoherentAllocation. > > > > Implement Bound and add the corresponding Deref hierarchy, as well as the > > corresponding ARef conversion for this device context. > > > > Signed-off-by: Danilo Krummrich <dakr@xxxxxxxxxx> > > --- > > rust/kernel/device.rs | 16 +++++++++++++++- > > 1 file changed, 15 insertions(+), 1 deletion(-) > > > > diff --git a/rust/kernel/device.rs b/rust/kernel/device.rs > > index 487211842f77..585a3fcfeea3 100644 > > --- a/rust/kernel/device.rs > > +++ b/rust/kernel/device.rs > > @@ -232,13 +232,19 @@ pub trait DeviceContext: private::Sealed {} > > /// any of the bus callbacks, such as `probe()`. > > pub struct Core; > > > > +/// The [`Bound`] context is the context of a bus specific device reference when it is guranteed to > > +/// be bound for the duration of its lifetime. > > +pub struct Bound; > > One question about this: is it possible for me to > 1. have access to a `ARef<Device<Bound>>` (or `Core`) via some callback, > 2. store a clone of the `ARef` in some datastructure, > 3. wait for the device to become unbound, > 4. use a `Bound`-only context function and blow something up? You can never get an ARef<Device> that has a different device context than Normal. A device must only ever implement AlwaysRefCounted for Device (i.e. Device<Normal>). This is why patch 2 ("rust: device: implement impl_device_context_into_aref!") implements conversions from Device<Ctx> to ARef<Device>.