On Thu Mar 20, 2025 at 11:27 PM CET, Danilo Krummrich wrote: > @@ -466,6 +466,23 @@ fn as_ref(&self) -> &device::Device { > } > } > > +impl TryFrom<&device::Device> for &Device { > + type Error = kernel::error::Error; > + > + fn try_from(dev: &device::Device) -> Result<Self, Self::Error> { > + if dev.bus_type_raw() != addr_of!(bindings::pci_bus_type) { > + return Err(EINVAL); > + } > + > + // SAFETY: We've just verified that the bus type of `dev` equals `bindings::pci_bus_type`, > + // hence `dev` must be embedded in a valid `struct pci_dev`. I think it'd be a good idea to mention that this is something guaranteed by the C side. Something like "... must be embedded in a valid `struct pci_dev` by the C side." or similar. With that: Reviewed-by: Benno Lossin <benno.lossin@xxxxxxxxx> --- Cheers, Benno > + let pdev = unsafe { container_of!(dev.as_raw(), bindings::pci_dev, dev) }; > + > + // SAFETY: `pdev` is a valid pointer to a `struct pci_dev`. > + Ok(unsafe { &*pdev.cast() }) > + } > +} > + > // SAFETY: A `Device` is always reference-counted and can be released from any thread. > unsafe impl Send for Device {} >