mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 09:36:22 +02:00
samples: rust: rust_driver_auxiliary: showcase lifetime-bound registration data
Make the Data struct lifetime-parameterized, storing a reference to the parent pci::Device<Bound>. This demonstrates that registration data can hold device resources tied to the parent driver's lifetime. In connect(), retrieve the parent PCI device from the registration data rather than casting through adev.parent(). Reviewed-by: Eliot Courtney <ecourtney@nvidia.com> Reviewed-by: Gary Guo <gary@garyguo.net> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Reviewed-by: Alexandre Courbot <acourbot@nvidia.com> Link: https://patch.msgid.link/20260525202921.124698-25-dakr@kernel.org Signed-off-by: Danilo Krummrich <dakr@kernel.org>
This commit is contained in:
parent
4555291dda
commit
d18f364618
|
|
@ -51,16 +51,17 @@ fn probe<'bound>(
|
|||
}
|
||||
}
|
||||
|
||||
struct Data {
|
||||
struct Data<'bound> {
|
||||
index: u32,
|
||||
parent: &'bound pci::Device<Bound>,
|
||||
}
|
||||
|
||||
struct ParentDriver;
|
||||
|
||||
#[allow(clippy::type_complexity)]
|
||||
struct ParentData<'bound> {
|
||||
_reg0: auxiliary::Registration<'bound, ForLt!(Data)>,
|
||||
_reg1: auxiliary::Registration<'bound, ForLt!(Data)>,
|
||||
_reg0: auxiliary::Registration<'bound, ForLt!(Data<'_>)>,
|
||||
_reg1: auxiliary::Registration<'bound, ForLt!(Data<'_>)>,
|
||||
}
|
||||
|
||||
kernel::pci_device_table!(
|
||||
|
|
@ -81,33 +82,44 @@ fn probe<'bound>(
|
|||
_info: &'bound Self::IdInfo,
|
||||
) -> impl PinInit<Self::Data<'bound>, Error> + 'bound {
|
||||
Ok(ParentData {
|
||||
_reg0: auxiliary::Registration::new(
|
||||
pdev.as_ref(),
|
||||
AUXILIARY_NAME,
|
||||
0,
|
||||
MODULE_NAME,
|
||||
Data { index: 0 },
|
||||
)?,
|
||||
_reg1: auxiliary::Registration::new(
|
||||
pdev.as_ref(),
|
||||
AUXILIARY_NAME,
|
||||
1,
|
||||
MODULE_NAME,
|
||||
Data { index: 1 },
|
||||
)?,
|
||||
// SAFETY: `ParentData` is the driver's private data, which is dropped when the
|
||||
// device is unbound; i.e. `mem::forget()` is never called on it.
|
||||
_reg0: unsafe {
|
||||
auxiliary::Registration::new_with_lt(
|
||||
pdev.as_ref(),
|
||||
AUXILIARY_NAME,
|
||||
0,
|
||||
MODULE_NAME,
|
||||
Data {
|
||||
index: 0,
|
||||
parent: pdev,
|
||||
},
|
||||
)?
|
||||
},
|
||||
// SAFETY: See `_reg0` above.
|
||||
_reg1: unsafe {
|
||||
auxiliary::Registration::new_with_lt(
|
||||
pdev.as_ref(),
|
||||
AUXILIARY_NAME,
|
||||
1,
|
||||
MODULE_NAME,
|
||||
Data {
|
||||
index: 1,
|
||||
parent: pdev,
|
||||
},
|
||||
)?
|
||||
},
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl ParentDriver {
|
||||
fn connect(adev: &auxiliary::Device<Bound>) -> Result {
|
||||
let dev = adev.parent();
|
||||
let pdev: &pci::Device<Bound> = dev.try_into()?;
|
||||
|
||||
let data = adev.registration_data::<ForLt!(Data)>()?;
|
||||
let data = adev.registration_data::<ForLt!(Data<'_>)>()?;
|
||||
let pdev = data.parent;
|
||||
|
||||
dev_info!(
|
||||
dev,
|
||||
pdev,
|
||||
"Connect auxiliary {} with parent: VendorID={}, DeviceID={:#x}\n",
|
||||
adev.id(),
|
||||
pdev.vendor_id(),
|
||||
|
|
@ -115,7 +127,7 @@ fn connect(adev: &auxiliary::Device<Bound>) -> Result {
|
|||
);
|
||||
|
||||
dev_info!(
|
||||
dev,
|
||||
pdev,
|
||||
"Connected to auxiliary device with index {}.\n",
|
||||
data.index
|
||||
);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user