[+to Thomas]

On Wed, Apr 16, 2025 at 08:36:06AM -0700, Shradha Gupta wrote:
> For supporting dynamic MSI vector allocation by pci controllers, enabling
> the flag MSI_FLAG_PCI_MSIX_ALLOC_DYN is not enough, msix_prepare_msi_desc()
> to prepare the desc is needed. Export pci_msix_prepare_desc() to allow pci
> controllers like pci-hyperv to support dynamic MSI vector allocation.
> Also, add the flag MSI_FLAG_PCI_MSIX_ALLOC_DYN and use
> pci_msix_prepare_desc() in pci_hyperv controller

Follow capitalization convention for subject line.  Probably remove
"pci_hyperv" since it already contains "PCI: hv" and add something
about MSI-X.

s/pci/PCI/

s/MSI vector/MSI-X vector/ since the context says you're concerned
with MSI-X.

This requires an ack from Thomas; moved him to "To:" line.

> Signed-off-by: Shradha Gupta <shradhagu...@linux.microsoft.com>
> Reviewed-by: Haiyang Zhang <haiya...@microsoft.com>
> Reviewed-by: Long Li <lon...@microsoft.com>
> ---
>  drivers/pci/controller/pci-hyperv.c | 7 +++++--
>  drivers/pci/msi/irqdomain.c         | 5 +++--
>  include/linux/msi.h                 | 2 ++
>  3 files changed, 10 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/pci/controller/pci-hyperv.c 
> b/drivers/pci/controller/pci-hyperv.c
> index ac27bda5ba26..f2fa6bdb6bb8 100644
> --- a/drivers/pci/controller/pci-hyperv.c
> +++ b/drivers/pci/controller/pci-hyperv.c
> @@ -598,7 +598,8 @@ static unsigned int hv_msi_get_int_vector(struct irq_data 
> *data)
>       return cfg->vector;
>  }
>  
> -#define hv_msi_prepare               pci_msi_prepare
> +#define hv_msi_prepare                       pci_msi_prepare
> +#define hv_msix_prepare_desc         pci_msix_prepare_desc
>  
>  /**
>   * hv_arch_irq_unmask() - "Unmask" the IRQ by setting its current
> @@ -727,6 +728,7 @@ static void hv_arch_irq_unmask(struct irq_data *data)
>  #define FLOW_HANDLER         NULL
>  #define FLOW_NAME            NULL
>  #define hv_msi_prepare               NULL
> +#define hv_msix_prepare_desc NULL
>  
>  struct hv_pci_chip_data {
>       DECLARE_BITMAP(spi_map, HV_PCI_MSI_SPI_NR);
> @@ -2063,6 +2065,7 @@ static struct irq_chip hv_msi_irq_chip = {
>  static struct msi_domain_ops hv_msi_ops = {
>       .msi_prepare    = hv_msi_prepare,
>       .msi_free       = hv_msi_free,
> +     .prepare_desc   = hv_msix_prepare_desc,
>  };
>  
>  /**
> @@ -2084,7 +2087,7 @@ static int hv_pcie_init_irq_domain(struct 
> hv_pcibus_device *hbus)
>       hbus->msi_info.ops = &hv_msi_ops;
>       hbus->msi_info.flags = (MSI_FLAG_USE_DEF_DOM_OPS |
>               MSI_FLAG_USE_DEF_CHIP_OPS | MSI_FLAG_MULTI_PCI_MSI |
> -             MSI_FLAG_PCI_MSIX);
> +             MSI_FLAG_PCI_MSIX | MSI_FLAG_PCI_MSIX_ALLOC_DYN);
>       hbus->msi_info.handler = FLOW_HANDLER;
>       hbus->msi_info.handler_name = FLOW_NAME;
>       hbus->msi_info.data = hbus;
> diff --git a/drivers/pci/msi/irqdomain.c b/drivers/pci/msi/irqdomain.c
> index d7ba8795d60f..43129aa6d6c7 100644
> --- a/drivers/pci/msi/irqdomain.c
> +++ b/drivers/pci/msi/irqdomain.c
> @@ -222,13 +222,14 @@ static void pci_irq_unmask_msix(struct irq_data *data)
>       pci_msix_unmask(irq_data_get_msi_desc(data));
>  }
>  
> -static void pci_msix_prepare_desc(struct irq_domain *domain, 
> msi_alloc_info_t *arg,
> -                               struct msi_desc *desc)
> +void pci_msix_prepare_desc(struct irq_domain *domain, msi_alloc_info_t *arg,
> +                        struct msi_desc *desc)
>  {
>       /* Don't fiddle with preallocated MSI descriptors */
>       if (!desc->pci.mask_base)
>               msix_prepare_msi_desc(to_pci_dev(desc->dev), desc);
>  }
> +EXPORT_SYMBOL_GPL(pci_msix_prepare_desc);
>  
>  static const struct msi_domain_template pci_msix_template = {
>       .chip = {
> diff --git a/include/linux/msi.h b/include/linux/msi.h
> index 86e42742fd0f..d5864d5e75c2 100644
> --- a/include/linux/msi.h
> +++ b/include/linux/msi.h
> @@ -691,6 +691,8 @@ struct irq_domain *pci_msi_create_irq_domain(struct 
> fwnode_handle *fwnode,
>                                            struct irq_domain *parent);
>  u32 pci_msi_domain_get_msi_rid(struct irq_domain *domain, struct pci_dev 
> *pdev);
>  struct irq_domain *pci_msi_get_device_domain(struct pci_dev *pdev);
> +void pci_msix_prepare_desc(struct irq_domain *domain, msi_alloc_info_t *arg,
> +                        struct msi_desc *desc);
>  #else /* CONFIG_PCI_MSI */
>  static inline struct irq_domain *pci_msi_get_device_domain(struct pci_dev 
> *pdev)
>  {
> -- 
> 2.34.1
> 

Reply via email to