Message ID | 20211206210437.821900680@linutronix.de (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Bjorn Helgaas |
Headers | show |
Series | genirq/msi, PCI/MSI: Spring cleaning - Part 2 | expand |
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@linutronix.de> > Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> Acked-by: Bjorn Helgaas <bhelgaas@google.com> > --- > 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; >
--- 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;