On Mon, Dec 06, 2021 at 11:39:00PM +0100, Thomas Gleixner wrote: > Allocate MSI device data on first use, i.e. when a PCI driver invokes one > of the PCI/MSI enablement functions. > > Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx> > Reviewed-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> > Reviewed-by: Jason Gunthorpe <jgg@xxxxxxxxxx> Acked-by: Bjorn Helgaas <bhelgaas@xxxxxxxxxx> > --- > drivers/pci/msi/msi.c | 20 +++++++++++++++----- > 1 file changed, 15 insertions(+), 5 deletions(-) > > --- a/drivers/pci/msi/msi.c > +++ b/drivers/pci/msi/msi.c > @@ -889,10 +889,12 @@ static int __pci_enable_msi_range(struct > /* deprecated, don't use */ > int pci_enable_msi(struct pci_dev *dev) > { > - int rc = __pci_enable_msi_range(dev, 1, 1, NULL); > - if (rc < 0) > - return rc; > - return 0; > + int rc = msi_setup_device_data(&dev->dev); > + > + if (!rc) > + rc = __pci_enable_msi_range(dev, 1, 1, NULL); > + > + return rc < 0 ? rc : 0; > } > EXPORT_SYMBOL(pci_enable_msi); > > @@ -947,7 +949,11 @@ static int __pci_enable_msix_range(struc > int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, > int minvec, int maxvec) > { > - return __pci_enable_msix_range(dev, entries, minvec, maxvec, NULL, 0); > + int ret = msi_setup_device_data(&dev->dev); > + > + if (!ret) > + ret = __pci_enable_msix_range(dev, entries, minvec, maxvec, NULL, 0); > + return ret; > } > EXPORT_SYMBOL(pci_enable_msix_range); > > @@ -974,8 +980,12 @@ int pci_alloc_irq_vectors_affinity(struc > struct irq_affinity *affd) > { > struct irq_affinity msi_default_affd = {0}; > + int ret = msi_setup_device_data(&dev->dev); > int nvecs = -ENOSPC; > > + if (ret) > + return ret; > + > if (flags & PCI_IRQ_AFFINITY) { > if (!affd) > affd = &msi_default_affd; >