On Fri, Nov 11, 2022 at 02:55:12PM +0100, Thomas Gleixner wrote:
> With interrupt domains the sanity check for MSI-X vector validation can be
> done _before_ any allocation happens. The sanity check only applies to the
> allocation functions which have an 'entries' array argument. The entries
> array is filled by the caller with the requested MSI-X indicies. Some drivers
> have gaps in the index space which is not supported on all architectures.
> 
> The PCI/MSI irqdomain has a 'feature' bit to enforce this validation late
> during the allocation phase.
> 
> Just do it right away before doing any other work along with the other
> sanity checks on that array.
> 
> Signed-off-by: Thomas Gleixner <t...@linutronix.de>

Acked-by: Bjorn Helgaas <bhelg...@google.com>

s/indicies/indices/ (commit log)
s/irqdomain/irq domain/?  IIRC previous logs used "irq domain"
s/MSIX/MSI-X/ (subject line)

> ---
>  drivers/pci/msi/msi.c |   11 +++++++++--
>  1 file changed, 9 insertions(+), 2 deletions(-)
> 
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -725,13 +725,17 @@ static int msix_capability_init(struct p
>       return ret;
>  }
>  
> -static bool pci_msix_validate_entries(struct msix_entry *entries, int nvec, 
> int hwsize)
> +static bool pci_msix_validate_entries(struct pci_dev *dev, struct msix_entry 
> *entries,
> +                                   int nvec, int hwsize)
>  {
> +     bool nogap;
>       int i, j;
>  
>       if (!entries)
>               return true;
>  
> +     nogap = pci_msi_domain_supports(dev, MSI_FLAG_MSIX_CONTIGUOUS, 
> DENY_LEGACY);
> +
>       for (i = 0; i < nvec; i++) {
>               /* Entry within hardware limit? */
>               if (entries[i].entry >= hwsize)
> @@ -742,6 +746,9 @@ static bool pci_msix_validate_entries(st
>                       if (entries[i].entry == entries[j].entry)
>                               return false;
>               }
> +             /* Check for unsupported gaps */
> +             if (nogap && entries[i].entry != i)
> +                     return false;
>       }
>       return true;
>  }
> @@ -773,7 +780,7 @@ int __pci_enable_msix_range(struct pci_d
>       if (hwsize < 0)
>               return hwsize;
>  
> -     if (!pci_msix_validate_entries(entries, nvec, hwsize))
> +     if (!pci_msix_validate_entries(dev, entries, nvec, hwsize))
>               return -EINVAL;
>  
>       /* PCI_IRQ_VIRTUAL is a horrible hack! */
> 

Reply via email to