Re: [PATCH v2 5/5] rust: pci: expose the allocated interrupt type

"Gary Guo" <[email protected]>
Newsgroups dev.linux.lists.driver-core,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pci,org.kernel.vger.rust-for-linux
Message-ID <[email protected]>
On Wed Aug 12, 2026 at 12:39 AM BST, Danilo Krummrich wrote:
> Add irq_type() on IrqVectorRegistration and IrqVector, wrapping the new
> pci_irq_type() C function. A driver whose interrupt acknowledgment
> depends on the type (MSI-X vs MSI vs INTx) queries it here rather than
> assuming which type the PCI core selected.
>
> Suggested-by: John Hubbard <[email protected]>
> Link: https://lore.kernel.org/all/[email protected]/
> Signed-off-by: Danilo Krummrich <[email protected]>
> ---
>  rust/helpers/pci.c     |  5 +++++
>  rust/kernel/pci/irq.rs | 22 ++++++++++++++++++++++
>  2 files changed, 27 insertions(+)
>
> diff --git a/rust/helpers/pci.c b/rust/helpers/pci.c
> index e44905317d75..23b06becb448 100644
> --- a/rust/helpers/pci.c
> +++ b/rust/helpers/pci.c
> @@ -24,6 +24,11 @@ __rust_helper bool rust_helper_dev_is_pci(const struct device *dev)
>  	return dev_is_pci(dev);
>  }
>  
> +__rust_helper unsigned int rust_helper_pci_irq_type(struct pci_dev *pdev)
> +{
> +	return pci_irq_type(pdev);
> +}
> +
>  #ifndef CONFIG_PCI_MSI
>  __rust_helper int rust_helper_pci_alloc_irq_vectors(struct pci_dev *dev,
>  						    unsigned int min_vecs,
> diff --git a/rust/kernel/pci/irq.rs b/rust/kernel/pci/irq.rs
> index b3dce5b49d57..41059b922492 100644
> --- a/rust/kernel/pci/irq.rs
> +++ b/rust/kernel/pci/irq.rs
> @@ -33,6 +33,16 @@ const fn as_raw(self) -> u32 {
>              IrqType::MsiX => bindings::PCI_IRQ_MSIX,
>          }
>      }
> +
> +    /// Construct from raw value.
> +    #[inline]
> +    const fn from_raw(raw: u32) -> Self {
> +        match raw {
> +            bindings::PCI_IRQ_MSIX => IrqType::MsiX,
> +            bindings::PCI_IRQ_MSI => IrqType::Msi,
> +            _ => IrqType::Intx,
> +        }
> +    }
>  }
>  
>  /// Set of IRQ types that can be used for PCI interrupt allocation.
> @@ -106,6 +116,11 @@ pub fn index(&self) -> usize {
>      pub fn vectors(&self) -> &'a IrqVectorRegistration<'a> {
>          self.reg
>      }
> +
> +    /// Returns the interrupt type the PCI core selected for this vector's allocation.

#[inline]

> +    pub fn irq_type(&self) -> IrqType {
> +        self.reg.irq_type()

Do you expect people to call this on the `IrqVetor` (or even
`IrqVectorRegistration`)? This is really a property of the device, and not on a
specific IRQ vector/allocation.

Asking this because I think we can avoid keeping reference to `reg` if we don't
need this and `vectors` (just keep `&'a Device<Bound>`; the mere signature of
`IrqVectorRegistration::vector` will ensure the correct lifetime)

Best,
Gary

> +    }
>  }
>  
>  impl<'a> From<IrqVector<'a>> for IrqRequest<'a> {
> @@ -137,6 +152,13 @@ pub fn vector_count(&self) -> usize {
>          self.count.get()
>      }
>  
> +    /// Returns the interrupt type the PCI core selected for this allocation.
> +    #[inline]
> +    pub fn irq_type(&self) -> IrqType {
> +        // SAFETY: `self.dev.as_raw()` is a valid pointer to a `struct pci_dev`.
> +        IrqType::from_raw(unsafe { bindings::pci_irq_type(self.dev.as_raw()) })
> +    }
> +
>      /// Returns the [`IrqVector`] at `index`.
>      ///
>      /// The returned [`IrqVector`] borrows from this registration, ensuring the vector allocation
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.