[PATCH v2 3/5] rust: pci: remove request_irq() and request_threaded_irq() from Device
Danilo Krummrich <[email protected]>
| Newsgroups | org.kernel.vger.rust-for-linux,dev.linux.lists.driver-core,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pci |
|---|---|
| Message-ID | <[email protected]> |
Remove the thin wrappers on Device<Bound> that only forwarded to irq::Registration::new() and irq::ThreadedRegistration::new(). With IrqVector embedding a resolved IrqRequest, the conversion is infallible and drivers call irq::Registration::new(vector.into(), ...) directly. Unlike the platform equivalents, which combine a fallible IRQ lookup with handler registration, the PCI wrappers add no value beyond namespacing. They also introduce a redundant device reference. IrqVector already carries a device borrow through its embedded IrqRequest, yet the wrappers required a second, potentially unrelated, &self receiver. Signed-off-by: Danilo Krummrich <[email protected]> --- rust/kernel/pci/irq.rs | 50 ++++++------------------------------------ 1 file changed, 7 insertions(+), 43 deletions(-) diff --git a/rust/kernel/pci/irq.rs b/rust/kernel/pci/irq.rs index 305701440114..b3dce5b49d57 100644 --- a/rust/kernel/pci/irq.rs +++ b/rust/kernel/pci/irq.rs @@ -8,10 +8,7 @@ device, device::Bound, error::to_result, - irq::{ - self, - IrqRequest, // - }, + irq::IrqRequest, prelude::*, // }; use core::num::NonZero; @@ -70,9 +67,10 @@ const fn as_raw(self) -> u32 { /// A resolved IRQ vector from a PCI interrupt vector allocation. /// -/// Created by [`IrqVectorRegistration::vector`] and consumed by [`Device::request_irq`] or -/// [`Device::request_threaded_irq`]. Borrows the [`IrqVectorRegistration`] it was derived from, -/// so the allocation stays live until the handler is freed. +/// Created by [`IrqVectorRegistration::vector`]. Convert to [`IrqRequest`] via [`From`] to register +/// a handler with [`irq::Registration::new`](crate::irq::Registration::new). Borrows the +/// [`IrqVectorRegistration`] it was derived from, so the allocation stays live until the handler is +/// freed. pub struct IrqVector<'a> { request: IrqRequest<'a>, reg: &'a IrqVectorRegistration<'a>, @@ -169,40 +167,6 @@ fn drop(&mut self) { } impl Device<device::Bound> { - /// Returns a [`kernel::irq::Registration`] for the given IRQ vector. - /// - /// # Safety - /// - /// Callers must not `mem::forget()` the resulting [`irq::Registration`] or otherwise prevent - /// its [`Drop`] implementation from running. - pub unsafe fn request_irq<'a, T: crate::irq::Handler + 'a>( - &'a self, - vector: IrqVector<'a>, - flags: irq::Flags, - name: &'static CStr, - handler: impl PinInit<T, Error> + 'a, - ) -> impl PinInit<irq::Registration<'a, T>, Error> + 'a { - // SAFETY: Caller guarantees the Registration will not be leaked. - unsafe { irq::Registration::<T>::new(vector.into(), flags, name, handler) } - } - - /// Returns a [`kernel::irq::ThreadedRegistration`] for the given IRQ vector. - /// - /// # Safety - /// - /// Callers must not `mem::forget()` the resulting [`irq::ThreadedRegistration`] or otherwise - /// prevent its [`Drop`] implementation from running. - pub unsafe fn request_threaded_irq<'a, T: crate::irq::ThreadedHandler + 'a>( - &'a self, - vector: IrqVector<'a>, - flags: irq::Flags, - name: &'static CStr, - handler: impl PinInit<T, Error> + 'a, - ) -> impl PinInit<irq::ThreadedRegistration<'a, T>, Error> + 'a { - // SAFETY: Caller guarantees the Registration will not be leaked. - unsafe { irq::ThreadedRegistration::<T>::new(vector.into(), flags, name, handler) } - } - /// Allocate IRQ vectors for this PCI device. /// /// Allocates between `min_vecs` and `max_vecs` interrupt vectors for the device. @@ -211,8 +175,8 @@ pub unsafe fn request_threaded_irq<'a, T: crate::irq::ThreadedHandler + 'a>( /// will try them in order of preference: MSI-X first, then MSI, then INTx interrupts. /// /// The allocated vectors are freed when the returned [`IrqVectorRegistration`] is dropped. - /// IRQ handlers registered via [`Self::request_irq`] or [`Self::request_threaded_irq`] - /// borrow from the registration, so the compiler ensures they are freed first. + /// Use [`IrqVectorRegistration::vector`] to obtain an [`IrqVector`] for a given vector + /// index. /// /// # Arguments /// -- 2.55.0