linux-pci.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2
@ 2021-12-10 22:18 Thomas Gleixner
  2021-12-10 22:18 ` [patch V3 01/35] PCI/MSI: Set pci_dev::msi[x]_enabled early Thomas Gleixner
                   ` (35 more replies)
  0 siblings, 36 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:18 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Greg Kroah-Hartman, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, linux-arm-kernel,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

This is the second part of [PCI]MSI refactoring which aims to provide the
ability of expanding MSI-X vectors after enabling MSI-X.

This is based on the first part of this work which can be found here:

    https://lore.kernel.org/r/20211206210147.872865823@linutronix.de

and has been applied to:

     git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/msi


This second part has the following important changes:

   1) Cleanup of the MSI related data in struct device

      struct device contains at the moment various MSI related parts. Some
      of them (the irq domain pointer) cannot be moved out, but the rest
      can be allocated on first use. This is in preparation of adding more
      per device MSI data later on.

   2) Consolidation of sysfs handling

      As a first step this moves the sysfs pointer from struct msi_desc
      into the new per device MSI data structure where it belongs.

      Later changes will cleanup this code further, but that's not possible
      at this point.

   3) Use PCI device properties instead of looking up MSI descriptors and
      analysing their data.

   4) Provide a function to retrieve the Linux interrupt number for a given
      MSI index similar to pci_irq_vector() and cleanup all open coded
      variants.

It's also available from git:

     git://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git msi-v3-part-2

Part 3 of this effort is available on top

     git://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git msi-v3-part-3

     Part 3 is not going to be reposted as there is no change vs. V2.

V2 of part 2 can be found here:

    https://lore.kernel.org/r/20211206210307.625116253@linutronix.de

Changes versus V2:

  - Use PCI device properties instead of creating a new set - Jason

  - Picked up Reviewed/Tested/Acked-by tags as appropriate

Thanks,

	tglx
---
 arch/powerpc/platforms/cell/axon_msi.c              |    5 
 arch/powerpc/platforms/pseries/msi.c                |   38 +---
 arch/x86/kernel/apic/msi.c                          |    5 
 arch/x86/pci/xen.c                                  |   11 -
 drivers/base/platform-msi.c                         |  152 ++++++++-----------
 drivers/bus/fsl-mc/dprc-driver.c                    |    8 -
 drivers/bus/fsl-mc/fsl-mc-allocator.c               |    9 -
 drivers/bus/fsl-mc/fsl-mc-msi.c                     |   26 +--
 drivers/dma/mv_xor_v2.c                             |   16 --
 drivers/dma/qcom/hidma.c                            |   44 ++---
 drivers/dma/ti/k3-udma-private.c                    |    6 
 drivers/dma/ti/k3-udma.c                            |   14 -
 drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c         |   23 --
 drivers/irqchip/irq-mbigen.c                        |    4 
 drivers/irqchip/irq-mvebu-icu.c                     |   12 -
 drivers/irqchip/irq-ti-sci-inta.c                   |    2 
 drivers/mailbox/bcm-flexrm-mailbox.c                |    9 -
 drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c    |    4 
 drivers/net/ethernet/freescale/dpaa2/dpaa2-ptp.c    |    4 
 drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c |    5 
 drivers/pci/msi/irqdomain.c                         |   20 ++
 drivers/pci/msi/legacy.c                            |    6 
 drivers/pci/msi/msi.c                               |  133 ++++++----------
 drivers/pci/xen-pcifront.c                          |    2 
 drivers/perf/arm_smmuv3_pmu.c                       |    5 
 drivers/soc/fsl/dpio/dpio-driver.c                  |    8 -
 drivers/soc/ti/k3-ringacc.c                         |    6 
 drivers/soc/ti/ti_sci_inta_msi.c                    |   22 --
 drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c              |    4 
 include/linux/device.h                              |   25 ++-
 include/linux/fsl/mc.h                              |    4 
 include/linux/msi.h                                 |   95 ++++--------
 include/linux/pci.h                                 |    1 
 include/linux/soc/ti/ti_sci_inta_msi.h              |    1 
 kernel/irq/msi.c                                    |  158 +++++++++++++++-----
 35 files changed, 429 insertions(+), 458 deletions(-)


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 01/35] PCI/MSI: Set pci_dev::msi[x]_enabled early
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
@ 2021-12-10 22:18 ` Thomas Gleixner
  2021-12-13 13:37   ` Jason Gunthorpe
  2021-12-10 22:18 ` [patch V3 02/35] x86/pci/XEN: Use PCI device property Thomas Gleixner
                   ` (34 subsequent siblings)
  35 siblings, 1 reply; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:18 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Greg Kroah-Hartman, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, linux-arm-kernel,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

There are quite some places which retrieve the first MSI descriptor to
evaluate whether the setup is for MSI or MSI-X. That's required because
pci_dev::msi[x]_enabled is only set when the setup completed successfully.

There is no real reason why msi[x]_enabled can't be set at the beginning of
the setup sequence and cleared in case of a failure.

Implement that so the MSI descriptor evaluations can be converted to simple
property queries.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
V3: New patch
---
 drivers/pci/msi/msi.c |   23 +++++++++++++++++------
 1 file changed, 17 insertions(+), 6 deletions(-)

--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -421,11 +421,18 @@ static int msi_capability_init(struct pc
 	struct msi_desc *entry;
 	int ret;
 
-	pci_msi_set_enable(dev, 0);	/* Disable MSI during set up */
+	/*
+	 * Disable MSI during setup in the hardware, but mark it enabled
+	 * so that setup code can evaluate it.
+	 */
+	pci_msi_set_enable(dev, 0);
+	dev->msi_enabled = 1;
 
 	entry = msi_setup_entry(dev, nvec, affd);
-	if (!entry)
-		return -ENOMEM;
+	if (!entry) {
+		ret = -ENOMEM;
+		goto fail;
+	}
 
 	/* All MSIs are unmasked by default; mask them all */
 	pci_msi_mask(entry, msi_multi_mask(entry));
@@ -452,7 +459,6 @@ static int msi_capability_init(struct pc
 	/* Set MSI enabled bits	*/
 	pci_intx_for_msi(dev, 0);
 	pci_msi_set_enable(dev, 1);
-	dev->msi_enabled = 1;
 
 	pcibios_free_irq(dev);
 	dev->irq = entry->irq;
@@ -461,6 +467,8 @@ static int msi_capability_init(struct pc
 err:
 	pci_msi_unmask(entry, msi_multi_mask(entry));
 	free_msi_irqs(dev);
+fail:
+	dev->msi_enabled = 0;
 	return ret;
 }
 
@@ -589,6 +597,9 @@ static int msix_capability_init(struct p
 	pci_msix_clear_and_set_ctrl(dev, 0, PCI_MSIX_FLAGS_MASKALL |
 				    PCI_MSIX_FLAGS_ENABLE);
 
+	/* Mark it enabled so setup functions can query it */
+	dev->msix_enabled = 1;
+
 	pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &control);
 	/* Request & Map MSI-X table region */
 	tsize = msix_table_size(control);
@@ -626,9 +637,8 @@ static int msix_capability_init(struct p
 
 	dev->msi_irq_groups = groups;
 
-	/* Set MSI-X enabled bits and unmask the function */
+	/* Disable INTX and unmask MSI-X */
 	pci_intx_for_msi(dev, 0);
-	dev->msix_enabled = 1;
 	pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0);
 
 	pcibios_free_irq(dev);
@@ -638,6 +648,7 @@ static int msix_capability_init(struct p
 	free_msi_irqs(dev);
 
 out_disable:
+	dev->msix_enabled = 0;
 	pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0);
 
 	return ret;


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 02/35] x86/pci/XEN: Use PCI device property
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
  2021-12-10 22:18 ` [patch V3 01/35] PCI/MSI: Set pci_dev::msi[x]_enabled early Thomas Gleixner
@ 2021-12-10 22:18 ` Thomas Gleixner
  2021-12-13 13:56   ` Jason Gunthorpe
  2021-12-10 22:18 ` [patch V3 03/35] x86/apic/msi: Use PCI device MSI property Thomas Gleixner
                   ` (33 subsequent siblings)
  35 siblings, 1 reply; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:18 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Greg Kroah-Hartman, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, linux-arm-kernel,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

instead of fiddling with MSI descriptors.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Juergen Gross <jgross@suse.com>
Cc: xen-devel@lists.xenproject.org
---
V3: Use pci_dev->msix_enabled.
---
 arch/x86/pci/xen.c |    9 ++-------
 1 file changed, 2 insertions(+), 7 deletions(-)

--- a/arch/x86/pci/xen.c
+++ b/arch/x86/pci/xen.c
@@ -399,9 +399,7 @@ static void xen_teardown_msi_irqs(struct
 
 static void xen_pv_teardown_msi_irqs(struct pci_dev *dev)
 {
-	struct msi_desc *msidesc = first_pci_msi_entry(dev);
-
-	if (msidesc->pci.msi_attrib.is_msix)
+	if (dev->msix_enabled)
 		xen_pci_frontend_disable_msix(dev);
 	else
 		xen_pci_frontend_disable_msi(dev);
@@ -417,10 +415,7 @@ static int xen_msi_domain_alloc_irqs(str
 	if (WARN_ON_ONCE(!dev_is_pci(dev)))
 		return -EINVAL;
 
-	if (first_msi_entry(dev)->pci.msi_attrib.is_msix)
-		type = PCI_CAP_ID_MSIX;
-	else
-		type = PCI_CAP_ID_MSI;
+	type = to_pci_dev(dev)->msix_enabled ? PCI_CAP_ID_MSIX : PCI_CAP_ID_MSI;
 
 	return xen_msi_ops.setup_msi_irqs(to_pci_dev(dev), nvec, type);
 }


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 03/35] x86/apic/msi: Use PCI device MSI property
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
  2021-12-10 22:18 ` [patch V3 01/35] PCI/MSI: Set pci_dev::msi[x]_enabled early Thomas Gleixner
  2021-12-10 22:18 ` [patch V3 02/35] x86/pci/XEN: Use PCI device property Thomas Gleixner
@ 2021-12-10 22:18 ` Thomas Gleixner
  2021-12-11 10:52   ` Greg Kroah-Hartman
  2021-12-13 13:59   ` Jason Gunthorpe
  2021-12-10 22:18 ` [patch V3 04/35] genirq/msi: Use PCI device property Thomas Gleixner
                   ` (32 subsequent siblings)
  35 siblings, 2 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:18 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Greg Kroah-Hartman, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, linux-arm-kernel,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

instead of fiddling with MSI descriptors.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
V3: Use pci_dev->msix_enabled - Jason
---
 arch/x86/kernel/apic/msi.c |    5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

--- a/arch/x86/kernel/apic/msi.c
+++ b/arch/x86/kernel/apic/msi.c
@@ -160,11 +160,8 @@ static struct irq_chip pci_msi_controlle
 int pci_msi_prepare(struct irq_domain *domain, struct device *dev, int nvec,
 		    msi_alloc_info_t *arg)
 {
-	struct pci_dev *pdev = to_pci_dev(dev);
-	struct msi_desc *desc = first_pci_msi_entry(pdev);
-
 	init_irq_alloc_info(arg, NULL);
-	if (desc->pci.msi_attrib.is_msix) {
+	if (to_pci_dev(dev)->msix_enabled) {
 		arg->type = X86_IRQ_ALLOC_TYPE_PCI_MSIX;
 	} else {
 		arg->type = X86_IRQ_ALLOC_TYPE_PCI_MSI;


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 04/35] genirq/msi: Use PCI device property
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (2 preceding siblings ...)
  2021-12-10 22:18 ` [patch V3 03/35] x86/apic/msi: Use PCI device MSI property Thomas Gleixner
@ 2021-12-10 22:18 ` Thomas Gleixner
  2021-12-13 13:59   ` Jason Gunthorpe
  2021-12-10 22:18 ` [patch V3 05/35] powerpc/cell/axon_msi: " Thomas Gleixner
                   ` (31 subsequent siblings)
  35 siblings, 1 reply; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:18 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Greg Kroah-Hartman, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, linux-arm-kernel,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

to determine whether this is MSI or MSIX instead of consulting MSI
descriptors.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
V2: Use PCI device property - Jason
---
 kernel/irq/msi.c |   17 ++---------------
 1 file changed, 2 insertions(+), 15 deletions(-)

--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -77,21 +77,8 @@ EXPORT_SYMBOL_GPL(get_cached_msi_msg);
 static ssize_t msi_mode_show(struct device *dev, struct device_attribute *attr,
 			     char *buf)
 {
-	struct msi_desc *entry;
-	bool is_msix = false;
-	unsigned long irq;
-	int retval;
-
-	retval = kstrtoul(attr->attr.name, 10, &irq);
-	if (retval)
-		return retval;
-
-	entry = irq_get_msi_desc(irq);
-	if (!entry)
-		return -ENODEV;
-
-	if (dev_is_pci(dev))
-		is_msix = entry->pci.msi_attrib.is_msix;
+	/* MSI vs. MSIX is per device not per interrupt */
+	bool is_msix = dev_is_pci(dev) ? to_pci_dev(dev)->msix_enabled : false;
 
 	return sysfs_emit(buf, "%s\n", is_msix ? "msix" : "msi");
 }


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 05/35] powerpc/cell/axon_msi: Use PCI device property
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (3 preceding siblings ...)
  2021-12-10 22:18 ` [patch V3 04/35] genirq/msi: Use PCI device property Thomas Gleixner
@ 2021-12-10 22:18 ` Thomas Gleixner
  2021-12-11 15:21   ` Arnd Bergmann
  2021-12-13 14:01   ` Jason Gunthorpe
  2021-12-10 22:18 ` [patch V3 06/35] powerpc/pseries/msi: Use PCI device properties Thomas Gleixner
                   ` (30 subsequent siblings)
  35 siblings, 2 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:18 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Arnd Bergmann, Michael Ellerman,
	Benjamin Herrenschmidt, linuxppc-dev, Juergen Gross, xen-devel,
	Greg Kroah-Hartman, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, linux-arm-kernel,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

instead of fiddling with MSI descriptors.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: linuxppc-dev@lists.ozlabs.org
---
V3: Use pci_dev property - Jason
V2: Invoke the function with the correct number of arguments - Andy
---
 arch/powerpc/platforms/cell/axon_msi.c |    5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

--- a/arch/powerpc/platforms/cell/axon_msi.c
+++ b/arch/powerpc/platforms/cell/axon_msi.c
@@ -199,7 +199,6 @@ static struct axon_msic *find_msi_transl
 static int setup_msi_msg_address(struct pci_dev *dev, struct msi_msg *msg)
 {
 	struct device_node *dn;
-	struct msi_desc *entry;
 	int len;
 	const u32 *prop;
 
@@ -209,10 +208,8 @@ static int setup_msi_msg_address(struct
 		return -ENODEV;
 	}
 
-	entry = first_pci_msi_entry(dev);
-
 	for (; dn; dn = of_get_next_parent(dn)) {
-		if (entry->pci.msi_attrib.is_64) {
+		if (!dev->no_64bit_msi) {
 			prop = of_get_property(dn, "msi-address-64", &len);
 			if (prop)
 				break;


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 06/35] powerpc/pseries/msi: Use PCI device properties
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (4 preceding siblings ...)
  2021-12-10 22:18 ` [patch V3 05/35] powerpc/cell/axon_msi: " Thomas Gleixner
@ 2021-12-10 22:18 ` Thomas Gleixner
  2021-12-13 14:04   ` Jason Gunthorpe
  2021-12-10 22:18 ` [patch V3 07/35] device: Move MSI related data into a struct Thomas Gleixner
                   ` (29 subsequent siblings)
  35 siblings, 1 reply; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:18 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Michael Ellerman, linuxppc-dev, Juergen Gross,
	xen-devel, Arnd Bergmann, Benjamin Herrenschmidt,
	Greg Kroah-Hartman, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, linux-arm-kernel,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

instead of fiddling with MSI descriptors.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: linuxppc-dev@lists.ozlabs.org
---
V3: Use pci_dev->msix_enabled - Jason
---
 arch/powerpc/platforms/pseries/msi.c |    3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

--- a/arch/powerpc/platforms/pseries/msi.c
+++ b/arch/powerpc/platforms/pseries/msi.c
@@ -448,8 +448,7 @@ static int pseries_msi_ops_prepare(struc
 				   int nvec, msi_alloc_info_t *arg)
 {
 	struct pci_dev *pdev = to_pci_dev(dev);
-	struct msi_desc *desc = first_pci_msi_entry(pdev);
-	int type = desc->pci.msi_attrib.is_msix ? PCI_CAP_ID_MSIX : PCI_CAP_ID_MSI;
+	int type = pdev->msix_enabled ? PCI_CAP_ID_MSIX : PCI_CAP_ID_MSI;
 
 	return rtas_prepare_msi_irqs(pdev, nvec, type, arg);
 }


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 07/35] device: Move MSI related data into a struct
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (5 preceding siblings ...)
  2021-12-10 22:18 ` [patch V3 06/35] powerpc/pseries/msi: Use PCI device properties Thomas Gleixner
@ 2021-12-10 22:18 ` Thomas Gleixner
  2021-12-11 15:22   ` Arnd Bergmann
  2021-12-10 22:18 ` [patch V3 08/35] device: Add device:: Msi_data pointer and struct msi_device_data Thomas Gleixner
                   ` (28 subsequent siblings)
  35 siblings, 1 reply; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:18 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Juergen Gross, xen-devel,
	Arnd Bergmann, Michael Ellerman, Benjamin Herrenschmidt,
	linuxppc-dev, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, linux-arm-kernel,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

The only unconditional part of MSI data in struct device is the irqdomain
pointer. Everything else can be allocated on demand. Create a data
structure and move the irqdomain pointer into it. The other MSI specific
parts are going to be removed from struct device in later steps.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>

---
 drivers/base/platform-msi.c                 |   12 ++++++------
 drivers/dma/ti/k3-udma.c                    |    4 ++--
 drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c |    2 +-
 drivers/irqchip/irq-mvebu-icu.c             |    6 +++---
 drivers/soc/ti/k3-ringacc.c                 |    4 ++--
 drivers/soc/ti/ti_sci_inta_msi.c            |    2 +-
 include/linux/device.h                      |   20 ++++++++++++++------
 7 files changed, 29 insertions(+), 21 deletions(-)

--- a/drivers/base/platform-msi.c
+++ b/drivers/base/platform-msi.c
@@ -210,10 +210,10 @@ platform_msi_alloc_priv_data(struct devi
 	 * accordingly (which would impact the max number of MSI
 	 * capable devices).
 	 */
-	if (!dev->msi_domain || !write_msi_msg || !nvec || nvec > MAX_DEV_MSIS)
+	if (!dev->msi.domain || !write_msi_msg || !nvec || nvec > MAX_DEV_MSIS)
 		return ERR_PTR(-EINVAL);
 
-	if (dev->msi_domain->bus_token != DOMAIN_BUS_PLATFORM_MSI) {
+	if (dev->msi.domain->bus_token != DOMAIN_BUS_PLATFORM_MSI) {
 		dev_err(dev, "Incompatible msi_domain, giving up\n");
 		return ERR_PTR(-EINVAL);
 	}
@@ -269,7 +269,7 @@ int platform_msi_domain_alloc_irqs(struc
 	if (err)
 		goto out_free_priv_data;
 
-	err = msi_domain_alloc_irqs(dev->msi_domain, dev, nvec);
+	err = msi_domain_alloc_irqs(dev->msi.domain, dev, nvec);
 	if (err)
 		goto out_free_desc;
 
@@ -282,7 +282,7 @@ int platform_msi_domain_alloc_irqs(struc
 	return 0;
 
 out_free_irqs:
-	msi_domain_free_irqs(dev->msi_domain, dev);
+	msi_domain_free_irqs(dev->msi.domain, dev);
 out_free_desc:
 	platform_msi_free_descs(dev, 0, nvec);
 out_free_priv_data:
@@ -306,7 +306,7 @@ void platform_msi_domain_free_irqs(struc
 		platform_msi_free_priv_data(desc->platform.msi_priv_data);
 	}
 
-	msi_domain_free_irqs(dev->msi_domain, dev);
+	msi_domain_free_irqs(dev->msi.domain, dev);
 	platform_msi_free_descs(dev, 0, MAX_DEV_MSIS);
 }
 EXPORT_SYMBOL_GPL(platform_msi_domain_free_irqs);
@@ -354,7 +354,7 @@ struct irq_domain *
 		return NULL;
 
 	data->host_data = host_data;
-	domain = irq_domain_create_hierarchy(dev->msi_domain, 0,
+	domain = irq_domain_create_hierarchy(dev->msi.domain, 0,
 					     is_tree ? 0 : nvec,
 					     dev->fwnode, ops, data);
 	if (!domain)
--- a/drivers/dma/ti/k3-udma.c
+++ b/drivers/dma/ti/k3-udma.c
@@ -5279,9 +5279,9 @@ static int udma_probe(struct platform_de
 	if (IS_ERR(ud->ringacc))
 		return PTR_ERR(ud->ringacc);
 
-	dev->msi_domain = of_msi_get_domain(dev, dev->of_node,
+	dev->msi.domain = of_msi_get_domain(dev, dev->of_node,
 					    DOMAIN_BUS_TI_SCI_INTA_MSI);
-	if (!dev->msi_domain) {
+	if (!dev->msi.domain) {
 		dev_err(dev, "Failed to get MSI domain\n");
 		return -EPROBE_DEFER;
 	}
--- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
+++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
@@ -3170,7 +3170,7 @@ static void arm_smmu_setup_msis(struct a
 	if (!(smmu->features & ARM_SMMU_FEAT_MSI))
 		return;
 
-	if (!dev->msi_domain) {
+	if (!dev->msi.domain) {
 		dev_info(smmu->dev, "msi_domain absent - falling back to wired irqs\n");
 		return;
 	}
--- a/drivers/irqchip/irq-mvebu-icu.c
+++ b/drivers/irqchip/irq-mvebu-icu.c
@@ -314,12 +314,12 @@ static int mvebu_icu_subset_probe(struct
 		msi_data->subset_data = of_device_get_match_data(dev);
 	}
 
-	dev->msi_domain = of_msi_get_domain(dev, dev->of_node,
+	dev->msi.domain = of_msi_get_domain(dev, dev->of_node,
 					    DOMAIN_BUS_PLATFORM_MSI);
-	if (!dev->msi_domain)
+	if (!dev->msi.domain)
 		return -EPROBE_DEFER;
 
-	msi_parent_dn = irq_domain_get_of_node(dev->msi_domain);
+	msi_parent_dn = irq_domain_get_of_node(dev->msi.domain);
 	if (!msi_parent_dn)
 		return -ENODEV;
 
--- a/drivers/soc/ti/k3-ringacc.c
+++ b/drivers/soc/ti/k3-ringacc.c
@@ -1356,9 +1356,9 @@ static int k3_ringacc_init(struct platfo
 	struct resource *res;
 	int ret, i;
 
-	dev->msi_domain = of_msi_get_domain(dev, dev->of_node,
+	dev->msi.domain = of_msi_get_domain(dev, dev->of_node,
 					    DOMAIN_BUS_TI_SCI_INTA_MSI);
-	if (!dev->msi_domain) {
+	if (!dev->msi.domain) {
 		dev_err(dev, "Failed to get MSI domain\n");
 		return -EPROBE_DEFER;
 	}
--- a/drivers/soc/ti/ti_sci_inta_msi.c
+++ b/drivers/soc/ti/ti_sci_inta_msi.c
@@ -140,7 +140,7 @@ EXPORT_SYMBOL_GPL(ti_sci_inta_msi_domain
 
 void ti_sci_inta_msi_domain_free_irqs(struct device *dev)
 {
-	msi_domain_free_irqs(dev->msi_domain, dev);
+	msi_domain_free_irqs(dev->msi.domain, dev);
 	ti_sci_inta_msi_free_descs(dev);
 }
 EXPORT_SYMBOL_GPL(ti_sci_inta_msi_domain_free_irqs);
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -372,6 +372,16 @@ struct dev_links_info {
 };
 
 /**
+ * struct dev_msi_info - Device data related to MSI
+ * @domain:	The MSI interrupt domain associated to the device
+ */
+struct dev_msi_info {
+#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+	struct irq_domain	*domain;
+#endif
+};
+
+/**
  * struct device - The basic device structure
  * @parent:	The device's "parent" device, the device to which it is attached.
  * 		In most cases, a parent device is some sort of bus or host
@@ -407,8 +417,8 @@ struct dev_links_info {
  * @em_pd:	device's energy model performance domain
  * @pins:	For device pin management.
  *		See Documentation/driver-api/pin-control.rst for details.
+ * @msi:	MSI related data
  * @msi_list:	Hosts MSI descriptors
- * @msi_domain: The generic MSI domain this device is using.
  * @numa_node:	NUMA node this device is close to.
  * @dma_ops:    DMA mapping operations for this device.
  * @dma_mask:	Dma mask (if dma'ble device).
@@ -500,12 +510,10 @@ struct device {
 	struct em_perf_domain	*em_pd;
 #endif
 
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
-	struct irq_domain	*msi_domain;
-#endif
 #ifdef CONFIG_PINCTRL
 	struct dev_pin_info	*pins;
 #endif
+	struct dev_msi_info	msi;
 #ifdef CONFIG_GENERIC_MSI_IRQ
 	struct list_head	msi_list;
 #endif
@@ -666,7 +674,7 @@ static inline void set_dev_node(struct d
 static inline struct irq_domain *dev_get_msi_domain(const struct device *dev)
 {
 #ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
-	return dev->msi_domain;
+	return dev->msi.domain;
 #else
 	return NULL;
 #endif
@@ -675,7 +683,7 @@ static inline struct irq_domain *dev_get
 static inline void dev_set_msi_domain(struct device *dev, struct irq_domain *d)
 {
 #ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
-	dev->msi_domain = d;
+	dev->msi.domain = d;
 #endif
 }
 


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 08/35] device: Add device:: Msi_data pointer and struct msi_device_data
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (6 preceding siblings ...)
  2021-12-10 22:18 ` [patch V3 07/35] device: Move MSI related data into a struct Thomas Gleixner
@ 2021-12-10 22:18 ` Thomas Gleixner
  2021-12-10 22:18 ` [patch V3 09/35] PCI/MSI: Allocate MSI device data on first use Thomas Gleixner
                   ` (27 subsequent siblings)
  35 siblings, 0 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:18 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Juergen Gross, xen-devel,
	Arnd Bergmann, Michael Ellerman, Benjamin Herrenschmidt,
	linuxppc-dev, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, linux-arm-kernel,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

Create struct msi_device_data and add a pointer of that type to struct
dev_msi_info, which is part of struct device. Provide an allocator function
which can be invoked from the MSI interrupt allocation code pathes.

Add a properties field to the data structure as a first member so the
allocation size is not zero bytes. The field will be uses later on.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
 include/linux/device.h |    5 +++++
 include/linux/msi.h    |   18 ++++++++++++++++++
 kernel/irq/msi.c       |   32 ++++++++++++++++++++++++++++++++
 3 files changed, 55 insertions(+)

--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -45,6 +45,7 @@ struct iommu_ops;
 struct iommu_group;
 struct dev_pin_info;
 struct dev_iommu;
+struct msi_device_data;
 
 /**
  * struct subsys_interface - interfaces to device functions
@@ -374,11 +375,15 @@ struct dev_links_info {
 /**
  * struct dev_msi_info - Device data related to MSI
  * @domain:	The MSI interrupt domain associated to the device
+ * @data:	Pointer to MSI device data
  */
 struct dev_msi_info {
 #ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
 	struct irq_domain	*domain;
 #endif
+#ifdef CONFIG_GENERIC_MSI_IRQ
+	struct msi_device_data	*data;
+#endif
 };
 
 /**
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -171,6 +171,16 @@ struct msi_desc {
 	};
 };
 
+/**
+ * msi_device_data - MSI per device data
+ * @properties:		MSI properties which are interesting to drivers
+ */
+struct msi_device_data {
+	unsigned long			properties;
+};
+
+int msi_setup_device_data(struct device *dev);
+
 /* Helpers to hide struct msi_desc implementation details */
 #define msi_desc_to_dev(desc)		((desc)->dev)
 #define dev_to_msi_list(dev)		(&(dev)->msi_list)
@@ -233,10 +243,16 @@ void pci_msi_mask_irq(struct irq_data *d
 void pci_msi_unmask_irq(struct irq_data *data);
 
 #ifdef CONFIG_SYSFS
+int msi_device_populate_sysfs(struct device *dev);
+void msi_device_destroy_sysfs(struct device *dev);
+
 const struct attribute_group **msi_populate_sysfs(struct device *dev);
 void msi_destroy_sysfs(struct device *dev,
 		       const struct attribute_group **msi_irq_groups);
 #else
+static inline int msi_device_populate_sysfs(struct device *dev) { return 0; }
+static inline void msi_device_destroy_sysfs(struct device *dev) { }
+
 static inline const struct attribute_group **msi_populate_sysfs(struct device *dev)
 {
 	return NULL;
@@ -384,6 +400,8 @@ enum {
 	MSI_FLAG_MUST_REACTIVATE	= (1 << 5),
 	/* Is level-triggered capable, using two messages */
 	MSI_FLAG_LEVEL_CAPABLE		= (1 << 6),
+	/* Populate sysfs on alloc() and destroy it on free() */
+	MSI_FLAG_DEV_SYSFS		= (1 << 7),
 };
 
 int msi_domain_set_affinity(struct irq_data *data, const struct cpumask *mask,
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -73,6 +73,38 @@ void get_cached_msi_msg(unsigned int irq
 }
 EXPORT_SYMBOL_GPL(get_cached_msi_msg);
 
+static void msi_device_data_release(struct device *dev, void *res)
+{
+	WARN_ON_ONCE(!list_empty(&dev->msi_list));
+	dev->msi.data = NULL;
+}
+
+/**
+ * msi_setup_device_data - Setup MSI device data
+ * @dev:	Device for which MSI device data should be set up
+ *
+ * Return: 0 on success, appropriate error code otherwise
+ *
+ * This can be called more than once for @dev. If the MSI device data is
+ * already allocated the call succeeds. The allocated memory is
+ * automatically released when the device is destroyed.
+ */
+int msi_setup_device_data(struct device *dev)
+{
+	struct msi_device_data *md;
+
+	if (dev->msi.data)
+		return 0;
+
+	md = devres_alloc(msi_device_data_release, sizeof(*md), GFP_KERNEL);
+	if (!md)
+		return -ENOMEM;
+
+	dev->msi.data = md;
+	devres_add(dev, md);
+	return 0;
+}
+
 #ifdef CONFIG_SYSFS
 static ssize_t msi_mode_show(struct device *dev, struct device_attribute *attr,
 			     char *buf)


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 09/35] PCI/MSI: Allocate MSI device data on first use
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (7 preceding siblings ...)
  2021-12-10 22:18 ` [patch V3 08/35] device: Add device:: Msi_data pointer and struct msi_device_data Thomas Gleixner
@ 2021-12-10 22:18 ` Thomas Gleixner
  2021-12-15 17:16   ` [patch V4 09-01/35] PCI/MSI: Decouple MSI[-X] disable from pcim_release() Thomas Gleixner
  2021-12-10 22:18 ` [patch V3 10/35] platform-msi: Allocate MSI device data on first use Thomas Gleixner
                   ` (26 subsequent siblings)
  35 siblings, 1 reply; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:18 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Bjorn Helgaas,
	Juergen Gross, xen-devel, Arnd Bergmann, Michael Ellerman,
	Benjamin Herrenschmidt, linuxppc-dev, Stuart Yoder,
	Laurentiu Tudor, Nishanth Menon, Tero Kristo, Santosh Shilimkar,
	linux-arm-kernel, Vinod Koul, dmaengine, Mark Rutland,
	Will Deacon, Robin Murphy, Joerg Roedel, iommu, Jassi Brar,
	Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

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
@@ -900,10 +900,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);
 
@@ -958,7 +960,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);
 
@@ -985,8 +991,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;


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 10/35] platform-msi: Allocate MSI device data on first use
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (8 preceding siblings ...)
  2021-12-10 22:18 ` [patch V3 09/35] PCI/MSI: Allocate MSI device data on first use Thomas Gleixner
@ 2021-12-10 22:18 ` Thomas Gleixner
  2021-12-10 22:19 ` [patch V3 11/35] bus: fsl-mc-msi: " Thomas Gleixner
                   ` (25 subsequent siblings)
  35 siblings, 0 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:18 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Juergen Gross, xen-devel,
	Arnd Bergmann, Michael Ellerman, Benjamin Herrenschmidt,
	linuxppc-dev, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, linux-arm-kernel,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

Allocate the MSI device data on first invocation of the allocation function
for platform MSI private data.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
 drivers/base/platform-msi.c |    8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

--- a/drivers/base/platform-msi.c
+++ b/drivers/base/platform-msi.c
@@ -204,6 +204,8 @@ platform_msi_alloc_priv_data(struct devi
 			     irq_write_msi_msg_t write_msi_msg)
 {
 	struct platform_msi_priv_data *datap;
+	int err;
+
 	/*
 	 * Limit the number of interrupts to 2048 per device. Should we
 	 * need to bump this up, DEV_ID_SHIFT should be adjusted
@@ -218,6 +220,10 @@ platform_msi_alloc_priv_data(struct devi
 		return ERR_PTR(-EINVAL);
 	}
 
+	err = msi_setup_device_data(dev);
+	if (err)
+		return ERR_PTR(err);
+
 	/* Already had a helping of MSI? Greed... */
 	if (!list_empty(dev_to_msi_list(dev)))
 		return ERR_PTR(-EBUSY);
@@ -229,7 +235,7 @@ platform_msi_alloc_priv_data(struct devi
 	datap->devid = ida_simple_get(&platform_msi_devid_ida,
 				      0, 1 << DEV_ID_SHIFT, GFP_KERNEL);
 	if (datap->devid < 0) {
-		int err = datap->devid;
+		err = datap->devid;
 		kfree(datap);
 		return ERR_PTR(err);
 	}


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 11/35] bus: fsl-mc-msi: Allocate MSI device data on first use
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (9 preceding siblings ...)
  2021-12-10 22:18 ` [patch V3 10/35] platform-msi: Allocate MSI device data on first use Thomas Gleixner
@ 2021-12-10 22:19 ` Thomas Gleixner
  2021-12-10 22:19 ` [patch V3 12/35] soc: ti: ti_sci_inta_msi: " Thomas Gleixner
                   ` (24 subsequent siblings)
  35 siblings, 0 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:19 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Stuart Yoder,
	Laurentiu Tudor, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Bjorn Helgaas, Nishanth Menon, Tero Kristo, Santosh Shilimkar,
	linux-arm-kernel, Vinod Koul, dmaengine, Mark Rutland,
	Will Deacon, Robin Murphy, Joerg Roedel, iommu, Jassi Brar,
	Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

Allocate the MSI device data on first invocation of the allocation function.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Cc: Stuart Yoder <stuyoder@gmail.com>
Cc: Laurentiu Tudor <laurentiu.tudor@nxp.com>
---
 drivers/bus/fsl-mc/fsl-mc-msi.c |   14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

--- a/drivers/bus/fsl-mc/fsl-mc-msi.c
+++ b/drivers/bus/fsl-mc/fsl-mc-msi.c
@@ -253,6 +253,14 @@ int fsl_mc_msi_domain_alloc_irqs(struct
 	struct irq_domain *msi_domain;
 	int error;
 
+	msi_domain = dev_get_msi_domain(dev);
+	if (!msi_domain)
+		return -EINVAL;
+
+	error = msi_setup_device_data(dev);
+	if (error)
+		return error;
+
 	if (!list_empty(dev_to_msi_list(dev)))
 		return -EINVAL;
 
@@ -260,12 +268,6 @@ int fsl_mc_msi_domain_alloc_irqs(struct
 	if (error < 0)
 		return error;
 
-	msi_domain = dev_get_msi_domain(dev);
-	if (!msi_domain) {
-		error = -EINVAL;
-		goto cleanup_msi_descs;
-	}
-
 	/*
 	 * NOTE: Calling this function will trigger the invocation of the
 	 * its_fsl_mc_msi_prepare() callback


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 12/35] soc: ti: ti_sci_inta_msi: Allocate MSI device data on first use
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (10 preceding siblings ...)
  2021-12-10 22:19 ` [patch V3 11/35] bus: fsl-mc-msi: " Thomas Gleixner
@ 2021-12-10 22:19 ` Thomas Gleixner
  2021-12-11 15:22   ` Arnd Bergmann
  2021-12-13 17:56   ` Nishanth Menon
  2021-12-10 22:19 ` [patch V3 13/35] genirq/msi: Provide msi_device_populate/destroy_sysfs() Thomas Gleixner
                   ` (23 subsequent siblings)
  35 siblings, 2 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:19 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Nishanth Menon,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Juergen Gross,
	xen-devel, Arnd Bergmann, Michael Ellerman,
	Benjamin Herrenschmidt, linuxppc-dev, Bjorn Helgaas,
	Stuart Yoder, Laurentiu Tudor, Vinod Koul, dmaengine,
	Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel, iommu,
	Jassi Brar, Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

Allocate the MSI device data on first invocation of the allocation function.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Cc: Nishanth Menon <nm@ti.com>
Cc: Tero Kristo <kristo@kernel.org>
Cc: Santosh Shilimkar <ssantosh@kernel.org>
Cc: linux-arm-kernel@lists.infradead.org
---
 drivers/soc/ti/ti_sci_inta_msi.c |    4 ++++
 1 file changed, 4 insertions(+)

--- a/drivers/soc/ti/ti_sci_inta_msi.c
+++ b/drivers/soc/ti/ti_sci_inta_msi.c
@@ -120,6 +120,10 @@ int ti_sci_inta_msi_domain_alloc_irqs(st
 	if (pdev->id < 0)
 		return -ENODEV;
 
+	ret = msi_setup_device_data(dev);
+	if (ret)
+		return ret;
+
 	nvec = ti_sci_inta_msi_alloc_descs(dev, res);
 	if (nvec <= 0)
 		return nvec;


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 13/35] genirq/msi: Provide msi_device_populate/destroy_sysfs()
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (11 preceding siblings ...)
  2021-12-10 22:19 ` [patch V3 12/35] soc: ti: ti_sci_inta_msi: " Thomas Gleixner
@ 2021-12-10 22:19 ` Thomas Gleixner
  2021-12-10 22:19 ` [patch V3 14/35] PCI/MSI: Let the irq code handle sysfs groups Thomas Gleixner
                   ` (22 subsequent siblings)
  35 siblings, 0 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:19 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Juergen Gross, xen-devel,
	Arnd Bergmann, Michael Ellerman, Benjamin Herrenschmidt,
	linuxppc-dev, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, linux-arm-kernel,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

Add new allocation functions which can be activated by domain info
flags. They store the groups pointer in struct msi_device_data.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
 include/linux/msi.h |    4 ++++
 kernel/irq/msi.c    |   42 ++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 44 insertions(+), 2 deletions(-)

--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -56,6 +56,8 @@ struct irq_data;
 struct msi_desc;
 struct pci_dev;
 struct platform_msi_priv_data;
+struct attribute_group;
+
 void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
 #ifdef CONFIG_GENERIC_MSI_IRQ
 void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg);
@@ -174,9 +176,11 @@ struct msi_desc {
 /**
  * msi_device_data - MSI per device data
  * @properties:		MSI properties which are interesting to drivers
+ * @attrs:		Pointer to the sysfs attribute group
  */
 struct msi_device_data {
 	unsigned long			properties;
+	const struct attribute_group    **attrs;
 };
 
 int msi_setup_device_data(struct device *dev);
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -200,6 +200,20 @@ const struct attribute_group **msi_popul
 }
 
 /**
+ * msi_device_populate_sysfs - Populate msi_irqs sysfs entries for a device
+ * @dev:	The device (PCI, platform etc) which will get sysfs entries
+ */
+int msi_device_populate_sysfs(struct device *dev)
+{
+	const struct attribute_group **group = msi_populate_sysfs(dev);
+
+	if (IS_ERR(group))
+		return PTR_ERR(group);
+	dev->msi.data->attrs = group;
+	return 0;
+}
+
+/**
  * msi_destroy_sysfs - Destroy msi_irqs sysfs entries for devices
  * @dev:		The device(PCI, platform etc) who will remove sysfs entries
  * @msi_irq_groups:	attribute_group for device msi_irqs entries
@@ -225,6 +239,17 @@ void msi_destroy_sysfs(struct device *de
 		kfree(msi_irq_groups);
 	}
 }
+
+/**
+ * msi_device_destroy_sysfs - Destroy msi_irqs sysfs entries for a device
+ * @dev:		The device (PCI, platform etc) for which to remove
+ *			sysfs entries
+ */
+void msi_device_destroy_sysfs(struct device *dev)
+{
+	msi_destroy_sysfs(dev, dev->msi.data->attrs);
+	dev->msi.data->attrs = NULL;
+}
 #endif
 
 #ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
@@ -672,8 +697,19 @@ int msi_domain_alloc_irqs(struct irq_dom
 {
 	struct msi_domain_info *info = domain->host_data;
 	struct msi_domain_ops *ops = info->ops;
+	int ret;
 
-	return ops->domain_alloc_irqs(domain, dev, nvec);
+	ret = ops->domain_alloc_irqs(domain, dev, nvec);
+	if (ret)
+		return ret;
+
+	if (!(info->flags & MSI_FLAG_DEV_SYSFS))
+		return 0;
+
+	ret = msi_device_populate_sysfs(dev);
+	if (ret)
+		msi_domain_free_irqs(domain, dev);
+	return ret;
 }
 
 void __msi_domain_free_irqs(struct irq_domain *domain, struct device *dev)
@@ -712,7 +748,9 @@ void msi_domain_free_irqs(struct irq_dom
 	struct msi_domain_info *info = domain->host_data;
 	struct msi_domain_ops *ops = info->ops;
 
-	return ops->domain_free_irqs(domain, dev);
+	if (info->flags & MSI_FLAG_DEV_SYSFS)
+		msi_device_destroy_sysfs(dev);
+	ops->domain_free_irqs(domain, dev);
 }
 
 /**


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 14/35] PCI/MSI: Let the irq code handle sysfs groups
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (12 preceding siblings ...)
  2021-12-10 22:19 ` [patch V3 13/35] genirq/msi: Provide msi_device_populate/destroy_sysfs() Thomas Gleixner
@ 2021-12-10 22:19 ` Thomas Gleixner
  2021-12-10 22:19 ` [patch V3 15/35] platform-msi: Let the core " Thomas Gleixner
                   ` (21 subsequent siblings)
  35 siblings, 0 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:19 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Bjorn Helgaas,
	Juergen Gross, xen-devel, Arnd Bergmann, Michael Ellerman,
	Benjamin Herrenschmidt, linuxppc-dev, Stuart Yoder,
	Laurentiu Tudor, Nishanth Menon, Tero Kristo, Santosh Shilimkar,
	linux-arm-kernel, Vinod Koul, dmaengine, Mark Rutland,
	Will Deacon, Robin Murphy, Joerg Roedel, iommu, Jassi Brar,
	Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

Set the domain info flag which makes the core code handle sysfs groups and
put an explicit invocation into the legacy code.

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/irqdomain.c |    2 +-
 drivers/pci/msi/legacy.c    |    6 +++++-
 drivers/pci/msi/msi.c       |   23 -----------------------
 include/linux/pci.h         |    1 -
 4 files changed, 6 insertions(+), 26 deletions(-)

--- a/drivers/pci/msi/irqdomain.c
+++ b/drivers/pci/msi/irqdomain.c
@@ -159,7 +159,7 @@ struct irq_domain *pci_msi_create_irq_do
 	if (info->flags & MSI_FLAG_USE_DEF_CHIP_OPS)
 		pci_msi_domain_update_chip_ops(info);
 
-	info->flags |= MSI_FLAG_ACTIVATE_EARLY;
+	info->flags |= MSI_FLAG_ACTIVATE_EARLY | MSI_FLAG_DEV_SYSFS;
 	if (IS_ENABLED(CONFIG_GENERIC_IRQ_RESERVATION_MODE))
 		info->flags |= MSI_FLAG_MUST_REACTIVATE;
 
--- a/drivers/pci/msi/legacy.c
+++ b/drivers/pci/msi/legacy.c
@@ -70,10 +70,14 @@ int pci_msi_legacy_setup_msi_irqs(struct
 {
 	int ret = arch_setup_msi_irqs(dev, nvec, type);
 
-	return pci_msi_setup_check_result(dev, type, ret);
+	ret = pci_msi_setup_check_result(dev, type, ret);
+	if (!ret)
+		ret = msi_device_populate_sysfs(&dev->dev);
+	return ret;
 }
 
 void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev)
 {
+	msi_device_destroy_sysfs(&dev->dev);
 	arch_teardown_msi_irqs(dev);
 }
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -233,11 +233,6 @@ static void free_msi_irqs(struct pci_dev
 			for (i = 0; i < entry->nvec_used; i++)
 				BUG_ON(irq_has_action(entry->irq + i));
 
-	if (dev->msi_irq_groups) {
-		msi_destroy_sysfs(&dev->dev, dev->msi_irq_groups);
-		dev->msi_irq_groups = NULL;
-	}
-
 	pci_msi_teardown_msi_irqs(dev);
 
 	list_for_each_entry_safe(entry, tmp, msi_list, list) {
@@ -417,7 +412,6 @@ static int msi_verify_entries(struct pci
 static int msi_capability_init(struct pci_dev *dev, int nvec,
 			       struct irq_affinity *affd)
 {
-	const struct attribute_group **groups;
 	struct msi_desc *entry;
 	int ret;
 
@@ -448,14 +442,6 @@ static int msi_capability_init(struct pc
 	if (ret)
 		goto err;
 
-	groups = msi_populate_sysfs(&dev->dev);
-	if (IS_ERR(groups)) {
-		ret = PTR_ERR(groups);
-		goto err;
-	}
-
-	dev->msi_irq_groups = groups;
-
 	/* Set MSI enabled bits	*/
 	pci_intx_for_msi(dev, 0);
 	pci_msi_set_enable(dev, 1);
@@ -584,7 +570,6 @@ static void msix_mask_all(void __iomem *
 static int msix_capability_init(struct pci_dev *dev, struct msix_entry *entries,
 				int nvec, struct irq_affinity *affd)
 {
-	const struct attribute_group **groups;
 	void __iomem *base;
 	int ret, tsize;
 	u16 control;
@@ -629,14 +614,6 @@ static int msix_capability_init(struct p
 
 	msix_update_entries(dev, entries);
 
-	groups = msi_populate_sysfs(&dev->dev);
-	if (IS_ERR(groups)) {
-		ret = PTR_ERR(groups);
-		goto out_free;
-	}
-
-	dev->msi_irq_groups = groups;
-
 	/* Disable INTX and unmask MSI-X */
 	pci_intx_for_msi(dev, 0);
 	pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0);
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -475,7 +475,6 @@ struct pci_dev {
 #ifdef CONFIG_PCI_MSI
 	void __iomem	*msix_base;
 	raw_spinlock_t	msi_lock;
-	const struct attribute_group **msi_irq_groups;
 #endif
 	struct pci_vpd	vpd;
 #ifdef CONFIG_PCIE_DPC


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 15/35] platform-msi: Let the core code handle sysfs groups
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (13 preceding siblings ...)
  2021-12-10 22:19 ` [patch V3 14/35] PCI/MSI: Let the irq code handle sysfs groups Thomas Gleixner
@ 2021-12-10 22:19 ` Thomas Gleixner
  2021-12-10 22:19 ` [patch V3 16/35] genirq/msi: Remove the original sysfs interfaces Thomas Gleixner
                   ` (20 subsequent siblings)
  35 siblings, 0 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:19 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Juergen Gross, xen-devel,
	Arnd Bergmann, Michael Ellerman, Benjamin Herrenschmidt,
	linuxppc-dev, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, linux-arm-kernel,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

Set the domain info flag and remove the local sysfs code.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
 drivers/base/platform-msi.c |   11 +----------
 1 file changed, 1 insertion(+), 10 deletions(-)

--- a/drivers/base/platform-msi.c
+++ b/drivers/base/platform-msi.c
@@ -23,7 +23,6 @@
 struct platform_msi_priv_data {
 	struct device			*dev;
 	void				*host_data;
-	const struct attribute_group    **msi_irq_groups;
 	msi_alloc_info_t		arg;
 	irq_write_msi_msg_t		write_msg;
 	int				devid;
@@ -191,6 +190,7 @@ struct irq_domain *platform_msi_create_i
 		platform_msi_update_dom_ops(info);
 	if (info->flags & MSI_FLAG_USE_DEF_CHIP_OPS)
 		platform_msi_update_chip_ops(info);
+	info->flags |= MSI_FLAG_DEV_SYSFS;
 
 	domain = msi_create_irq_domain(fwnode, info, parent);
 	if (domain)
@@ -279,16 +279,8 @@ int platform_msi_domain_alloc_irqs(struc
 	if (err)
 		goto out_free_desc;
 
-	priv_data->msi_irq_groups = msi_populate_sysfs(dev);
-	if (IS_ERR(priv_data->msi_irq_groups)) {
-		err = PTR_ERR(priv_data->msi_irq_groups);
-		goto out_free_irqs;
-	}
-
 	return 0;
 
-out_free_irqs:
-	msi_domain_free_irqs(dev->msi.domain, dev);
 out_free_desc:
 	platform_msi_free_descs(dev, 0, nvec);
 out_free_priv_data:
@@ -308,7 +300,6 @@ void platform_msi_domain_free_irqs(struc
 		struct msi_desc *desc;
 
 		desc = first_msi_entry(dev);
-		msi_destroy_sysfs(dev, desc->platform.msi_priv_data->msi_irq_groups);
 		platform_msi_free_priv_data(desc->platform.msi_priv_data);
 	}
 


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 16/35] genirq/msi: Remove the original sysfs interfaces
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (14 preceding siblings ...)
  2021-12-10 22:19 ` [patch V3 15/35] platform-msi: Let the core " Thomas Gleixner
@ 2021-12-10 22:19 ` Thomas Gleixner
  2021-12-10 22:19 ` [patch V3 17/35] platform-msi: Rename functions and clarify comments Thomas Gleixner
                   ` (19 subsequent siblings)
  35 siblings, 0 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:19 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Juergen Gross, xen-devel,
	Arnd Bergmann, Michael Ellerman, Benjamin Herrenschmidt,
	linuxppc-dev, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, linux-arm-kernel,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

No more users. Refactor the core code accordingly and move the global
interface under CONFIG_PCI_MSI_ARCH_FALLBACKS.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
 include/linux/msi.h |   29 +++++++---------------------
 kernel/irq/msi.c    |   53 +++++++++++++++++++---------------------------------
 2 files changed, 28 insertions(+), 54 deletions(-)

--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -246,26 +246,6 @@ void __pci_write_msi_msg(struct msi_desc
 void pci_msi_mask_irq(struct irq_data *data);
 void pci_msi_unmask_irq(struct irq_data *data);
 
-#ifdef CONFIG_SYSFS
-int msi_device_populate_sysfs(struct device *dev);
-void msi_device_destroy_sysfs(struct device *dev);
-
-const struct attribute_group **msi_populate_sysfs(struct device *dev);
-void msi_destroy_sysfs(struct device *dev,
-		       const struct attribute_group **msi_irq_groups);
-#else
-static inline int msi_device_populate_sysfs(struct device *dev) { return 0; }
-static inline void msi_device_destroy_sysfs(struct device *dev) { }
-
-static inline const struct attribute_group **msi_populate_sysfs(struct device *dev)
-{
-	return NULL;
-}
-static inline void msi_destroy_sysfs(struct device *dev, const struct attribute_group **msi_irq_groups)
-{
-}
-#endif
-
 /*
  * The arch hooks to setup up msi irqs. Default functions are implemented
  * as weak symbols so that they /can/ be overriden by architecture specific
@@ -279,7 +259,14 @@ int arch_setup_msi_irq(struct pci_dev *d
 void arch_teardown_msi_irq(unsigned int irq);
 int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
 void arch_teardown_msi_irqs(struct pci_dev *dev);
-#endif
+#ifdef CONFIG_SYSFS
+int msi_device_populate_sysfs(struct device *dev);
+void msi_device_destroy_sysfs(struct device *dev);
+#else /* CONFIG_SYSFS */
+static inline int msi_device_populate_sysfs(struct device *dev) { return 0; }
+static inline void msi_device_destroy_sysfs(struct device *dev) { }
+#endif /* !CONFIG_SYSFS */
+#endif /* CONFIG_PCI_MSI_ARCH_FALLBACKS */
 
 /*
  * The restore hook is still available even for fully irq domain based
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -118,12 +118,8 @@ static ssize_t msi_mode_show(struct devi
 /**
  * msi_populate_sysfs - Populate msi_irqs sysfs entries for devices
  * @dev:	The device(PCI, platform etc) who will get sysfs entries
- *
- * Return attribute_group ** so that specific bus MSI can save it to
- * somewhere during initilizing msi irqs. If devices has no MSI irq,
- * return NULL; if it fails to populate sysfs, return ERR_PTR
  */
-const struct attribute_group **msi_populate_sysfs(struct device *dev)
+static const struct attribute_group **msi_populate_sysfs(struct device *dev)
 {
 	const struct attribute_group **msi_irq_groups;
 	struct attribute **msi_attrs, *msi_attr;
@@ -214,41 +210,32 @@ int msi_device_populate_sysfs(struct dev
 }
 
 /**
- * msi_destroy_sysfs - Destroy msi_irqs sysfs entries for devices
- * @dev:		The device(PCI, platform etc) who will remove sysfs entries
- * @msi_irq_groups:	attribute_group for device msi_irqs entries
- */
-void msi_destroy_sysfs(struct device *dev, const struct attribute_group **msi_irq_groups)
-{
-	struct device_attribute *dev_attr;
-	struct attribute **msi_attrs;
-	int count = 0;
-
-	if (msi_irq_groups) {
-		sysfs_remove_groups(&dev->kobj, msi_irq_groups);
-		msi_attrs = msi_irq_groups[0]->attrs;
-		while (msi_attrs[count]) {
-			dev_attr = container_of(msi_attrs[count],
-					struct device_attribute, attr);
-			kfree(dev_attr->attr.name);
-			kfree(dev_attr);
-			++count;
-		}
-		kfree(msi_attrs);
-		kfree(msi_irq_groups[0]);
-		kfree(msi_irq_groups);
-	}
-}
-
-/**
  * msi_device_destroy_sysfs - Destroy msi_irqs sysfs entries for a device
  * @dev:		The device (PCI, platform etc) for which to remove
  *			sysfs entries
  */
 void msi_device_destroy_sysfs(struct device *dev)
 {
-	msi_destroy_sysfs(dev, dev->msi.data->attrs);
+	const struct attribute_group **msi_irq_groups = dev->msi.data->attrs;
+	struct device_attribute *dev_attr;
+	struct attribute **msi_attrs;
+	int count = 0;
+
 	dev->msi.data->attrs = NULL;
+	if (!msi_irq_groups)
+		return;
+
+	sysfs_remove_groups(&dev->kobj, msi_irq_groups);
+	msi_attrs = msi_irq_groups[0]->attrs;
+	while (msi_attrs[count]) {
+		dev_attr = container_of(msi_attrs[count], struct device_attribute, attr);
+		kfree(dev_attr->attr.name);
+		kfree(dev_attr);
+		++count;
+	}
+	kfree(msi_attrs);
+	kfree(msi_irq_groups[0]);
+	kfree(msi_irq_groups);
 }
 #endif
 


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 17/35] platform-msi: Rename functions and clarify comments
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (15 preceding siblings ...)
  2021-12-10 22:19 ` [patch V3 16/35] genirq/msi: Remove the original sysfs interfaces Thomas Gleixner
@ 2021-12-10 22:19 ` Thomas Gleixner
  2021-12-10 22:19 ` [patch V3 18/35] platform-msi: Store platform private data pointer in msi_device_data Thomas Gleixner
                   ` (18 subsequent siblings)
  35 siblings, 0 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:19 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Juergen Gross, xen-devel,
	Arnd Bergmann, Michael Ellerman, Benjamin Herrenschmidt,
	linuxppc-dev, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, linux-arm-kernel,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

It's hard to distinguish what platform_msi_domain_alloc() and
platform_msi_domain_alloc_irqs() are about. Make the distinction more
explicit and add comments which explain the use cases properly.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
 drivers/base/platform-msi.c     |   36 +++++++++++++++++++++---------------
 drivers/irqchip/irq-mbigen.c    |    4 ++--
 drivers/irqchip/irq-mvebu-icu.c |    6 +++---
 include/linux/msi.h             |    8 ++++----
 4 files changed, 30 insertions(+), 24 deletions(-)

--- a/drivers/base/platform-msi.c
+++ b/drivers/base/platform-msi.c
@@ -313,17 +313,18 @@ EXPORT_SYMBOL_GPL(platform_msi_domain_fr
  *                              a platform-msi domain
  * @domain:	The platform-msi domain
  *
- * Returns the private data provided when calling
- * platform_msi_create_device_domain.
+ * Return: The private data provided when calling
+ * platform_msi_create_device_domain().
  */
 void *platform_msi_get_host_data(struct irq_domain *domain)
 {
 	struct platform_msi_priv_data *data = domain->host_data;
+
 	return data->host_data;
 }
 
 /**
- * __platform_msi_create_device_domain - Create a platform-msi domain
+ * __platform_msi_create_device_domain - Create a platform-msi device domain
  *
  * @dev:		The device generating the MSIs
  * @nvec:		The number of MSIs that need to be allocated
@@ -332,7 +333,11 @@ void *platform_msi_get_host_data(struct
  * @ops:		The hierarchy domain operations to use
  * @host_data:		Private data associated to this domain
  *
- * Returns an irqdomain for @nvec interrupts
+ * Return: An irqdomain for @nvec interrupts on success, NULL in case of error.
+ *
+ * This is for interrupt domains which stack on a platform-msi domain
+ * created by platform_msi_create_irq_domain(). @dev->msi.domain points to
+ * that platform-msi domain which is the parent for the new domain.
  */
 struct irq_domain *
 __platform_msi_create_device_domain(struct device *dev,
@@ -372,18 +377,19 @@ struct irq_domain *
 }
 
 /**
- * platform_msi_domain_free - Free interrupts associated with a platform-msi
- *                            domain
+ * platform_msi_device_domain_free - Free interrupts associated with a platform-msi
+ *				     device domain
  *
- * @domain:	The platform-msi domain
+ * @domain:	The platform-msi device domain
  * @virq:	The base irq from which to perform the free operation
  * @nvec:	How many interrupts to free from @virq
  */
-void platform_msi_domain_free(struct irq_domain *domain, unsigned int virq,
-			      unsigned int nvec)
+void platform_msi_device_domain_free(struct irq_domain *domain, unsigned int virq,
+				     unsigned int nvec)
 {
 	struct platform_msi_priv_data *data = domain->host_data;
 	struct msi_desc *desc, *tmp;
+
 	for_each_msi_entry_safe(desc, tmp, data->dev) {
 		if (WARN_ON(!desc->irq || desc->nvec_used != 1))
 			return;
@@ -397,10 +403,10 @@ void platform_msi_domain_free(struct irq
 }
 
 /**
- * platform_msi_domain_alloc - Allocate interrupts associated with
- *			       a platform-msi domain
+ * platform_msi_device_domain_alloc - Allocate interrupts associated with
+ *				      a platform-msi device domain
  *
- * @domain:	The platform-msi domain
+ * @domain:	The platform-msi device domain
  * @virq:	The base irq from which to perform the allocate operation
  * @nr_irqs:	How many interrupts to free from @virq
  *
@@ -408,8 +414,8 @@ void platform_msi_domain_free(struct irq
  * with irq_domain_mutex held (which can only be done as part of a
  * top-level interrupt allocation).
  */
-int platform_msi_domain_alloc(struct irq_domain *domain, unsigned int virq,
-			      unsigned int nr_irqs)
+int platform_msi_device_domain_alloc(struct irq_domain *domain, unsigned int virq,
+				     unsigned int nr_irqs)
 {
 	struct platform_msi_priv_data *data = domain->host_data;
 	int err;
@@ -421,7 +427,7 @@ int platform_msi_domain_alloc(struct irq
 	err = msi_domain_populate_irqs(domain->parent, data->dev,
 				       virq, nr_irqs, &data->arg);
 	if (err)
-		platform_msi_domain_free(domain, virq, nr_irqs);
+		platform_msi_device_domain_free(domain, virq, nr_irqs);
 
 	return err;
 }
--- a/drivers/irqchip/irq-mbigen.c
+++ b/drivers/irqchip/irq-mbigen.c
@@ -207,7 +207,7 @@ static int mbigen_irq_domain_alloc(struc
 	if (err)
 		return err;
 
-	err = platform_msi_domain_alloc(domain, virq, nr_irqs);
+	err = platform_msi_device_domain_alloc(domain, virq, nr_irqs);
 	if (err)
 		return err;
 
@@ -223,7 +223,7 @@ static int mbigen_irq_domain_alloc(struc
 static void mbigen_irq_domain_free(struct irq_domain *domain, unsigned int virq,
 				   unsigned int nr_irqs)
 {
-	platform_msi_domain_free(domain, virq, nr_irqs);
+	platform_msi_device_domain_free(domain, virq, nr_irqs);
 }
 
 static const struct irq_domain_ops mbigen_domain_ops = {
--- a/drivers/irqchip/irq-mvebu-icu.c
+++ b/drivers/irqchip/irq-mvebu-icu.c
@@ -221,7 +221,7 @@ mvebu_icu_irq_domain_alloc(struct irq_do
 		icu_irqd->icu_group = msi_data->subset_data->icu_group;
 	icu_irqd->icu = icu;
 
-	err = platform_msi_domain_alloc(domain, virq, nr_irqs);
+	err = platform_msi_device_domain_alloc(domain, virq, nr_irqs);
 	if (err) {
 		dev_err(icu->dev, "failed to allocate ICU interrupt in parent domain\n");
 		goto free_irqd;
@@ -245,7 +245,7 @@ mvebu_icu_irq_domain_alloc(struct irq_do
 	return 0;
 
 free_msi:
-	platform_msi_domain_free(domain, virq, nr_irqs);
+	platform_msi_device_domain_free(domain, virq, nr_irqs);
 free_irqd:
 	kfree(icu_irqd);
 	return err;
@@ -260,7 +260,7 @@ mvebu_icu_irq_domain_free(struct irq_dom
 
 	kfree(icu_irqd);
 
-	platform_msi_domain_free(domain, virq, nr_irqs);
+	platform_msi_device_domain_free(domain, virq, nr_irqs);
 }
 
 static const struct irq_domain_ops mvebu_icu_domain_ops = {
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -434,10 +434,10 @@ struct irq_domain *
 #define platform_msi_create_device_tree_domain(dev, nvec, write, ops, data) \
 	__platform_msi_create_device_domain(dev, nvec, true, write, ops, data)
 
-int platform_msi_domain_alloc(struct irq_domain *domain, unsigned int virq,
-			      unsigned int nr_irqs);
-void platform_msi_domain_free(struct irq_domain *domain, unsigned int virq,
-			      unsigned int nvec);
+int platform_msi_device_domain_alloc(struct irq_domain *domain, unsigned int virq,
+				     unsigned int nr_irqs);
+void platform_msi_device_domain_free(struct irq_domain *domain, unsigned int virq,
+				     unsigned int nvec);
 void *platform_msi_get_host_data(struct irq_domain *domain);
 #endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */
 


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 18/35] platform-msi: Store platform private data pointer in msi_device_data
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (16 preceding siblings ...)
  2021-12-10 22:19 ` [patch V3 17/35] platform-msi: Rename functions and clarify comments Thomas Gleixner
@ 2021-12-10 22:19 ` Thomas Gleixner
  2021-12-10 22:19 ` [patch V3 19/35] genirq/msi: Consolidate MSI descriptor data Thomas Gleixner
                   ` (17 subsequent siblings)
  35 siblings, 0 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:19 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Juergen Gross, xen-devel,
	Arnd Bergmann, Michael Ellerman, Benjamin Herrenschmidt,
	linuxppc-dev, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, linux-arm-kernel,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

Storing the platform private data in a MSI descriptor is sloppy at
best. The data belongs to the device and not to the descriptor.
Add a pointer to struct msi_device_data and store the pointer there.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
 drivers/base/platform-msi.c |   79 +++++++++++++++++---------------------------
 include/linux/msi.h         |    4 +-
 2 files changed, 34 insertions(+), 49 deletions(-)

--- a/drivers/base/platform-msi.c
+++ b/drivers/base/platform-msi.c
@@ -38,9 +38,7 @@ static DEFINE_IDA(platform_msi_devid_ida
  */
 static irq_hw_number_t platform_msi_calc_hwirq(struct msi_desc *desc)
 {
-	u32 devid;
-
-	devid = desc->platform.msi_priv_data->devid;
+	u32 devid = desc->dev->msi.data->platform_data->devid;
 
 	return (devid << (32 - DEV_ID_SHIFT)) | desc->platform.msi_index;
 }
@@ -85,11 +83,8 @@ static void platform_msi_update_dom_ops(
 static void platform_msi_write_msg(struct irq_data *data, struct msi_msg *msg)
 {
 	struct msi_desc *desc = irq_data_get_msi_desc(data);
-	struct platform_msi_priv_data *priv_data;
-
-	priv_data = desc->platform.msi_priv_data;
 
-	priv_data->write_msg(desc, msg);
+	desc->dev->msi.data->platform_data->write_msg(desc, msg);
 }
 
 static void platform_msi_update_chip_ops(struct msi_domain_info *info)
@@ -126,9 +121,7 @@ static void platform_msi_free_descs(stru
 }
 
 static int platform_msi_alloc_descs_with_irq(struct device *dev, int virq,
-					     int nvec,
-					     struct platform_msi_priv_data *data)
-
+					     int nvec)
 {
 	struct msi_desc *desc;
 	int i, base = 0;
@@ -144,7 +137,6 @@ static int platform_msi_alloc_descs_with
 		if (!desc)
 			break;
 
-		desc->platform.msi_priv_data = data;
 		desc->platform.msi_index = base + i;
 		desc->irq = virq ? virq + i : 0;
 
@@ -161,11 +153,9 @@ static int platform_msi_alloc_descs_with
 	return 0;
 }
 
-static int platform_msi_alloc_descs(struct device *dev, int nvec,
-				    struct platform_msi_priv_data *data)
-
+static int platform_msi_alloc_descs(struct device *dev, int nvec)
 {
-	return platform_msi_alloc_descs_with_irq(dev, 0, nvec, data);
+	return platform_msi_alloc_descs_with_irq(dev, 0, nvec);
 }
 
 /**
@@ -199,9 +189,8 @@ struct irq_domain *platform_msi_create_i
 	return domain;
 }
 
-static struct platform_msi_priv_data *
-platform_msi_alloc_priv_data(struct device *dev, unsigned int nvec,
-			     irq_write_msi_msg_t write_msi_msg)
+static int platform_msi_alloc_priv_data(struct device *dev, unsigned int nvec,
+					irq_write_msi_msg_t write_msi_msg)
 {
 	struct platform_msi_priv_data *datap;
 	int err;
@@ -213,41 +202,44 @@ platform_msi_alloc_priv_data(struct devi
 	 * capable devices).
 	 */
 	if (!dev->msi.domain || !write_msi_msg || !nvec || nvec > MAX_DEV_MSIS)
-		return ERR_PTR(-EINVAL);
+		return -EINVAL;
 
 	if (dev->msi.domain->bus_token != DOMAIN_BUS_PLATFORM_MSI) {
 		dev_err(dev, "Incompatible msi_domain, giving up\n");
-		return ERR_PTR(-EINVAL);
+		return -EINVAL;
 	}
 
 	err = msi_setup_device_data(dev);
 	if (err)
-		return ERR_PTR(err);
+		return err;
 
-	/* Already had a helping of MSI? Greed... */
-	if (!list_empty(dev_to_msi_list(dev)))
-		return ERR_PTR(-EBUSY);
+	/* Already initialized? */
+	if (dev->msi.data->platform_data)
+		return -EBUSY;
 
 	datap = kzalloc(sizeof(*datap), GFP_KERNEL);
 	if (!datap)
-		return ERR_PTR(-ENOMEM);
+		return -ENOMEM;
 
 	datap->devid = ida_simple_get(&platform_msi_devid_ida,
 				      0, 1 << DEV_ID_SHIFT, GFP_KERNEL);
 	if (datap->devid < 0) {
 		err = datap->devid;
 		kfree(datap);
-		return ERR_PTR(err);
+		return err;
 	}
 
 	datap->write_msg = write_msi_msg;
 	datap->dev = dev;
-
-	return datap;
+	dev->msi.data->platform_data = datap;
+	return 0;
 }
 
-static void platform_msi_free_priv_data(struct platform_msi_priv_data *data)
+static void platform_msi_free_priv_data(struct device *dev)
 {
+	struct platform_msi_priv_data *data = dev->msi.data->platform_data;
+
+	dev->msi.data->platform_data = NULL;
 	ida_simple_remove(&platform_msi_devid_ida, data->devid);
 	kfree(data);
 }
@@ -264,14 +256,13 @@ static void platform_msi_free_priv_data(
 int platform_msi_domain_alloc_irqs(struct device *dev, unsigned int nvec,
 				   irq_write_msi_msg_t write_msi_msg)
 {
-	struct platform_msi_priv_data *priv_data;
 	int err;
 
-	priv_data = platform_msi_alloc_priv_data(dev, nvec, write_msi_msg);
-	if (IS_ERR(priv_data))
-		return PTR_ERR(priv_data);
+	err = platform_msi_alloc_priv_data(dev, nvec, write_msi_msg);
+	if (err)
+		return err;
 
-	err = platform_msi_alloc_descs(dev, nvec, priv_data);
+	err = platform_msi_alloc_descs(dev, nvec);
 	if (err)
 		goto out_free_priv_data;
 
@@ -284,8 +275,7 @@ int platform_msi_domain_alloc_irqs(struc
 out_free_desc:
 	platform_msi_free_descs(dev, 0, nvec);
 out_free_priv_data:
-	platform_msi_free_priv_data(priv_data);
-
+	platform_msi_free_priv_data(dev);
 	return err;
 }
 EXPORT_SYMBOL_GPL(platform_msi_domain_alloc_irqs);
@@ -296,15 +286,9 @@ EXPORT_SYMBOL_GPL(platform_msi_domain_al
  */
 void platform_msi_domain_free_irqs(struct device *dev)
 {
-	if (!list_empty(dev_to_msi_list(dev))) {
-		struct msi_desc *desc;
-
-		desc = first_msi_entry(dev);
-		platform_msi_free_priv_data(desc->platform.msi_priv_data);
-	}
-
 	msi_domain_free_irqs(dev->msi.domain, dev);
 	platform_msi_free_descs(dev, 0, MAX_DEV_MSIS);
+	platform_msi_free_priv_data(dev);
 }
 EXPORT_SYMBOL_GPL(platform_msi_domain_free_irqs);
 
@@ -351,10 +335,11 @@ struct irq_domain *
 	struct irq_domain *domain;
 	int err;
 
-	data = platform_msi_alloc_priv_data(dev, nvec, write_msi_msg);
-	if (IS_ERR(data))
+	err = platform_msi_alloc_priv_data(dev, nvec, write_msi_msg);
+	if (err)
 		return NULL;
 
+	data = dev->msi.data->platform_data;
 	data->host_data = host_data;
 	domain = irq_domain_create_hierarchy(dev->msi.domain, 0,
 					     is_tree ? 0 : nvec,
@@ -372,7 +357,7 @@ struct irq_domain *
 free_domain:
 	irq_domain_remove(domain);
 free_priv:
-	platform_msi_free_priv_data(data);
+	platform_msi_free_priv_data(dev);
 	return NULL;
 }
 
@@ -420,7 +405,7 @@ int platform_msi_device_domain_alloc(str
 	struct platform_msi_priv_data *data = domain->host_data;
 	int err;
 
-	err = platform_msi_alloc_descs_with_irq(data->dev, virq, nr_irqs, data);
+	err = platform_msi_alloc_descs_with_irq(data->dev, virq, nr_irqs);
 	if (err)
 		return err;
 
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -108,11 +108,9 @@ struct pci_msi_desc {
 
 /**
  * platform_msi_desc - Platform device specific msi descriptor data
- * @msi_priv_data:	Pointer to platform private data
  * @msi_index:		The index of the MSI descriptor for multi MSI
  */
 struct platform_msi_desc {
-	struct platform_msi_priv_data	*msi_priv_data;
 	u16				msi_index;
 };
 
@@ -177,10 +175,12 @@ struct msi_desc {
  * msi_device_data - MSI per device data
  * @properties:		MSI properties which are interesting to drivers
  * @attrs:		Pointer to the sysfs attribute group
+ * @platform_data:	Platform-MSI specific data
  */
 struct msi_device_data {
 	unsigned long			properties;
 	const struct attribute_group    **attrs;
+	struct platform_msi_priv_data	*platform_data;
 };
 
 int msi_setup_device_data(struct device *dev);


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 19/35] genirq/msi: Consolidate MSI descriptor data
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (17 preceding siblings ...)
  2021-12-10 22:19 ` [patch V3 18/35] platform-msi: Store platform private data pointer in msi_device_data Thomas Gleixner
@ 2021-12-10 22:19 ` Thomas Gleixner
  2021-12-10 22:19 ` [patch V3 20/35] platform-msi: Use msi_desc::msi_index Thomas Gleixner
                   ` (16 subsequent siblings)
  35 siblings, 0 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:19 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Juergen Gross, xen-devel,
	Arnd Bergmann, Michael Ellerman, Benjamin Herrenschmidt,
	linuxppc-dev, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, linux-arm-kernel,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

All non PCI/MSI usage variants have data structures in struct msi_desc with
only one member: xxx_index. PCI/MSI has a entry_nr member.

Add a common msi_index member to struct msi_desc so all implementations can
share it which allows further consolidation.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
 include/linux/msi.h |    2 ++
 1 file changed, 2 insertions(+)

--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -143,6 +143,7 @@ struct ti_sci_inta_msi_desc {
  *			address or data changes
  * @write_msi_msg_data:	Data parameter for the callback.
  *
+ * @msi_index:	Index of the msi descriptor
  * @pci:	[PCI]	    PCI speficic msi descriptor data
  * @platform:	[platform]  Platform device specific msi descriptor data
  * @fsl_mc:	[fsl-mc]    FSL MC device specific msi descriptor data
@@ -163,6 +164,7 @@ struct msi_desc {
 	void (*write_msi_msg)(struct msi_desc *entry, void *data);
 	void *write_msi_msg_data;
 
+	u16				msi_index;
 	union {
 		struct pci_msi_desc		pci;
 		struct platform_msi_desc	platform;


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 20/35] platform-msi: Use msi_desc::msi_index
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (18 preceding siblings ...)
  2021-12-10 22:19 ` [patch V3 19/35] genirq/msi: Consolidate MSI descriptor data Thomas Gleixner
@ 2021-12-10 22:19 ` Thomas Gleixner
  2021-12-10 22:19 ` [patch V3 21/35] bus: fsl-mc-msi: " Thomas Gleixner
                   ` (15 subsequent siblings)
  35 siblings, 0 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:19 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Juergen Gross, xen-devel,
	Arnd Bergmann, Michael Ellerman, Benjamin Herrenschmidt,
	linuxppc-dev, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, linux-arm-kernel,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

Use the common msi_index member and get rid of the pointless wrapper struct.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
 drivers/base/platform-msi.c                 |   10 +++++-----
 drivers/dma/qcom/hidma.c                    |    4 ++--
 drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c |    4 ++--
 drivers/mailbox/bcm-flexrm-mailbox.c        |    4 ++--
 include/linux/msi.h                         |   10 ----------
 5 files changed, 11 insertions(+), 21 deletions(-)

--- a/drivers/base/platform-msi.c
+++ b/drivers/base/platform-msi.c
@@ -40,7 +40,7 @@ static irq_hw_number_t platform_msi_calc
 {
 	u32 devid = desc->dev->msi.data->platform_data->devid;
 
-	return (devid << (32 - DEV_ID_SHIFT)) | desc->platform.msi_index;
+	return (devid << (32 - DEV_ID_SHIFT)) | desc->msi_index;
 }
 
 static void platform_msi_set_desc(msi_alloc_info_t *arg, struct msi_desc *desc)
@@ -112,8 +112,8 @@ static void platform_msi_free_descs(stru
 	struct msi_desc *desc, *tmp;
 
 	list_for_each_entry_safe(desc, tmp, dev_to_msi_list(dev), list) {
-		if (desc->platform.msi_index >= base &&
-		    desc->platform.msi_index < (base + nvec)) {
+		if (desc->msi_index >= base &&
+		    desc->msi_index < (base + nvec)) {
 			list_del(&desc->list);
 			free_msi_entry(desc);
 		}
@@ -129,7 +129,7 @@ static int platform_msi_alloc_descs_with
 	if (!list_empty(dev_to_msi_list(dev))) {
 		desc = list_last_entry(dev_to_msi_list(dev),
 				       struct msi_desc, list);
-		base = desc->platform.msi_index + 1;
+		base = desc->msi_index + 1;
 	}
 
 	for (i = 0; i < nvec; i++) {
@@ -137,7 +137,7 @@ static int platform_msi_alloc_descs_with
 		if (!desc)
 			break;
 
-		desc->platform.msi_index = base + i;
+		desc->msi_index = base + i;
 		desc->irq = virq ? virq + i : 0;
 
 		list_add_tail(&desc->list, dev_to_msi_list(dev));
--- a/drivers/dma/qcom/hidma.c
+++ b/drivers/dma/qcom/hidma.c
@@ -666,7 +666,7 @@ static void hidma_write_msi_msg(struct m
 	struct device *dev = msi_desc_to_dev(desc);
 	struct hidma_dev *dmadev = dev_get_drvdata(dev);
 
-	if (!desc->platform.msi_index) {
+	if (!desc->msi_index) {
 		writel(msg->address_lo, dmadev->dev_evca + 0x118);
 		writel(msg->address_hi, dmadev->dev_evca + 0x11C);
 		writel(msg->data, dmadev->dev_evca + 0x120);
@@ -702,7 +702,7 @@ static int hidma_request_msi(struct hidm
 		return rc;
 
 	for_each_msi_entry(desc, &pdev->dev) {
-		if (!desc->platform.msi_index)
+		if (!desc->msi_index)
 			dmadev->msi_virqbase = desc->irq;
 
 		rc = devm_request_irq(&pdev->dev, desc->irq,
--- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
+++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
@@ -3142,7 +3142,7 @@ static void arm_smmu_write_msi_msg(struc
 	phys_addr_t doorbell;
 	struct device *dev = msi_desc_to_dev(desc);
 	struct arm_smmu_device *smmu = dev_get_drvdata(dev);
-	phys_addr_t *cfg = arm_smmu_msi_cfg[desc->platform.msi_index];
+	phys_addr_t *cfg = arm_smmu_msi_cfg[desc->msi_index];
 
 	doorbell = (((u64)msg->address_hi) << 32) | msg->address_lo;
 	doorbell &= MSI_CFG0_ADDR_MASK;
@@ -3183,7 +3183,7 @@ static void arm_smmu_setup_msis(struct a
 	}
 
 	for_each_msi_entry(desc, dev) {
-		switch (desc->platform.msi_index) {
+		switch (desc->msi_index) {
 		case EVTQ_MSI_INDEX:
 			smmu->evtq.q.irq = desc->irq;
 			break;
--- a/drivers/mailbox/bcm-flexrm-mailbox.c
+++ b/drivers/mailbox/bcm-flexrm-mailbox.c
@@ -1484,7 +1484,7 @@ static void flexrm_mbox_msi_write(struct
 {
 	struct device *dev = msi_desc_to_dev(desc);
 	struct flexrm_mbox *mbox = dev_get_drvdata(dev);
-	struct flexrm_ring *ring = &mbox->rings[desc->platform.msi_index];
+	struct flexrm_ring *ring = &mbox->rings[desc->msi_index];
 
 	/* Configure per-Ring MSI registers */
 	writel_relaxed(msg->address_lo, ring->regs + RING_MSI_ADDR_LS);
@@ -1609,7 +1609,7 @@ static int flexrm_mbox_probe(struct plat
 
 	/* Save alloced IRQ numbers for each ring */
 	for_each_msi_entry(desc, dev) {
-		ring = &mbox->rings[desc->platform.msi_index];
+		ring = &mbox->rings[desc->msi_index];
 		ring->irq = desc->irq;
 	}
 
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -107,14 +107,6 @@ struct pci_msi_desc {
 };
 
 /**
- * platform_msi_desc - Platform device specific msi descriptor data
- * @msi_index:		The index of the MSI descriptor for multi MSI
- */
-struct platform_msi_desc {
-	u16				msi_index;
-};
-
-/**
  * fsl_mc_msi_desc - FSL-MC device specific msi descriptor data
  * @msi_index:		The index of the MSI descriptor
  */
@@ -145,7 +137,6 @@ struct ti_sci_inta_msi_desc {
  *
  * @msi_index:	Index of the msi descriptor
  * @pci:	[PCI]	    PCI speficic msi descriptor data
- * @platform:	[platform]  Platform device specific msi descriptor data
  * @fsl_mc:	[fsl-mc]    FSL MC device specific msi descriptor data
  * @inta:	[INTA]	    TISCI based INTA specific msi descriptor data
  */
@@ -167,7 +158,6 @@ struct msi_desc {
 	u16				msi_index;
 	union {
 		struct pci_msi_desc		pci;
-		struct platform_msi_desc	platform;
 		struct fsl_mc_msi_desc		fsl_mc;
 		struct ti_sci_inta_msi_desc	inta;
 	};


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 21/35] bus: fsl-mc-msi: Use msi_desc::msi_index
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (19 preceding siblings ...)
  2021-12-10 22:19 ` [patch V3 20/35] platform-msi: Use msi_desc::msi_index Thomas Gleixner
@ 2021-12-10 22:19 ` Thomas Gleixner
  2021-12-10 22:19 ` [patch V3 22/35] soc: ti: ti_sci_inta_msi: " Thomas Gleixner
                   ` (14 subsequent siblings)
  35 siblings, 0 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:19 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Stuart Yoder,
	Laurentiu Tudor, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Bjorn Helgaas, Nishanth Menon, Tero Kristo, Santosh Shilimkar,
	linux-arm-kernel, Vinod Koul, dmaengine, Mark Rutland,
	Will Deacon, Robin Murphy, Joerg Roedel, iommu, Jassi Brar,
	Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

Use the common msi_index member and get rid of the pointless wrapper struct.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Cc: Stuart Yoder <stuyoder@gmail.com>
Cc: Laurentiu Tudor <laurentiu.tudor@nxp.com>
---
 drivers/bus/fsl-mc/fsl-mc-allocator.c |    2 +-
 drivers/bus/fsl-mc/fsl-mc-msi.c       |    6 +++---
 include/linux/msi.h                   |   10 ----------
 3 files changed, 4 insertions(+), 14 deletions(-)

--- a/drivers/bus/fsl-mc/fsl-mc-allocator.c
+++ b/drivers/bus/fsl-mc/fsl-mc-allocator.c
@@ -393,7 +393,7 @@ int fsl_mc_populate_irq_pool(struct fsl_
 	}
 
 	for_each_msi_entry(msi_desc, &mc_bus_dev->dev) {
-		mc_dev_irq = &irq_resources[msi_desc->fsl_mc.msi_index];
+		mc_dev_irq = &irq_resources[msi_desc->msi_index];
 		mc_dev_irq->msi_desc = msi_desc;
 		mc_dev_irq->resource.id = msi_desc->irq;
 	}
--- a/drivers/bus/fsl-mc/fsl-mc-msi.c
+++ b/drivers/bus/fsl-mc/fsl-mc-msi.c
@@ -29,7 +29,7 @@ static irq_hw_number_t fsl_mc_domain_cal
 	 * Make the base hwirq value for ICID*10000 so it is readable
 	 * as a decimal value in /proc/interrupts.
 	 */
-	return (irq_hw_number_t)(desc->fsl_mc.msi_index + (dev->icid * 10000));
+	return (irq_hw_number_t)(desc->msi_index + (dev->icid * 10000));
 }
 
 static void fsl_mc_msi_set_desc(msi_alloc_info_t *arg,
@@ -122,7 +122,7 @@ static void fsl_mc_msi_write_msg(struct
 	struct fsl_mc_device *mc_bus_dev = to_fsl_mc_device(msi_desc->dev);
 	struct fsl_mc_bus *mc_bus = to_fsl_mc_bus(mc_bus_dev);
 	struct fsl_mc_device_irq *mc_dev_irq =
-		&mc_bus->irq_resources[msi_desc->fsl_mc.msi_index];
+		&mc_bus->irq_resources[msi_desc->msi_index];
 
 	msi_desc->msg = *msg;
 
@@ -235,7 +235,7 @@ static int fsl_mc_msi_alloc_descs(struct
 			goto cleanup_msi_descs;
 		}
 
-		msi_desc->fsl_mc.msi_index = i;
+		msi_desc->msi_index = i;
 		INIT_LIST_HEAD(&msi_desc->list);
 		list_add_tail(&msi_desc->list, dev_to_msi_list(dev));
 	}
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -107,14 +107,6 @@ struct pci_msi_desc {
 };
 
 /**
- * fsl_mc_msi_desc - FSL-MC device specific msi descriptor data
- * @msi_index:		The index of the MSI descriptor
- */
-struct fsl_mc_msi_desc {
-	u16				msi_index;
-};
-
-/**
  * ti_sci_inta_msi_desc - TISCI based INTA specific msi descriptor data
  * @dev_index: TISCI device index
  */
@@ -137,7 +129,6 @@ struct ti_sci_inta_msi_desc {
  *
  * @msi_index:	Index of the msi descriptor
  * @pci:	[PCI]	    PCI speficic msi descriptor data
- * @fsl_mc:	[fsl-mc]    FSL MC device specific msi descriptor data
  * @inta:	[INTA]	    TISCI based INTA specific msi descriptor data
  */
 struct msi_desc {
@@ -158,7 +149,6 @@ struct msi_desc {
 	u16				msi_index;
 	union {
 		struct pci_msi_desc		pci;
-		struct fsl_mc_msi_desc		fsl_mc;
 		struct ti_sci_inta_msi_desc	inta;
 	};
 };


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 22/35] soc: ti: ti_sci_inta_msi: Use msi_desc::msi_index
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (20 preceding siblings ...)
  2021-12-10 22:19 ` [patch V3 21/35] bus: fsl-mc-msi: " Thomas Gleixner
@ 2021-12-10 22:19 ` Thomas Gleixner
  2021-12-13 17:57   ` Nishanth Menon
  2021-12-10 22:19 ` [patch V3 23/35] PCI/MSI: " Thomas Gleixner
                   ` (13 subsequent siblings)
  35 siblings, 1 reply; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:19 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Nishanth Menon,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Juergen Gross,
	xen-devel, Arnd Bergmann, Michael Ellerman,
	Benjamin Herrenschmidt, linuxppc-dev, Bjorn Helgaas,
	Stuart Yoder, Laurentiu Tudor, Vinod Koul, dmaengine,
	Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel, iommu,
	Jassi Brar, Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

Use the common msi_index member and get rid of the pointless wrapper struct.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Cc: Nishanth Menon <nm@ti.com>
Cc: Tero Kristo <kristo@kernel.org>
Cc: Santosh Shilimkar <ssantosh@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-arm-kernel@lists.infradead.org
---
 drivers/irqchip/irq-ti-sci-inta.c |    2 +-
 drivers/soc/ti/ti_sci_inta_msi.c  |    6 +++---
 include/linux/msi.h               |   16 ++--------------
 3 files changed, 6 insertions(+), 18 deletions(-)

--- a/drivers/irqchip/irq-ti-sci-inta.c
+++ b/drivers/irqchip/irq-ti-sci-inta.c
@@ -595,7 +595,7 @@ static void ti_sci_inta_msi_set_desc(msi
 	struct platform_device *pdev = to_platform_device(desc->dev);
 
 	arg->desc = desc;
-	arg->hwirq = TO_HWIRQ(pdev->id, desc->inta.dev_index);
+	arg->hwirq = TO_HWIRQ(pdev->id, desc->msi_index);
 }
 
 static struct msi_domain_ops ti_sci_inta_msi_ops = {
--- a/drivers/soc/ti/ti_sci_inta_msi.c
+++ b/drivers/soc/ti/ti_sci_inta_msi.c
@@ -84,7 +84,7 @@ static int ti_sci_inta_msi_alloc_descs(s
 				return -ENOMEM;
 			}
 
-			msi_desc->inta.dev_index = res->desc[set].start + i;
+			msi_desc->msi_index = res->desc[set].start + i;
 			INIT_LIST_HEAD(&msi_desc->list);
 			list_add_tail(&msi_desc->list, dev_to_msi_list(dev));
 			count++;
@@ -96,7 +96,7 @@ static int ti_sci_inta_msi_alloc_descs(s
 				return -ENOMEM;
 			}
 
-			msi_desc->inta.dev_index = res->desc[set].start_sec + i;
+			msi_desc->msi_index = res->desc[set].start_sec + i;
 			INIT_LIST_HEAD(&msi_desc->list);
 			list_add_tail(&msi_desc->list, dev_to_msi_list(dev));
 			count++;
@@ -154,7 +154,7 @@ unsigned int ti_sci_inta_msi_get_virq(st
 	struct msi_desc *desc;
 
 	for_each_msi_entry(desc, dev)
-		if (desc->inta.dev_index == dev_index)
+		if (desc->msi_index == dev_index)
 			return desc->irq;
 
 	return -ENODEV;
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -107,14 +107,6 @@ struct pci_msi_desc {
 };
 
 /**
- * ti_sci_inta_msi_desc - TISCI based INTA specific msi descriptor data
- * @dev_index: TISCI device index
- */
-struct ti_sci_inta_msi_desc {
-	u16	dev_index;
-};
-
-/**
  * struct msi_desc - Descriptor structure for MSI based interrupts
  * @list:	List head for management
  * @irq:	The base interrupt number
@@ -128,8 +120,7 @@ struct ti_sci_inta_msi_desc {
  * @write_msi_msg_data:	Data parameter for the callback.
  *
  * @msi_index:	Index of the msi descriptor
- * @pci:	[PCI]	    PCI speficic msi descriptor data
- * @inta:	[INTA]	    TISCI based INTA specific msi descriptor data
+ * @pci:	PCI specific msi descriptor data
  */
 struct msi_desc {
 	/* Shared device/bus type independent data */
@@ -147,10 +138,7 @@ struct msi_desc {
 	void *write_msi_msg_data;
 
 	u16				msi_index;
-	union {
-		struct pci_msi_desc		pci;
-		struct ti_sci_inta_msi_desc	inta;
-	};
+	struct pci_msi_desc		pci;
 };
 
 /**


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 23/35] PCI/MSI: Use msi_desc::msi_index
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (21 preceding siblings ...)
  2021-12-10 22:19 ` [patch V3 22/35] soc: ti: ti_sci_inta_msi: " Thomas Gleixner
@ 2021-12-10 22:19 ` Thomas Gleixner
  2021-12-10 22:19 ` [patch V3 24/35] PCI/MSI: Provide MSI_FLAG_MSIX_CONTIGUOUS Thomas Gleixner
                   ` (12 subsequent siblings)
  35 siblings, 0 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:19 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Bjorn Helgaas,
	Juergen Gross, xen-devel, Arnd Bergmann, Michael Ellerman,
	Benjamin Herrenschmidt, linuxppc-dev, Stuart Yoder,
	Laurentiu Tudor, Nishanth Menon, Tero Kristo, Santosh Shilimkar,
	linux-arm-kernel, Vinod Koul, dmaengine, Mark Rutland,
	Will Deacon, Robin Murphy, Joerg Roedel, iommu, Jassi Brar,
	Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

The usage of msi_desc::pci::entry_nr is confusing at best. It's the index
into the MSI[X] descriptor table.

Use msi_desc::msi_index which is shared between all MSI incarnations
instead of having a PCI specific storage for no value.

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>

---
 arch/powerpc/platforms/pseries/msi.c |    4 ++--
 arch/x86/pci/xen.c                   |    2 +-
 drivers/pci/msi/irqdomain.c          |    2 +-
 drivers/pci/msi/msi.c                |   20 ++++++++------------
 drivers/pci/xen-pcifront.c           |    2 +-
 include/linux/msi.h                  |    2 --
 6 files changed, 13 insertions(+), 19 deletions(-)

--- a/arch/powerpc/platforms/pseries/msi.c
+++ b/arch/powerpc/platforms/pseries/msi.c
@@ -332,7 +332,7 @@ static int check_msix_entries(struct pci
 
 	expected = 0;
 	for_each_pci_msi_entry(entry, pdev) {
-		if (entry->pci.msi_attrib.entry_nr != expected) {
+		if (entry->msi_index != expected) {
 			pr_debug("rtas_msi: bad MSI-X entries.\n");
 			return -EINVAL;
 		}
@@ -579,7 +579,7 @@ static int pseries_irq_domain_alloc(stru
 	int hwirq;
 	int i, ret;
 
-	hwirq = rtas_query_irq_number(pci_get_pdn(pdev), desc->pci.msi_attrib.entry_nr);
+	hwirq = rtas_query_irq_number(pci_get_pdn(pdev), desc->msi_index);
 	if (hwirq < 0) {
 		dev_err(&pdev->dev, "Failed to query HW IRQ: %d\n", hwirq);
 		return hwirq;
--- a/arch/x86/pci/xen.c
+++ b/arch/x86/pci/xen.c
@@ -306,7 +306,7 @@ static int xen_initdom_setup_msi_irqs(st
 				return -EINVAL;
 
 			map_irq.table_base = pci_resource_start(dev, bir);
-			map_irq.entry_nr = msidesc->pci.msi_attrib.entry_nr;
+			map_irq.entry_nr = msidesc->msi_index;
 		}
 
 		ret = -EINVAL;
--- a/drivers/pci/msi/irqdomain.c
+++ b/drivers/pci/msi/irqdomain.c
@@ -57,7 +57,7 @@ static irq_hw_number_t pci_msi_domain_ca
 {
 	struct pci_dev *dev = msi_desc_to_pci_dev(desc);
 
-	return (irq_hw_number_t)desc->pci.msi_attrib.entry_nr |
+	return (irq_hw_number_t)desc->msi_index |
 		pci_dev_id(dev) << 11 |
 		(pci_domain_nr(dev->bus) & 0xFFFFFFFF) << 27;
 }
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -44,7 +44,7 @@ static inline void pci_msi_unmask(struct
 
 static inline void __iomem *pci_msix_desc_addr(struct msi_desc *desc)
 {
-	return desc->pci.mask_base + desc->pci.msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE;
+	return desc->pci.mask_base + desc->msi_index * PCI_MSIX_ENTRY_SIZE;
 }
 
 /*
@@ -356,13 +356,10 @@ msi_setup_entry(struct pci_dev *dev, int
 	if (dev->dev_flags & PCI_DEV_FLAGS_HAS_MSI_MASKING)
 		control |= PCI_MSI_FLAGS_MASKBIT;
 
-	entry->pci.msi_attrib.is_msix	= 0;
-	entry->pci.msi_attrib.is_64		= !!(control & PCI_MSI_FLAGS_64BIT);
-	entry->pci.msi_attrib.is_virtual    = 0;
-	entry->pci.msi_attrib.entry_nr	= 0;
+	entry->pci.msi_attrib.is_64	= !!(control & PCI_MSI_FLAGS_64BIT);
 	entry->pci.msi_attrib.can_mask	= !pci_msi_ignore_mask &&
 					  !!(control & PCI_MSI_FLAGS_MASKBIT);
-	entry->pci.msi_attrib.default_irq	= dev->irq;	/* Save IOAPIC IRQ */
+	entry->pci.msi_attrib.default_irq = dev->irq;
 	entry->pci.msi_attrib.multi_cap	= (control & PCI_MSI_FLAGS_QMASK) >> 1;
 	entry->pci.msi_attrib.multiple	= ilog2(__roundup_pow_of_two(nvec));
 
@@ -504,12 +501,11 @@ static int msix_setup_entries(struct pci
 		entry->pci.msi_attrib.is_64	= 1;
 
 		if (entries)
-			entry->pci.msi_attrib.entry_nr = entries[i].entry;
+			entry->msi_index = entries[i].entry;
 		else
-			entry->pci.msi_attrib.entry_nr = i;
+			entry->msi_index = i;
 
-		entry->pci.msi_attrib.is_virtual =
-			entry->pci.msi_attrib.entry_nr >= vec_count;
+		entry->pci.msi_attrib.is_virtual = entry->msi_index >= vec_count;
 
 		entry->pci.msi_attrib.can_mask	= !pci_msi_ignore_mask &&
 						  !entry->pci.msi_attrib.is_virtual;
@@ -1045,7 +1041,7 @@ int pci_irq_vector(struct pci_dev *dev,
 		struct msi_desc *entry;
 
 		for_each_pci_msi_entry(entry, dev) {
-			if (entry->pci.msi_attrib.entry_nr == nr)
+			if (entry->msi_index == nr)
 				return entry->irq;
 		}
 		WARN_ON_ONCE(1);
@@ -1084,7 +1080,7 @@ const struct cpumask *pci_irq_get_affini
 		struct msi_desc *entry;
 
 		for_each_pci_msi_entry(entry, dev) {
-			if (entry->pci.msi_attrib.entry_nr == nr)
+			if (entry->msi_index == nr)
 				return &entry->affinity->mask;
 		}
 		WARN_ON_ONCE(1);
--- a/drivers/pci/xen-pcifront.c
+++ b/drivers/pci/xen-pcifront.c
@@ -263,7 +263,7 @@ static int pci_frontend_enable_msix(stru
 
 	i = 0;
 	for_each_pci_msi_entry(entry, dev) {
-		op.msix_entries[i].entry = entry->pci.msi_attrib.entry_nr;
+		op.msix_entries[i].entry = entry->msi_index;
 		/* Vector is useless at this point. */
 		op.msix_entries[i].vector = -1;
 		i++;
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -80,7 +80,6 @@ typedef void (*irq_write_msi_msg_t)(stru
  * @multi_cap:	[PCI MSI/X] log2 num of messages supported
  * @can_mask:	[PCI MSI/X] Masking supported?
  * @is_64:	[PCI MSI/X] Address size: 0=32bit 1=64bit
- * @entry_nr:	[PCI MSI/X] Entry which is described by this descriptor
  * @default_irq:[PCI MSI/X] The default pre-assigned non-MSI irq
  * @mask_pos:	[PCI MSI]   Mask register position
  * @mask_base:	[PCI MSI-X] Mask register base address
@@ -97,7 +96,6 @@ struct pci_msi_desc {
 		u8	can_mask	: 1;
 		u8	is_64		: 1;
 		u8	is_virtual	: 1;
-		u16	entry_nr;
 		unsigned default_irq;
 	} msi_attrib;
 	union {


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 24/35] PCI/MSI: Provide MSI_FLAG_MSIX_CONTIGUOUS
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (22 preceding siblings ...)
  2021-12-10 22:19 ` [patch V3 23/35] PCI/MSI: " Thomas Gleixner
@ 2021-12-10 22:19 ` Thomas Gleixner
  2021-12-10 22:19 ` [patch V3 25/35] powerpc/pseries/msi: Let core code check for contiguous entries Thomas Gleixner
                   ` (11 subsequent siblings)
  35 siblings, 0 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:19 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Bjorn Helgaas,
	Juergen Gross, xen-devel, Arnd Bergmann, Michael Ellerman,
	Benjamin Herrenschmidt, linuxppc-dev, Stuart Yoder,
	Laurentiu Tudor, Nishanth Menon, Tero Kristo, Santosh Shilimkar,
	linux-arm-kernel, Vinod Koul, dmaengine, Mark Rutland,
	Will Deacon, Robin Murphy, Joerg Roedel, iommu, Jassi Brar,
	Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

Provide a domain info flag which makes the core code check for a contiguous
MSI-X index on allocation. That's simpler than checking it at some other
domain callback in architecture code.

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/irqdomain.c |   16 ++++++++++++++--
 include/linux/msi.h         |    2 ++
 2 files changed, 16 insertions(+), 2 deletions(-)

--- a/drivers/pci/msi/irqdomain.c
+++ b/drivers/pci/msi/irqdomain.c
@@ -89,9 +89,21 @@ static int pci_msi_domain_check_cap(stru
 	if (pci_msi_desc_is_multi_msi(desc) &&
 	    !(info->flags & MSI_FLAG_MULTI_PCI_MSI))
 		return 1;
-	else if (desc->pci.msi_attrib.is_msix && !(info->flags & MSI_FLAG_PCI_MSIX))
-		return -ENOTSUPP;
 
+	if (desc->pci.msi_attrib.is_msix) {
+		if (!(info->flags & MSI_FLAG_PCI_MSIX))
+			return -ENOTSUPP;
+
+		if (info->flags & MSI_FLAG_MSIX_CONTIGUOUS) {
+			unsigned int idx = 0;
+
+			/* Check for gaps in the entry indices */
+			for_each_msi_entry(desc, dev) {
+				if (desc->msi_index != idx++)
+					return -ENOTSUPP;
+			}
+		}
+	}
 	return 0;
 }
 
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -361,6 +361,8 @@ enum {
 	MSI_FLAG_LEVEL_CAPABLE		= (1 << 6),
 	/* Populate sysfs on alloc() and destroy it on free() */
 	MSI_FLAG_DEV_SYSFS		= (1 << 7),
+	/* MSI-X entries must be contiguous */
+	MSI_FLAG_MSIX_CONTIGUOUS	= (1 << 8),
 };
 
 int msi_domain_set_affinity(struct irq_data *data, const struct cpumask *mask,


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 25/35] powerpc/pseries/msi: Let core code check for contiguous entries
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (23 preceding siblings ...)
  2021-12-10 22:19 ` [patch V3 24/35] PCI/MSI: Provide MSI_FLAG_MSIX_CONTIGUOUS Thomas Gleixner
@ 2021-12-10 22:19 ` Thomas Gleixner
  2021-12-13 14:05   ` Jason Gunthorpe
  2021-12-10 22:19 ` [patch V3 26/35] genirq/msi: Provide interface to retrieve Linux interrupt number Thomas Gleixner
                   ` (10 subsequent siblings)
  35 siblings, 1 reply; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:19 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Michael Ellerman,
	Benjamin Herrenschmidt, linuxppc-dev, Juergen Gross, xen-devel,
	Arnd Bergmann, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, linux-arm-kernel,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

Set the domain info flag and remove the check.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: "Cédric Le Goater" <clg@kaod.org>
Cc: linuxppc-dev@lists.ozlabs.org

---
V2: Remove it completely - Cedric
---
 arch/powerpc/platforms/pseries/msi.c |   33 ++++++++-------------------------
 1 file changed, 8 insertions(+), 25 deletions(-)

--- a/arch/powerpc/platforms/pseries/msi.c
+++ b/arch/powerpc/platforms/pseries/msi.c
@@ -321,27 +321,6 @@ static int msi_quota_for_device(struct p
 	return request;
 }
 
-static int check_msix_entries(struct pci_dev *pdev)
-{
-	struct msi_desc *entry;
-	int expected;
-
-	/* There's no way for us to express to firmware that we want
-	 * a discontiguous, or non-zero based, range of MSI-X entries.
-	 * So we must reject such requests. */
-
-	expected = 0;
-	for_each_pci_msi_entry(entry, pdev) {
-		if (entry->msi_index != expected) {
-			pr_debug("rtas_msi: bad MSI-X entries.\n");
-			return -EINVAL;
-		}
-		expected++;
-	}
-
-	return 0;
-}
-
 static void rtas_hack_32bit_msi_gen2(struct pci_dev *pdev)
 {
 	u32 addr_hi, addr_lo;
@@ -380,9 +359,6 @@ static int rtas_prepare_msi_irqs(struct
 	if (quota && quota < nvec)
 		return quota;
 
-	if (type == PCI_CAP_ID_MSIX && check_msix_entries(pdev))
-		return -EINVAL;
-
 	/*
 	 * Firmware currently refuse any non power of two allocation
 	 * so we round up if the quota will allow it.
@@ -529,9 +505,16 @@ static struct irq_chip pseries_pci_msi_i
 	.irq_write_msi_msg	= pseries_msi_write_msg,
 };
 
+
+/*
+ * Set MSI_FLAG_MSIX_CONTIGUOUS as there is no way to express to
+ * firmware to request a discontiguous or non-zero based range of
+ * MSI-X entries. Core code will reject such setup attempts.
+ */
 static struct msi_domain_info pseries_msi_domain_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_MULTI_PCI_MSI  | MSI_FLAG_PCI_MSIX |
+		  MSI_FLAG_MSIX_CONTIGUOUS),
 	.ops   = &pseries_pci_msi_domain_ops,
 	.chip  = &pseries_pci_msi_irq_chip,
 };


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 26/35] genirq/msi: Provide interface to retrieve Linux interrupt number
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (24 preceding siblings ...)
  2021-12-10 22:19 ` [patch V3 25/35] powerpc/pseries/msi: Let core code check for contiguous entries Thomas Gleixner
@ 2021-12-10 22:19 ` Thomas Gleixner
  2021-12-13 14:22   ` Jason Gunthorpe
  2021-12-10 22:19 ` [patch V3 27/35] PCI/MSI: Use __msi_get_virq() in pci_get_vector() Thomas Gleixner
                   ` (9 subsequent siblings)
  35 siblings, 1 reply; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:19 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Juergen Gross, xen-devel,
	Arnd Bergmann, Michael Ellerman, Benjamin Herrenschmidt,
	linuxppc-dev, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, linux-arm-kernel,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

This allows drivers to retrieve the Linux interrupt number instead of
fiddling with MSI descriptors.

msi_get_virq() returns the Linux interrupt number or 0 in case that there
is no entry for the given MSI index.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
V2: Simplify the implementation and let PCI deal with the PCI specialities - Marc
---
 include/linux/msi.h |    2 ++
 kernel/irq/msi.c    |   36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 38 insertions(+)

--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -153,6 +153,8 @@ struct msi_device_data {
 
 int msi_setup_device_data(struct device *dev);
 
+unsigned int msi_get_virq(struct device *dev, unsigned int index);
+
 /* Helpers to hide struct msi_desc implementation details */
 #define msi_desc_to_dev(desc)		((desc)->dev)
 #define dev_to_msi_list(dev)		(&(dev)->msi_list)
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -105,6 +105,42 @@ int msi_setup_device_data(struct device
 	return 0;
 }
 
+/**
+ * msi_get_virq - Return Linux interrupt number of a MSI interrupt
+ * @dev:	Device to operate on
+ * @index:	MSI interrupt index to look for (0-based)
+ *
+ * Return: The Linux interrupt number on success (> 0), 0 if not found
+ */
+unsigned int msi_get_virq(struct device *dev, unsigned int index)
+{
+	struct msi_desc *desc;
+	bool pcimsi;
+
+	if (!dev->msi.data)
+		return 0;
+
+	pcimsi = dev_is_pci(dev) ? to_pci_dev(dev)->msi_enabled : false;
+
+	for_each_msi_entry(desc, dev) {
+		/* PCI-MSI has only one descriptor for multiple interrupts. */
+		if (pcimsi) {
+			if (desc->irq && index < desc->nvec_used)
+				return desc->irq + index;
+			break;
+		}
+
+		/*
+		 * PCI-MSIX and platform MSI use a descriptor per
+		 * interrupt.
+		 */
+		if (desc->msi_index == index)
+			return desc->irq;
+	}
+	return 0;
+}
+EXPORT_SYMBOL_GPL(msi_get_virq);
+
 #ifdef CONFIG_SYSFS
 static ssize_t msi_mode_show(struct device *dev, struct device_attribute *attr,
 			     char *buf)


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 27/35] PCI/MSI: Use __msi_get_virq() in pci_get_vector()
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (25 preceding siblings ...)
  2021-12-10 22:19 ` [patch V3 26/35] genirq/msi: Provide interface to retrieve Linux interrupt number Thomas Gleixner
@ 2021-12-10 22:19 ` Thomas Gleixner
  2021-12-13 14:23   ` Jason Gunthorpe
  2021-12-10 22:19 ` [patch V3 28/35] PCI/MSI: Simplify pci_irq_get_affinity() Thomas Gleixner
                   ` (8 subsequent siblings)
  35 siblings, 1 reply; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:19 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Juergen Gross, xen-devel,
	Arnd Bergmann, Michael Ellerman, Benjamin Herrenschmidt,
	linuxppc-dev, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, linux-arm-kernel,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

Use msi_get_vector() and handle the return value to be compatible.

No functional change intended.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
V2: Handle the INTx case directly instead of trying to be overly smart - Marc
---
 drivers/pci/msi/msi.c |   25 +++++--------------------
 1 file changed, 5 insertions(+), 20 deletions(-)

--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -1037,28 +1037,13 @@ EXPORT_SYMBOL(pci_free_irq_vectors);
  */
 int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
 {
-	if (dev->msix_enabled) {
-		struct msi_desc *entry;
+	unsigned int irq;
 
-		for_each_pci_msi_entry(entry, dev) {
-			if (entry->msi_index == nr)
-				return entry->irq;
-		}
-		WARN_ON_ONCE(1);
-		return -EINVAL;
-	}
+	if (!dev->msi_enabled && !dev->msix_enabled)
+		return !nr ? dev->irq : -EINVAL;
 
-	if (dev->msi_enabled) {
-		struct msi_desc *entry = first_pci_msi_entry(dev);
-
-		if (WARN_ON_ONCE(nr >= entry->nvec_used))
-			return -EINVAL;
-	} else {
-		if (WARN_ON_ONCE(nr > 0))
-			return -EINVAL;
-	}
-
-	return dev->irq + nr;
+	irq = msi_get_virq(&dev->dev, nr);
+	return irq ? irq : -EINVAL;
 }
 EXPORT_SYMBOL(pci_irq_vector);
 


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 28/35] PCI/MSI: Simplify pci_irq_get_affinity()
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (26 preceding siblings ...)
  2021-12-10 22:19 ` [patch V3 27/35] PCI/MSI: Use __msi_get_virq() in pci_get_vector() Thomas Gleixner
@ 2021-12-10 22:19 ` Thomas Gleixner
  2021-12-17 22:30   ` Nathan Chancellor
  2022-01-30 17:12   ` Guenter Roeck
  2021-12-10 22:19 ` [patch V3 29/35] dmaengine: mv_xor_v2: Get rid of msi_desc abuse Thomas Gleixner
                   ` (7 subsequent siblings)
  35 siblings, 2 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:19 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Juergen Gross, xen-devel,
	Arnd Bergmann, Michael Ellerman, Benjamin Herrenschmidt,
	linuxppc-dev, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, linux-arm-kernel,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

Replace open coded MSI descriptor chasing and use the proper accessor
functions instead.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
 drivers/pci/msi/msi.c |   26 ++++++++++----------------
 1 file changed, 10 insertions(+), 16 deletions(-)

--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -1061,26 +1061,20 @@ EXPORT_SYMBOL(pci_irq_vector);
  */
 const struct cpumask *pci_irq_get_affinity(struct pci_dev *dev, int nr)
 {
-	if (dev->msix_enabled) {
-		struct msi_desc *entry;
+	int irq = pci_irq_vector(dev, nr);
+	struct msi_desc *desc;
 
-		for_each_pci_msi_entry(entry, dev) {
-			if (entry->msi_index == nr)
-				return &entry->affinity->mask;
-		}
-		WARN_ON_ONCE(1);
+	if (WARN_ON_ONCE(irq <= 0))
 		return NULL;
-	} else if (dev->msi_enabled) {
-		struct msi_desc *entry = first_pci_msi_entry(dev);
 
-		if (WARN_ON_ONCE(!entry || !entry->affinity ||
-				 nr >= entry->nvec_used))
-			return NULL;
-
-		return &entry->affinity[nr].mask;
-	} else {
+	desc = irq_get_msi_desc(irq);
+	/* Non-MSI does not have the information handy */
+	if (!desc)
 		return cpu_possible_mask;
-	}
+
+	if (WARN_ON_ONCE(!desc->affinity))
+		return NULL;
+	return &desc->affinity[nr].mask;
 }
 EXPORT_SYMBOL(pci_irq_get_affinity);
 


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 29/35] dmaengine: mv_xor_v2: Get rid of msi_desc abuse
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (27 preceding siblings ...)
  2021-12-10 22:19 ` [patch V3 28/35] PCI/MSI: Simplify pci_irq_get_affinity() Thomas Gleixner
@ 2021-12-10 22:19 ` Thomas Gleixner
  2021-12-13  5:14   ` Vinod Koul
  2021-12-10 22:19 ` [patch V3 30/35] perf/smmuv3: Use msi_get_virq() Thomas Gleixner
                   ` (6 subsequent siblings)
  35 siblings, 1 reply; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:19 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Vinod Koul, dmaengine,
	Juergen Gross, xen-devel, Arnd Bergmann, Michael Ellerman,
	Benjamin Herrenschmidt, linuxppc-dev, Bjorn Helgaas,
	Stuart Yoder, Laurentiu Tudor, Nishanth Menon, Tero Kristo,
	Santosh Shilimkar, linux-arm-kernel, Mark Rutland, Will Deacon,
	Robin Murphy, Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi,
	Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

Storing a pointer to the MSI descriptor just to keep track of the Linux
interrupt number is daft. Use msi_get_virq() instead.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Cc: Vinod Koul <vkoul@kernel.org>
Cc: dmaengine@vger.kernel.org
---
 drivers/dma/mv_xor_v2.c |   16 +++++-----------
 1 file changed, 5 insertions(+), 11 deletions(-)

--- a/drivers/dma/mv_xor_v2.c
+++ b/drivers/dma/mv_xor_v2.c
@@ -149,7 +149,7 @@ struct mv_xor_v2_descriptor {
  * @desc_size: HW descriptor size
  * @npendings: number of pending descriptors (for which tx_submit has
  * @hw_queue_idx: HW queue index
- * @msi_desc: local interrupt descriptor information
+ * @irq: The Linux interrupt number
  * been called, but not yet issue_pending)
  */
 struct mv_xor_v2_device {
@@ -168,7 +168,7 @@ struct mv_xor_v2_device {
 	int desc_size;
 	unsigned int npendings;
 	unsigned int hw_queue_idx;
-	struct msi_desc *msi_desc;
+	unsigned int irq;
 };
 
 /**
@@ -718,7 +718,6 @@ static int mv_xor_v2_probe(struct platfo
 	int i, ret = 0;
 	struct dma_device *dma_dev;
 	struct mv_xor_v2_sw_desc *sw_desc;
-	struct msi_desc *msi_desc;
 
 	BUILD_BUG_ON(sizeof(struct mv_xor_v2_descriptor) !=
 		     MV_XOR_V2_EXT_DESC_SIZE);
@@ -770,14 +769,9 @@ static int mv_xor_v2_probe(struct platfo
 	if (ret)
 		goto disable_clk;
 
-	msi_desc = first_msi_entry(&pdev->dev);
-	if (!msi_desc) {
-		ret = -ENODEV;
-		goto free_msi_irqs;
-	}
-	xor_dev->msi_desc = msi_desc;
+	xor_dev->irq = msi_get_virq(&pdev->dev, 0);
 
-	ret = devm_request_irq(&pdev->dev, msi_desc->irq,
+	ret = devm_request_irq(&pdev->dev, xor_dev->irq,
 			       mv_xor_v2_interrupt_handler, 0,
 			       dev_name(&pdev->dev), xor_dev);
 	if (ret)
@@ -892,7 +886,7 @@ static int mv_xor_v2_remove(struct platf
 			  xor_dev->desc_size * MV_XOR_V2_DESC_NUM,
 			  xor_dev->hw_desq_virt, xor_dev->hw_desq);
 
-	devm_free_irq(&pdev->dev, xor_dev->msi_desc->irq, xor_dev);
+	devm_free_irq(&pdev->dev, xor_dev->irq, xor_dev);
 
 	platform_msi_domain_free_irqs(&pdev->dev);
 


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 30/35] perf/smmuv3: Use msi_get_virq()
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (28 preceding siblings ...)
  2021-12-10 22:19 ` [patch V3 29/35] dmaengine: mv_xor_v2: Get rid of msi_desc abuse Thomas Gleixner
@ 2021-12-10 22:19 ` Thomas Gleixner
  2021-12-10 22:19 ` [patch V3 31/35] iommu/arm-smmu-v3: " Thomas Gleixner
                   ` (5 subsequent siblings)
  35 siblings, 0 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:19 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Mark Rutland, Will Deacon,
	linux-arm-kernel, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor, Nishanth Menon,
	Tero Kristo, Santosh Shilimkar, Vinod Koul, dmaengine,
	Robin Murphy, Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi,
	Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

Let the core code fiddle with the MSI descriptor retrieval.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Will Deacon <will@kernel.org>
Cc: linux-arm-kernel@lists.infradead.org
---
 drivers/perf/arm_smmuv3_pmu.c |    5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

--- a/drivers/perf/arm_smmuv3_pmu.c
+++ b/drivers/perf/arm_smmuv3_pmu.c
@@ -684,7 +684,6 @@ static void smmu_pmu_write_msi_msg(struc
 
 static void smmu_pmu_setup_msi(struct smmu_pmu *pmu)
 {
-	struct msi_desc *desc;
 	struct device *dev = pmu->dev;
 	int ret;
 
@@ -701,9 +700,7 @@ static void smmu_pmu_setup_msi(struct sm
 		return;
 	}
 
-	desc = first_msi_entry(dev);
-	if (desc)
-		pmu->irq = desc->irq;
+	pmu->irq = msi_get_virq(dev, 0);
 
 	/* Add callback to free MSIs on teardown */
 	devm_add_action(dev, smmu_pmu_free_msis, dev);


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 31/35] iommu/arm-smmu-v3: Use msi_get_virq()
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (29 preceding siblings ...)
  2021-12-10 22:19 ` [patch V3 30/35] perf/smmuv3: Use msi_get_virq() Thomas Gleixner
@ 2021-12-10 22:19 ` Thomas Gleixner
  2021-12-10 22:19 ` [patch V3 32/35] mailbox: bcm-flexrm-mailbox: Rework MSI interrupt handling Thomas Gleixner
                   ` (4 subsequent siblings)
  35 siblings, 0 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:19 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Robin Murphy, Greg Kroah-Hartman, Will Deacon,
	Joerg Roedel, linux-arm-kernel, iommu, Juergen Gross, xen-devel,
	Arnd Bergmann, Michael Ellerman, Benjamin Herrenschmidt,
	linuxppc-dev, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, Vinod Koul,
	dmaengine, Mark Rutland, Jassi Brar, Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

Let the core code fiddle with the MSI descriptor retrieval.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Robin Murphy <robin.murphy@arm.com>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Cc: Will Deacon <will@kernel.org>
Cc: Joerg Roedel <joro@8bytes.org>
Cc: linux-arm-kernel@lists.infradead.org
Cc: iommu@lists.linux-foundation.org

---
 drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c |   19 +++----------------
 1 file changed, 3 insertions(+), 16 deletions(-)

--- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
+++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
@@ -3154,7 +3154,6 @@ static void arm_smmu_write_msi_msg(struc
 
 static void arm_smmu_setup_msis(struct arm_smmu_device *smmu)
 {
-	struct msi_desc *desc;
 	int ret, nvec = ARM_SMMU_MAX_MSIS;
 	struct device *dev = smmu->dev;
 
@@ -3182,21 +3181,9 @@ static void arm_smmu_setup_msis(struct a
 		return;
 	}
 
-	for_each_msi_entry(desc, dev) {
-		switch (desc->msi_index) {
-		case EVTQ_MSI_INDEX:
-			smmu->evtq.q.irq = desc->irq;
-			break;
-		case GERROR_MSI_INDEX:
-			smmu->gerr_irq = desc->irq;
-			break;
-		case PRIQ_MSI_INDEX:
-			smmu->priq.q.irq = desc->irq;
-			break;
-		default:	/* Unknown */
-			continue;
-		}
-	}
+	smmu->evtq.q.irq = msi_get_virq(dev, EVTQ_MSI_INDEX);
+	smmu->gerr_irq = msi_get_virq(dev, GERROR_MSI_INDEX);
+	smmu->priq.q.irq = msi_get_virq(dev, PRIQ_MSI_INDEX);
 
 	/* Add callback to free MSIs on teardown */
 	devm_add_action(dev, arm_smmu_free_msis, dev);


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 32/35] mailbox: bcm-flexrm-mailbox: Rework MSI interrupt handling
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (30 preceding siblings ...)
  2021-12-10 22:19 ` [patch V3 31/35] iommu/arm-smmu-v3: " Thomas Gleixner
@ 2021-12-10 22:19 ` Thomas Gleixner
  2021-12-10 22:19 ` [patch V3 33/35] bus: fsl-mc: fsl-mc-allocator: Rework MSI handling Thomas Gleixner
                   ` (3 subsequent siblings)
  35 siblings, 0 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:19 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Jassi Brar, Juergen Gross,
	xen-devel, Arnd Bergmann, Michael Ellerman,
	Benjamin Herrenschmidt, linuxppc-dev, Bjorn Helgaas,
	Stuart Yoder, Laurentiu Tudor, Nishanth Menon, Tero Kristo,
	Santosh Shilimkar, linux-arm-kernel, Vinod Koul, dmaengine,
	Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel, iommu,
	Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

No point in retrieving the MSI descriptors. Just query the Linux interrupt
number.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Cc: Jassi Brar <jassisinghbrar@gmail.com>

---
 drivers/mailbox/bcm-flexrm-mailbox.c |    7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

--- a/drivers/mailbox/bcm-flexrm-mailbox.c
+++ b/drivers/mailbox/bcm-flexrm-mailbox.c
@@ -1497,7 +1497,6 @@ static int flexrm_mbox_probe(struct plat
 	int index, ret = 0;
 	void __iomem *regs;
 	void __iomem *regs_end;
-	struct msi_desc *desc;
 	struct resource *iomem;
 	struct flexrm_ring *ring;
 	struct flexrm_mbox *mbox;
@@ -1608,10 +1607,8 @@ static int flexrm_mbox_probe(struct plat
 		goto fail_destroy_cmpl_pool;
 
 	/* Save alloced IRQ numbers for each ring */
-	for_each_msi_entry(desc, dev) {
-		ring = &mbox->rings[desc->msi_index];
-		ring->irq = desc->irq;
-	}
+	for (index = 0; index < mbox->num_rings; index++)
+		mbox->rings[index].irq = msi_get_virq(dev, index);
 
 	/* Check availability of debugfs */
 	if (!debugfs_initialized())


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 33/35] bus: fsl-mc: fsl-mc-allocator: Rework MSI handling
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (31 preceding siblings ...)
  2021-12-10 22:19 ` [patch V3 32/35] mailbox: bcm-flexrm-mailbox: Rework MSI interrupt handling Thomas Gleixner
@ 2021-12-10 22:19 ` Thomas Gleixner
  2021-12-10 22:19 ` [patch V3 34/35] soc: ti: ti_sci_inta_msi: Get rid of ti_sci_inta_msi_get_virq() Thomas Gleixner
                   ` (2 subsequent siblings)
  35 siblings, 0 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:19 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Stuart Yoder,
	Laurentiu Tudor, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Bjorn Helgaas, Nishanth Menon, Tero Kristo, Santosh Shilimkar,
	linux-arm-kernel, Vinod Koul, dmaengine, Mark Rutland,
	Will Deacon, Robin Murphy, Joerg Roedel, iommu, Jassi Brar,
	Peter Ujfalusi, Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

Storing a pointer to the MSI descriptor just to track the Linux interrupt
number is daft. Just store the interrupt number and be done with it.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Cc: Stuart Yoder <stuyoder@gmail.com>
Cc: Laurentiu Tudor <laurentiu.tudor@nxp.com>
---
 drivers/bus/fsl-mc/dprc-driver.c                    |    8 ++++----
 drivers/bus/fsl-mc/fsl-mc-allocator.c               |    9 ++-------
 drivers/bus/fsl-mc/fsl-mc-msi.c                     |    6 +++---
 drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c    |    4 ++--
 drivers/net/ethernet/freescale/dpaa2/dpaa2-ptp.c    |    4 +---
 drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c |    5 ++---
 drivers/soc/fsl/dpio/dpio-driver.c                  |    8 ++++----
 drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c              |    4 ++--
 include/linux/fsl/mc.h                              |    4 ++--
 9 files changed, 22 insertions(+), 30 deletions(-)

--- a/drivers/bus/fsl-mc/dprc-driver.c
+++ b/drivers/bus/fsl-mc/dprc-driver.c
@@ -400,7 +400,7 @@ static irqreturn_t dprc_irq0_handler_thr
 	struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev);
 	struct fsl_mc_bus *mc_bus = to_fsl_mc_bus(mc_dev);
 	struct fsl_mc_io *mc_io = mc_dev->mc_io;
-	struct msi_desc *msi_desc = mc_dev->irqs[0]->msi_desc;
+	int irq = mc_dev->irqs[0]->virq;
 
 	dev_dbg(dev, "DPRC IRQ %d triggered on CPU %u\n",
 		irq_num, smp_processor_id());
@@ -409,7 +409,7 @@ static irqreturn_t dprc_irq0_handler_thr
 		return IRQ_HANDLED;
 
 	mutex_lock(&mc_bus->scan_mutex);
-	if (!msi_desc || msi_desc->irq != (u32)irq_num)
+	if (irq != (u32)irq_num)
 		goto out;
 
 	status = 0;
@@ -521,7 +521,7 @@ static int register_dprc_irq_handler(str
 	 * function that programs the MSI physically in the device
 	 */
 	error = devm_request_threaded_irq(&mc_dev->dev,
-					  irq->msi_desc->irq,
+					  irq->virq,
 					  dprc_irq0_handler,
 					  dprc_irq0_handler_thread,
 					  IRQF_NO_SUSPEND | IRQF_ONESHOT,
@@ -771,7 +771,7 @@ static void dprc_teardown_irq(struct fsl
 
 	(void)disable_dprc_irq(mc_dev);
 
-	devm_free_irq(&mc_dev->dev, irq->msi_desc->irq, &mc_dev->dev);
+	devm_free_irq(&mc_dev->dev, irq->virq, &mc_dev->dev);
 
 	fsl_mc_free_irqs(mc_dev);
 }
--- a/drivers/bus/fsl-mc/fsl-mc-allocator.c
+++ b/drivers/bus/fsl-mc/fsl-mc-allocator.c
@@ -350,7 +350,6 @@ int fsl_mc_populate_irq_pool(struct fsl_
 			     unsigned int irq_count)
 {
 	unsigned int i;
-	struct msi_desc *msi_desc;
 	struct fsl_mc_device_irq *irq_resources;
 	struct fsl_mc_device_irq *mc_dev_irq;
 	int error;
@@ -388,16 +387,12 @@ int fsl_mc_populate_irq_pool(struct fsl_
 		mc_dev_irq->resource.type = res_pool->type;
 		mc_dev_irq->resource.data = mc_dev_irq;
 		mc_dev_irq->resource.parent_pool = res_pool;
+		mc_dev_irq->virq = msi_get_virq(&mc_bus_dev->dev, i);
+		mc_dev_irq->resource.id = mc_dev_irq->virq;
 		INIT_LIST_HEAD(&mc_dev_irq->resource.node);
 		list_add_tail(&mc_dev_irq->resource.node, &res_pool->free_list);
 	}
 
-	for_each_msi_entry(msi_desc, &mc_bus_dev->dev) {
-		mc_dev_irq = &irq_resources[msi_desc->msi_index];
-		mc_dev_irq->msi_desc = msi_desc;
-		mc_dev_irq->resource.id = msi_desc->irq;
-	}
-
 	res_pool->max_count = irq_count;
 	res_pool->free_count = irq_count;
 	mc_bus->irq_resources = irq_resources;
--- a/drivers/bus/fsl-mc/fsl-mc-msi.c
+++ b/drivers/bus/fsl-mc/fsl-mc-msi.c
@@ -58,11 +58,11 @@ static void fsl_mc_msi_update_dom_ops(st
 }
 
 static void __fsl_mc_msi_write_msg(struct fsl_mc_device *mc_bus_dev,
-				   struct fsl_mc_device_irq *mc_dev_irq)
+				   struct fsl_mc_device_irq *mc_dev_irq,
+				   struct msi_desc *msi_desc)
 {
 	int error;
 	struct fsl_mc_device *owner_mc_dev = mc_dev_irq->mc_dev;
-	struct msi_desc *msi_desc = mc_dev_irq->msi_desc;
 	struct dprc_irq_cfg irq_cfg;
 
 	/*
@@ -129,7 +129,7 @@ static void fsl_mc_msi_write_msg(struct
 	/*
 	 * Program the MSI (paddr, value) pair in the device:
 	 */
-	__fsl_mc_msi_write_msg(mc_bus_dev, mc_dev_irq);
+	__fsl_mc_msi_write_msg(mc_bus_dev, mc_dev_irq, msi_desc);
 }
 
 static void fsl_mc_msi_update_chip_ops(struct msi_domain_info *info)
--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
+++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
@@ -4246,7 +4246,7 @@ static int dpaa2_eth_setup_irqs(struct f
 	}
 
 	irq = ls_dev->irqs[0];
-	err = devm_request_threaded_irq(&ls_dev->dev, irq->msi_desc->irq,
+	err = devm_request_threaded_irq(&ls_dev->dev, irq->virq,
 					NULL, dpni_irq0_handler_thread,
 					IRQF_NO_SUSPEND | IRQF_ONESHOT,
 					dev_name(&ls_dev->dev), &ls_dev->dev);
@@ -4273,7 +4273,7 @@ static int dpaa2_eth_setup_irqs(struct f
 	return 0;
 
 free_irq:
-	devm_free_irq(&ls_dev->dev, irq->msi_desc->irq, &ls_dev->dev);
+	devm_free_irq(&ls_dev->dev, irq->virq, &ls_dev->dev);
 free_mc_irq:
 	fsl_mc_free_irqs(ls_dev);
 
--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-ptp.c
+++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-ptp.c
@@ -129,7 +129,6 @@ static irqreturn_t dpaa2_ptp_irq_handler
 static int dpaa2_ptp_probe(struct fsl_mc_device *mc_dev)
 {
 	struct device *dev = &mc_dev->dev;
-	struct fsl_mc_device_irq *irq;
 	struct ptp_qoriq *ptp_qoriq;
 	struct device_node *node;
 	void __iomem *base;
@@ -177,8 +176,7 @@ static int dpaa2_ptp_probe(struct fsl_mc
 		goto err_unmap;
 	}
 
-	irq = mc_dev->irqs[0];
-	ptp_qoriq->irq = irq->msi_desc->irq;
+	ptp_qoriq->irq = mc_dev->irqs[0]->virq;
 
 	err = request_threaded_irq(ptp_qoriq->irq, NULL,
 				   dpaa2_ptp_irq_handler_thread,
--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c
+++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c
@@ -1553,8 +1553,7 @@ static int dpaa2_switch_setup_irqs(struc
 
 	irq = sw_dev->irqs[DPSW_IRQ_INDEX_IF];
 
-	err = devm_request_threaded_irq(dev, irq->msi_desc->irq,
-					NULL,
+	err = devm_request_threaded_irq(dev, irq->virq, NULL,
 					dpaa2_switch_irq0_handler_thread,
 					IRQF_NO_SUSPEND | IRQF_ONESHOT,
 					dev_name(dev), dev);
@@ -1580,7 +1579,7 @@ static int dpaa2_switch_setup_irqs(struc
 	return 0;
 
 free_devm_irq:
-	devm_free_irq(dev, irq->msi_desc->irq, dev);
+	devm_free_irq(dev, irq->virq, dev);
 free_irq:
 	fsl_mc_free_irqs(sw_dev);
 	return err;
--- a/drivers/soc/fsl/dpio/dpio-driver.c
+++ b/drivers/soc/fsl/dpio/dpio-driver.c
@@ -88,7 +88,7 @@ static void unregister_dpio_irq_handlers
 	irq = dpio_dev->irqs[0];
 
 	/* clear the affinity hint */
-	irq_set_affinity_hint(irq->msi_desc->irq, NULL);
+	irq_set_affinity_hint(irq->virq, NULL);
 }
 
 static int register_dpio_irq_handlers(struct fsl_mc_device *dpio_dev, int cpu)
@@ -98,7 +98,7 @@ static int register_dpio_irq_handlers(st
 
 	irq = dpio_dev->irqs[0];
 	error = devm_request_irq(&dpio_dev->dev,
-				 irq->msi_desc->irq,
+				 irq->virq,
 				 dpio_irq_handler,
 				 0,
 				 dev_name(&dpio_dev->dev),
@@ -111,10 +111,10 @@ static int register_dpio_irq_handlers(st
 	}
 
 	/* set the affinity hint */
-	if (irq_set_affinity_hint(irq->msi_desc->irq, cpumask_of(cpu)))
+	if (irq_set_affinity_hint(irq->virq, cpumask_of(cpu)))
 		dev_err(&dpio_dev->dev,
 			"irq_set_affinity failed irq %d cpu %d\n",
-			irq->msi_desc->irq, cpu);
+			irq->virq, cpu);
 
 	return 0;
 }
--- a/drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c
+++ b/drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c
@@ -67,7 +67,7 @@ static int vfio_set_trigger(struct vfio_
 	int hwirq;
 	int ret;
 
-	hwirq = vdev->mc_dev->irqs[index]->msi_desc->irq;
+	hwirq = vdev->mc_dev->irqs[index]->virq;
 	if (irq->trigger) {
 		free_irq(hwirq, irq);
 		kfree(irq->name);
@@ -137,7 +137,7 @@ static int vfio_fsl_mc_set_irq_trigger(s
 		return vfio_set_trigger(vdev, index, fd);
 	}
 
-	hwirq = vdev->mc_dev->irqs[index]->msi_desc->irq;
+	hwirq = vdev->mc_dev->irqs[index]->virq;
 
 	irq = &vdev->mc_irqs[index];
 
--- a/include/linux/fsl/mc.h
+++ b/include/linux/fsl/mc.h
@@ -91,13 +91,13 @@ struct fsl_mc_resource {
 
 /**
  * struct fsl_mc_device_irq - MC object device message-based interrupt
- * @msi_desc: pointer to MSI descriptor allocated by fsl_mc_msi_alloc_descs()
+ * @virq: Linux virtual interrupt number
  * @mc_dev: MC object device that owns this interrupt
  * @dev_irq_index: device-relative IRQ index
  * @resource: MC generic resource associated with the interrupt
  */
 struct fsl_mc_device_irq {
-	struct msi_desc *msi_desc;
+	unsigned int virq;
 	struct fsl_mc_device *mc_dev;
 	u8 dev_irq_index;
 	struct fsl_mc_resource resource;


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 34/35] soc: ti: ti_sci_inta_msi: Get rid of ti_sci_inta_msi_get_virq()
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (32 preceding siblings ...)
  2021-12-10 22:19 ` [patch V3 33/35] bus: fsl-mc: fsl-mc-allocator: Rework MSI handling Thomas Gleixner
@ 2021-12-10 22:19 ` Thomas Gleixner
  2021-12-11 15:24   ` Arnd Bergmann
                     ` (2 more replies)
  2021-12-10 22:19 ` [patch V3 35/35] dmaengine: qcom_hidma: Cleanup MSI handling Thomas Gleixner
  2021-12-13 18:29 ` [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Nishanth Menon
  35 siblings, 3 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:19 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Peter Ujfalusi, Vinod Koul,
	dmaengine, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor, Nishanth Menon,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Mark Rutland,
	Will Deacon, Robin Murphy, Joerg Roedel, iommu, Jassi Brar,
	Sinan Kaya

From: Thomas Gleixner <tglx@linutronix.de>

Just use the core function msi_get_virq().

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Cc: Peter Ujfalusi <peter.ujfalusi@gmail.com>
Cc: Vinod Koul <vkoul@kernel.org>
Cc: dmaengine@vger.kernel.org
---
 drivers/dma/ti/k3-udma-private.c       |    6 ++----
 drivers/dma/ti/k3-udma.c               |   10 ++++------
 drivers/soc/ti/k3-ringacc.c            |    2 +-
 drivers/soc/ti/ti_sci_inta_msi.c       |   12 ------------
 include/linux/soc/ti/ti_sci_inta_msi.h |    1 -
 5 files changed, 7 insertions(+), 24 deletions(-)

--- a/drivers/dma/ti/k3-udma-private.c
+++ b/drivers/dma/ti/k3-udma-private.c
@@ -168,8 +168,7 @@ int xudma_pktdma_tflow_get_irq(struct ud
 {
 	const struct udma_oes_offsets *oes = &ud->soc_data->oes;
 
-	return ti_sci_inta_msi_get_virq(ud->dev, udma_tflow_id +
-					oes->pktdma_tchan_flow);
+	return msi_get_virq(ud->dev, udma_tflow_id + oes->pktdma_tchan_flow);
 }
 EXPORT_SYMBOL(xudma_pktdma_tflow_get_irq);
 
@@ -177,7 +176,6 @@ int xudma_pktdma_rflow_get_irq(struct ud
 {
 	const struct udma_oes_offsets *oes = &ud->soc_data->oes;
 
-	return ti_sci_inta_msi_get_virq(ud->dev, udma_rflow_id +
-					oes->pktdma_rchan_flow);
+	return msi_get_virq(ud->dev, udma_rflow_id + oes->pktdma_rchan_flow);
 }
 EXPORT_SYMBOL(xudma_pktdma_rflow_get_irq);
--- a/drivers/dma/ti/k3-udma.c
+++ b/drivers/dma/ti/k3-udma.c
@@ -2313,8 +2313,7 @@ static int udma_alloc_chan_resources(str
 
 	/* Event from UDMA (TR events) only needed for slave TR mode channels */
 	if (is_slave_direction(uc->config.dir) && !uc->config.pkt_mode) {
-		uc->irq_num_udma = ti_sci_inta_msi_get_virq(ud->dev,
-							    irq_udma_idx);
+		uc->irq_num_udma = msi_get_virq(ud->dev, irq_udma_idx);
 		if (uc->irq_num_udma <= 0) {
 			dev_err(ud->dev, "Failed to get udma irq (index: %u)\n",
 				irq_udma_idx);
@@ -2486,7 +2485,7 @@ static int bcdma_alloc_chan_resources(st
 		uc->psil_paired = true;
 	}
 
-	uc->irq_num_ring = ti_sci_inta_msi_get_virq(ud->dev, irq_ring_idx);
+	uc->irq_num_ring = msi_get_virq(ud->dev, irq_ring_idx);
 	if (uc->irq_num_ring <= 0) {
 		dev_err(ud->dev, "Failed to get ring irq (index: %u)\n",
 			irq_ring_idx);
@@ -2503,8 +2502,7 @@ static int bcdma_alloc_chan_resources(st
 
 	/* Event from BCDMA (TR events) only needed for slave channels */
 	if (is_slave_direction(uc->config.dir)) {
-		uc->irq_num_udma = ti_sci_inta_msi_get_virq(ud->dev,
-							    irq_udma_idx);
+		uc->irq_num_udma = msi_get_virq(ud->dev, irq_udma_idx);
 		if (uc->irq_num_udma <= 0) {
 			dev_err(ud->dev, "Failed to get bcdma irq (index: %u)\n",
 				irq_udma_idx);
@@ -2672,7 +2670,7 @@ static int pktdma_alloc_chan_resources(s
 
 	uc->psil_paired = true;
 
-	uc->irq_num_ring = ti_sci_inta_msi_get_virq(ud->dev, irq_ring_idx);
+	uc->irq_num_ring = msi_get_virq(ud->dev, irq_ring_idx);
 	if (uc->irq_num_ring <= 0) {
 		dev_err(ud->dev, "Failed to get ring irq (index: %u)\n",
 			irq_ring_idx);
--- a/drivers/soc/ti/k3-ringacc.c
+++ b/drivers/soc/ti/k3-ringacc.c
@@ -647,7 +647,7 @@ int k3_ringacc_get_ring_irq_num(struct k
 	if (!ring)
 		return -EINVAL;
 
-	irq_num = ti_sci_inta_msi_get_virq(ring->parent->dev, ring->ring_id);
+	irq_num = msi_get_virq(ring->parent->dev, ring->ring_id);
 	if (irq_num <= 0)
 		irq_num = -EINVAL;
 	return irq_num;
--- a/drivers/soc/ti/ti_sci_inta_msi.c
+++ b/drivers/soc/ti/ti_sci_inta_msi.c
@@ -148,15 +148,3 @@ void ti_sci_inta_msi_domain_free_irqs(st
 	ti_sci_inta_msi_free_descs(dev);
 }
 EXPORT_SYMBOL_GPL(ti_sci_inta_msi_domain_free_irqs);
-
-unsigned int ti_sci_inta_msi_get_virq(struct device *dev, u32 dev_index)
-{
-	struct msi_desc *desc;
-
-	for_each_msi_entry(desc, dev)
-		if (desc->msi_index == dev_index)
-			return desc->irq;
-
-	return -ENODEV;
-}
-EXPORT_SYMBOL_GPL(ti_sci_inta_msi_get_virq);
--- a/include/linux/soc/ti/ti_sci_inta_msi.h
+++ b/include/linux/soc/ti/ti_sci_inta_msi.h
@@ -18,6 +18,5 @@ struct irq_domain
 				   struct irq_domain *parent);
 int ti_sci_inta_msi_domain_alloc_irqs(struct device *dev,
 				      struct ti_sci_resource *res);
-unsigned int ti_sci_inta_msi_get_virq(struct device *dev, u32 index);
 void ti_sci_inta_msi_domain_free_irqs(struct device *dev);
 #endif /* __INCLUDE_LINUX_IRQCHIP_TI_SCI_INTA_H */


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V3 35/35] dmaengine: qcom_hidma: Cleanup MSI handling
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (33 preceding siblings ...)
  2021-12-10 22:19 ` [patch V3 34/35] soc: ti: ti_sci_inta_msi: Get rid of ti_sci_inta_msi_get_virq() Thomas Gleixner
@ 2021-12-10 22:19 ` Thomas Gleixner
  2021-12-13  5:14   ` Vinod Koul
  2021-12-13 18:29 ` [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Nishanth Menon
  35 siblings, 1 reply; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-10 22:19 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Sinan Kaya, dmaengine,
	Juergen Gross, xen-devel, Arnd Bergmann, Michael Ellerman,
	Benjamin Herrenschmidt, linuxppc-dev, Bjorn Helgaas,
	Stuart Yoder, Laurentiu Tudor, Nishanth Menon, Tero Kristo,
	Santosh Shilimkar, linux-arm-kernel, Vinod Koul, Mark Rutland,
	Will Deacon, Robin Murphy, Joerg Roedel, iommu, Jassi Brar,
	Peter Ujfalusi

From: Thomas Gleixner <tglx@linutronix.de>

There is no reason to walk the MSI descriptors to retrieve the interrupt
number for a device. Use msi_get_virq() instead.

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: Sinan Kaya <okaya@kernel.org>
Cc: dmaengine@vger.kernel.org
---
 drivers/dma/qcom/hidma.c |   42 ++++++++++++++++++------------------------
 1 file changed, 18 insertions(+), 24 deletions(-)

--- a/drivers/dma/qcom/hidma.c
+++ b/drivers/dma/qcom/hidma.c
@@ -678,11 +678,13 @@ static void hidma_free_msis(struct hidma
 {
 #ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
 	struct device *dev = dmadev->ddev.dev;
-	struct msi_desc *desc;
+	int i, virq;
 
-	/* free allocated MSI interrupts above */
-	for_each_msi_entry(desc, dev)
-		devm_free_irq(dev, desc->irq, &dmadev->lldev);
+	for (i = 0; i < HIDMA_MSI_INTS; i++) {
+		virq = msi_get_virq(dev, i);
+		if (virq)
+			devm_free_irq(dev, virq, &dmadev->lldev);
+	}
 
 	platform_msi_domain_free_irqs(dev);
 #endif
@@ -692,45 +694,37 @@ static int hidma_request_msi(struct hidm
 			     struct platform_device *pdev)
 {
 #ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
-	int rc;
-	struct msi_desc *desc;
-	struct msi_desc *failed_desc = NULL;
+	int rc, i, virq;
 
 	rc = platform_msi_domain_alloc_irqs(&pdev->dev, HIDMA_MSI_INTS,
 					    hidma_write_msi_msg);
 	if (rc)
 		return rc;
 
-	for_each_msi_entry(desc, &pdev->dev) {
-		if (!desc->msi_index)
-			dmadev->msi_virqbase = desc->irq;
-
-		rc = devm_request_irq(&pdev->dev, desc->irq,
+	for (i = 0; i < HIDMA_MSI_INTS; i++) {
+		virq = msi_get_virq(&pdev->dev, i);
+		rc = devm_request_irq(&pdev->dev, virq,
 				       hidma_chirq_handler_msi,
 				       0, "qcom-hidma-msi",
 				       &dmadev->lldev);
-		if (rc) {
-			failed_desc = desc;
+		if (rc)
 			break;
-		}
+		if (!i)
+			dmadev->msi_virqbase = virq;
 	}
 
 	if (rc) {
 		/* free allocated MSI interrupts above */
-		for_each_msi_entry(desc, &pdev->dev) {
-			if (desc == failed_desc)
-				break;
-			devm_free_irq(&pdev->dev, desc->irq,
-				      &dmadev->lldev);
+		for (--i; i >= 0; i--) {
+			virq = msi_get_virq(&pdev->dev, i);
+			devm_free_irq(&pdev->dev, virq, &dmadev->lldev);
 		}
+		dev_warn(&pdev->dev,
+			 "failed to request MSI irq, falling back to wired IRQ\n");
 	} else {
 		/* Add callback to free MSIs on teardown */
 		hidma_ll_setup_irq(dmadev->lldev, true);
-
 	}
-	if (rc)
-		dev_warn(&pdev->dev,
-			 "failed to request MSI irq, falling back to wired IRQ\n");
 	return rc;
 #else
 	return -EINVAL;


^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 03/35] x86/apic/msi: Use PCI device MSI property
  2021-12-10 22:18 ` [patch V3 03/35] x86/apic/msi: Use PCI device MSI property Thomas Gleixner
@ 2021-12-11 10:52   ` Greg Kroah-Hartman
  2021-12-13 13:59   ` Jason Gunthorpe
  1 sibling, 0 replies; 83+ messages in thread
From: Greg Kroah-Hartman @ 2021-12-11 10:52 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor, Nishanth Menon,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

On Fri, Dec 10, 2021 at 11:18:47PM +0100, Thomas Gleixner wrote:
> From: Thomas Gleixner <tglx@linutronix.de>
> 
> instead of fiddling with MSI descriptors.
> 
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 05/35] powerpc/cell/axon_msi: Use PCI device property
  2021-12-10 22:18 ` [patch V3 05/35] powerpc/cell/axon_msi: " Thomas Gleixner
@ 2021-12-11 15:21   ` Arnd Bergmann
  2021-12-13 14:01   ` Jason Gunthorpe
  1 sibling, 0 replies; 83+ messages in thread
From: Arnd Bergmann @ 2021-12-11 15:21 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Arnd Bergmann, Michael Ellerman,
	Benjamin Herrenschmidt, linuxppc-dev, Juergen Gross, xen-devel,
	Greg Kroah-Hartman, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, Linux ARM,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, open list:IOMMU DRIVERS, Jassi Brar,
	Peter Ujfalusi, Sinan Kaya

On Fri, Dec 10, 2021 at 11:18 PM Thomas Gleixner <tglx@linutronix.de> wrote:
>
> From: Thomas Gleixner <tglx@linutronix.de>
>
> instead of fiddling with MSI descriptors.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Cc: Arnd Bergmann <arnd@arndb.de>
> Cc: Michael Ellerman <mpe@ellerman.id.au>
> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> Cc: linuxppc-dev@lists.ozlabs.org
> ---

Acked-by: Arnd Bergmann <arnd@arndb.de>

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 07/35] device: Move MSI related data into a struct
  2021-12-10 22:18 ` [patch V3 07/35] device: Move MSI related data into a struct Thomas Gleixner
@ 2021-12-11 15:22   ` Arnd Bergmann
  0 siblings, 0 replies; 83+ messages in thread
From: Arnd Bergmann @ 2021-12-11 15:22 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Juergen Gross, xen-devel,
	Arnd Bergmann, Michael Ellerman, Benjamin Herrenschmidt,
	linuxppc-dev, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, Linux ARM,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, open list:IOMMU DRIVERS, Jassi Brar,
	Peter Ujfalusi, Sinan Kaya

On Fri, Dec 10, 2021 at 11:18 PM Thomas Gleixner <tglx@linutronix.de> wrote:
>
> From: Thomas Gleixner <tglx@linutronix.de>
>
> The only unconditional part of MSI data in struct device is the irqdomain
> pointer. Everything else can be allocated on demand. Create a data
> structure and move the irqdomain pointer into it. The other MSI specific
> parts are going to be removed from struct device in later steps.
>
> 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: Arnd Bergmann <arnd@arndb.de>

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 12/35] soc: ti: ti_sci_inta_msi: Allocate MSI device data on first use
  2021-12-10 22:19 ` [patch V3 12/35] soc: ti: ti_sci_inta_msi: " Thomas Gleixner
@ 2021-12-11 15:22   ` Arnd Bergmann
  2021-12-13 17:56   ` Nishanth Menon
  1 sibling, 0 replies; 83+ messages in thread
From: Arnd Bergmann @ 2021-12-11 15:22 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Nishanth Menon,
	Tero Kristo, Santosh Shilimkar, Linux ARM, Juergen Gross,
	xen-devel, Arnd Bergmann, Michael Ellerman,
	Benjamin Herrenschmidt, linuxppc-dev, Bjorn Helgaas,
	Stuart Yoder, Laurentiu Tudor, Vinod Koul, dmaengine,
	Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	open list:IOMMU DRIVERS, Jassi Brar, Peter Ujfalusi, Sinan Kaya

On Fri, Dec 10, 2021 at 11:19 PM Thomas Gleixner <tglx@linutronix.de> wrote:
>
> From: Thomas Gleixner <tglx@linutronix.de>
>
> Allocate the MSI device data on first invocation of the allocation function.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
> Cc: Nishanth Menon <nm@ti.com>
> Cc: Tero Kristo <kristo@kernel.org>
> Cc: Santosh Shilimkar <ssantosh@kernel.org>
> Cc: linux-arm-kernel@lists.infradead.org

Acked-by: Arnd Bergmann <arnd@arndb.de>

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 34/35] soc: ti: ti_sci_inta_msi: Get rid of ti_sci_inta_msi_get_virq()
  2021-12-10 22:19 ` [patch V3 34/35] soc: ti: ti_sci_inta_msi: Get rid of ti_sci_inta_msi_get_virq() Thomas Gleixner
@ 2021-12-11 15:24   ` Arnd Bergmann
  2021-12-13  5:15   ` Vinod Koul
  2021-12-13 17:57   ` Nishanth Menon
  2 siblings, 0 replies; 83+ messages in thread
From: Arnd Bergmann @ 2021-12-11 15:24 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Peter Ujfalusi, Vinod Koul,
	dmaengine, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor, Nishanth Menon,
	Tero Kristo, Santosh Shilimkar, Linux ARM, Mark Rutland,
	Will Deacon, Robin Murphy, Joerg Roedel, open list:IOMMU DRIVERS,
	Jassi Brar, Sinan Kaya

On Fri, Dec 10, 2021 at 11:19 PM Thomas Gleixner <tglx@linutronix.de> wrote:
>
> From: Thomas Gleixner <tglx@linutronix.de>
>
> Just use the core function msi_get_virq().
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
> Cc: Peter Ujfalusi <peter.ujfalusi@gmail.com>
> Cc: Vinod Koul <vkoul@kernel.org>
> Cc: dmaengine@vger.kernel.org

Acked-by: Arnd Bergmann <arnd@arndb.de>

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 29/35] dmaengine: mv_xor_v2: Get rid of msi_desc abuse
  2021-12-10 22:19 ` [patch V3 29/35] dmaengine: mv_xor_v2: Get rid of msi_desc abuse Thomas Gleixner
@ 2021-12-13  5:14   ` Vinod Koul
  0 siblings, 0 replies; 83+ messages in thread
From: Vinod Koul @ 2021-12-13  5:14 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, dmaengine, Juergen Gross,
	xen-devel, Arnd Bergmann, Michael Ellerman,
	Benjamin Herrenschmidt, linuxppc-dev, Bjorn Helgaas,
	Stuart Yoder, Laurentiu Tudor, Nishanth Menon, Tero Kristo,
	Santosh Shilimkar, linux-arm-kernel, Mark Rutland, Will Deacon,
	Robin Murphy, Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi,
	Sinan Kaya

On 10-12-21, 23:19, Thomas Gleixner wrote:
> From: Thomas Gleixner <tglx@linutronix.de>
> 
> Storing a pointer to the MSI descriptor just to keep track of the Linux
> interrupt number is daft. Use msi_get_virq() instead.

Acked-By: Vinod Koul <vkoul@kernel.org>

-- 
~Vinod

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 35/35] dmaengine: qcom_hidma: Cleanup MSI handling
  2021-12-10 22:19 ` [patch V3 35/35] dmaengine: qcom_hidma: Cleanup MSI handling Thomas Gleixner
@ 2021-12-13  5:14   ` Vinod Koul
  0 siblings, 0 replies; 83+ messages in thread
From: Vinod Koul @ 2021-12-13  5:14 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Sinan Kaya, dmaengine,
	Juergen Gross, xen-devel, Arnd Bergmann, Michael Ellerman,
	Benjamin Herrenschmidt, linuxppc-dev, Bjorn Helgaas,
	Stuart Yoder, Laurentiu Tudor, Nishanth Menon, Tero Kristo,
	Santosh Shilimkar, linux-arm-kernel, Mark Rutland, Will Deacon,
	Robin Murphy, Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi

On 10-12-21, 23:19, Thomas Gleixner wrote:
> From: Thomas Gleixner <tglx@linutronix.de>
> 
> There is no reason to walk the MSI descriptors to retrieve the interrupt
> number for a device. Use msi_get_virq() instead.

Acked-By: Vinod Koul <vkoul@kernel.org>

-- 
~Vinod

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 34/35] soc: ti: ti_sci_inta_msi: Get rid of ti_sci_inta_msi_get_virq()
  2021-12-10 22:19 ` [patch V3 34/35] soc: ti: ti_sci_inta_msi: Get rid of ti_sci_inta_msi_get_virq() Thomas Gleixner
  2021-12-11 15:24   ` Arnd Bergmann
@ 2021-12-13  5:15   ` Vinod Koul
  2021-12-13 17:57   ` Nishanth Menon
  2 siblings, 0 replies; 83+ messages in thread
From: Vinod Koul @ 2021-12-13  5:15 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Peter Ujfalusi, dmaengine,
	Juergen Gross, xen-devel, Arnd Bergmann, Michael Ellerman,
	Benjamin Herrenschmidt, linuxppc-dev, Bjorn Helgaas,
	Stuart Yoder, Laurentiu Tudor, Nishanth Menon, Tero Kristo,
	Santosh Shilimkar, linux-arm-kernel, Mark Rutland, Will Deacon,
	Robin Murphy, Joerg Roedel, iommu, Jassi Brar, Sinan Kaya

On 10-12-21, 23:19, Thomas Gleixner wrote:
> From: Thomas Gleixner <tglx@linutronix.de>
> 
> Just use the core function msi_get_virq().

Acked-By: Vinod Koul <vkoul@kernel.org>

-- 
~Vinod

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 01/35] PCI/MSI: Set pci_dev::msi[x]_enabled early
  2021-12-10 22:18 ` [patch V3 01/35] PCI/MSI: Set pci_dev::msi[x]_enabled early Thomas Gleixner
@ 2021-12-13 13:37   ` Jason Gunthorpe
  0 siblings, 0 replies; 83+ messages in thread
From: Jason Gunthorpe @ 2021-12-13 13:37 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Megha Dey, Ashok Raj, linux-pci, Cedric Le Goater, Juergen Gross,
	xen-devel, Arnd Bergmann, Michael Ellerman,
	Benjamin Herrenschmidt, linuxppc-dev, Greg Kroah-Hartman,
	Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor, Nishanth Menon,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

On Fri, Dec 10, 2021 at 11:18:44PM +0100, Thomas Gleixner wrote:
> There are quite some places which retrieve the first MSI descriptor to
> evaluate whether the setup is for MSI or MSI-X. That's required because
> pci_dev::msi[x]_enabled is only set when the setup completed successfully.
> 
> There is no real reason why msi[x]_enabled can't be set at the beginning of
> the setup sequence and cleared in case of a failure.
> 
> Implement that so the MSI descriptor evaluations can be converted to simple
> property queries.
> 
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> V3: New patch
> ---
>  drivers/pci/msi/msi.c |   23 +++++++++++++++++------
>  1 file changed, 17 insertions(+), 6 deletions(-)

Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>

Jason

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 02/35] x86/pci/XEN: Use PCI device property
  2021-12-10 22:18 ` [patch V3 02/35] x86/pci/XEN: Use PCI device property Thomas Gleixner
@ 2021-12-13 13:56   ` Jason Gunthorpe
  0 siblings, 0 replies; 83+ messages in thread
From: Jason Gunthorpe @ 2021-12-13 13:56 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Megha Dey, Ashok Raj, linux-pci, Cedric Le Goater, Juergen Gross,
	xen-devel, Arnd Bergmann, Michael Ellerman,
	Benjamin Herrenschmidt, linuxppc-dev, Greg Kroah-Hartman,
	Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor, Nishanth Menon,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

On Fri, Dec 10, 2021 at 11:18:46PM +0100, Thomas Gleixner wrote:
> From: Thomas Gleixner <tglx@linutronix.de>
> 
> instead of fiddling with MSI descriptors.
> 
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Cc: Juergen Gross <jgross@suse.com>
> Cc: xen-devel@lists.xenproject.org
> ---
> V3: Use pci_dev->msix_enabled.
> ---
>  arch/x86/pci/xen.c |    9 ++-------
>  1 file changed, 2 insertions(+), 7 deletions(-)

Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>

Jason

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 03/35] x86/apic/msi: Use PCI device MSI property
  2021-12-10 22:18 ` [patch V3 03/35] x86/apic/msi: Use PCI device MSI property Thomas Gleixner
  2021-12-11 10:52   ` Greg Kroah-Hartman
@ 2021-12-13 13:59   ` Jason Gunthorpe
  1 sibling, 0 replies; 83+ messages in thread
From: Jason Gunthorpe @ 2021-12-13 13:59 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Megha Dey, Ashok Raj, linux-pci, Cedric Le Goater, Juergen Gross,
	xen-devel, Arnd Bergmann, Michael Ellerman,
	Benjamin Herrenschmidt, linuxppc-dev, Greg Kroah-Hartman,
	Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor, Nishanth Menon,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

On Fri, Dec 10, 2021 at 11:18:47PM +0100, Thomas Gleixner wrote:
> From: Thomas Gleixner <tglx@linutronix.de>
> 
> instead of fiddling with MSI descriptors.
> 
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> V3: Use pci_dev->msix_enabled - Jason
> ---
>  arch/x86/kernel/apic/msi.c |    5 +----
>  1 file changed, 1 insertion(+), 4 deletions(-)

Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>

Jason

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 04/35] genirq/msi: Use PCI device property
  2021-12-10 22:18 ` [patch V3 04/35] genirq/msi: Use PCI device property Thomas Gleixner
@ 2021-12-13 13:59   ` Jason Gunthorpe
  0 siblings, 0 replies; 83+ messages in thread
From: Jason Gunthorpe @ 2021-12-13 13:59 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Megha Dey, Ashok Raj, linux-pci, Cedric Le Goater, Juergen Gross,
	xen-devel, Arnd Bergmann, Michael Ellerman,
	Benjamin Herrenschmidt, linuxppc-dev, Greg Kroah-Hartman,
	Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor, Nishanth Menon,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

On Fri, Dec 10, 2021 at 11:18:49PM +0100, Thomas Gleixner wrote:
> From: Thomas Gleixner <tglx@linutronix.de>
> 
> to determine whether this is MSI or MSIX instead of consulting MSI
> descriptors.
> 
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> V2: Use PCI device property - Jason
> ---
>  kernel/irq/msi.c |   17 ++---------------
>  1 file changed, 2 insertions(+), 15 deletions(-)

Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>

Jason

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 05/35] powerpc/cell/axon_msi: Use PCI device property
  2021-12-10 22:18 ` [patch V3 05/35] powerpc/cell/axon_msi: " Thomas Gleixner
  2021-12-11 15:21   ` Arnd Bergmann
@ 2021-12-13 14:01   ` Jason Gunthorpe
  1 sibling, 0 replies; 83+ messages in thread
From: Jason Gunthorpe @ 2021-12-13 14:01 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Megha Dey, Ashok Raj, linux-pci, Cedric Le Goater, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Juergen Gross, xen-devel, Greg Kroah-Hartman, Bjorn Helgaas,
	Stuart Yoder, Laurentiu Tudor, Nishanth Menon, Tero Kristo,
	Santosh Shilimkar, linux-arm-kernel, Vinod Koul, dmaengine,
	Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel, iommu,
	Jassi Brar, Peter Ujfalusi, Sinan Kaya

On Fri, Dec 10, 2021 at 11:18:51PM +0100, Thomas Gleixner wrote:
> From: Thomas Gleixner <tglx@linutronix.de>
> 
> instead of fiddling with MSI descriptors.
> 
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Cc: Arnd Bergmann <arnd@arndb.de>
> Cc: Michael Ellerman <mpe@ellerman.id.au>
> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> Cc: linuxppc-dev@lists.ozlabs.org
> ---
> V3: Use pci_dev property - Jason
> V2: Invoke the function with the correct number of arguments - Andy
> ---
>  arch/powerpc/platforms/cell/axon_msi.c |    5 +----
>  1 file changed, 1 insertion(+), 4 deletions(-)

Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>

Jason

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 06/35] powerpc/pseries/msi: Use PCI device properties
  2021-12-10 22:18 ` [patch V3 06/35] powerpc/pseries/msi: Use PCI device properties Thomas Gleixner
@ 2021-12-13 14:04   ` Jason Gunthorpe
  0 siblings, 0 replies; 83+ messages in thread
From: Jason Gunthorpe @ 2021-12-13 14:04 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Megha Dey, Ashok Raj, linux-pci, Cedric Le Goater,
	Michael Ellerman, linuxppc-dev, Juergen Gross, xen-devel,
	Arnd Bergmann, Benjamin Herrenschmidt, Greg Kroah-Hartman,
	Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor, Nishanth Menon,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

On Fri, Dec 10, 2021 at 11:18:52PM +0100, Thomas Gleixner wrote:
> From: Thomas Gleixner <tglx@linutronix.de>
> 
> instead of fiddling with MSI descriptors.
> 
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Cc: Michael Ellerman <mpe@ellerman.id.au>
> Cc: linuxppc-dev@lists.ozlabs.org
> ---
> V3: Use pci_dev->msix_enabled - Jason
> ---
>  arch/powerpc/platforms/pseries/msi.c |    3 +--
>  1 file changed, 1 insertion(+), 2 deletions(-)

Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
 
> --- a/arch/powerpc/platforms/pseries/msi.c
> +++ b/arch/powerpc/platforms/pseries/msi.c
> @@ -448,8 +448,7 @@ static int pseries_msi_ops_prepare(struc
>  				   int nvec, msi_alloc_info_t *arg)
>  {
>  	struct pci_dev *pdev = to_pci_dev(dev);
> -	struct msi_desc *desc = first_pci_msi_entry(pdev);
> -	int type = desc->pci.msi_attrib.is_msix ? PCI_CAP_ID_MSIX : PCI_CAP_ID_MSI;
> +	int type = pdev->msix_enabled ? PCI_CAP_ID_MSIX : PCI_CAP_ID_MSI;

Long term it probably makes sense to change the msi_domain_ops so that
it has PCI versions of the ops to use in places like this that hard
assume PCI is the only kind of MSI at all.

If the non-PCI op isn't provided then things like IMS would be denied
- and the PCI op can directly pass in a pci_dev * so we don't have all
these to_pci_devs() in drivers.

Jason

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 25/35] powerpc/pseries/msi: Let core code check for contiguous entries
  2021-12-10 22:19 ` [patch V3 25/35] powerpc/pseries/msi: Let core code check for contiguous entries Thomas Gleixner
@ 2021-12-13 14:05   ` Jason Gunthorpe
  0 siblings, 0 replies; 83+ messages in thread
From: Jason Gunthorpe @ 2021-12-13 14:05 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Megha Dey, Ashok Raj, linux-pci, Cedric Le Goater,
	Greg Kroah-Hartman, Michael Ellerman, Benjamin Herrenschmidt,
	linuxppc-dev, Juergen Gross, xen-devel, Arnd Bergmann,
	Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor, Nishanth Menon,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

On Fri, Dec 10, 2021 at 11:19:22PM +0100, Thomas Gleixner wrote:
> From: Thomas Gleixner <tglx@linutronix.de>
> 
> Set the domain info flag and remove the check.
> 
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Cc: Michael Ellerman <mpe@ellerman.id.au>
> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> Cc: "Cédric Le Goater" <clg@kaod.org>
> Cc: linuxppc-dev@lists.ozlabs.org
> 
> ---
> V2: Remove it completely - Cedric
> ---
>  arch/powerpc/platforms/pseries/msi.c |   33 ++++++++-------------------------
>  1 file changed, 8 insertions(+), 25 deletions(-)

Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>

Jason
 

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 26/35] genirq/msi: Provide interface to retrieve Linux interrupt number
  2021-12-10 22:19 ` [patch V3 26/35] genirq/msi: Provide interface to retrieve Linux interrupt number Thomas Gleixner
@ 2021-12-13 14:22   ` Jason Gunthorpe
  0 siblings, 0 replies; 83+ messages in thread
From: Jason Gunthorpe @ 2021-12-13 14:22 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Megha Dey, Ashok Raj, linux-pci, Cedric Le Goater,
	Greg Kroah-Hartman, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor, Nishanth Menon,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

On Fri, Dec 10, 2021 at 11:19:23PM +0100, Thomas Gleixner wrote:
> From: Thomas Gleixner <tglx@linutronix.de>
> 
> This allows drivers to retrieve the Linux interrupt number instead of
> fiddling with MSI descriptors.
> 
> msi_get_virq() returns the Linux interrupt number or 0 in case that there
> is no entry for the given MSI index.
> 
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> ---
> V2: Simplify the implementation and let PCI deal with the PCI specialities - Marc
> ---
>  include/linux/msi.h |    2 ++
>  kernel/irq/msi.c    |   36 ++++++++++++++++++++++++++++++++++++
>  2 files changed, 38 insertions(+)

Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>

Jason

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 27/35] PCI/MSI: Use __msi_get_virq() in pci_get_vector()
  2021-12-10 22:19 ` [patch V3 27/35] PCI/MSI: Use __msi_get_virq() in pci_get_vector() Thomas Gleixner
@ 2021-12-13 14:23   ` Jason Gunthorpe
  0 siblings, 0 replies; 83+ messages in thread
From: Jason Gunthorpe @ 2021-12-13 14:23 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Megha Dey, Ashok Raj, linux-pci, Cedric Le Goater,
	Greg Kroah-Hartman, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor, Nishanth Menon,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

On Fri, Dec 10, 2021 at 11:19:25PM +0100, Thomas Gleixner wrote:
> From: Thomas Gleixner <tglx@linutronix.de>
> 
> Use msi_get_vector() and handle the return value to be compatible.
> 
> No functional change intended.
> 
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> ---
> V2: Handle the INTx case directly instead of trying to be overly smart - Marc
> ---
>  drivers/pci/msi/msi.c |   25 +++++--------------------
>  1 file changed, 5 insertions(+), 20 deletions(-)

Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>

Jason

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 12/35] soc: ti: ti_sci_inta_msi: Allocate MSI device data on first use
  2021-12-10 22:19 ` [patch V3 12/35] soc: ti: ti_sci_inta_msi: " Thomas Gleixner
  2021-12-11 15:22   ` Arnd Bergmann
@ 2021-12-13 17:56   ` Nishanth Menon
  1 sibling, 0 replies; 83+ messages in thread
From: Nishanth Menon @ 2021-12-13 17:56 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Tero Kristo,
	Santosh Shilimkar, linux-arm-kernel, Juergen Gross, xen-devel,
	Arnd Bergmann, Michael Ellerman, Benjamin Herrenschmidt,
	linuxppc-dev, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

On 23:19-20211210, Thomas Gleixner wrote:
> From: Thomas Gleixner <tglx@linutronix.de>
> 
> Allocate the MSI device data on first invocation of the allocation function.
> 
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
> Cc: Nishanth Menon <nm@ti.com>
> Cc: Tero Kristo <kristo@kernel.org>
> Cc: Santosh Shilimkar <ssantosh@kernel.org>
> Cc: linux-arm-kernel@lists.infradead.org


Acked-by: Nishanth Menon <nm@ti.com>

-- 
Regards,
Nishanth Menon
Key (0xDDB5849D1736249D)/Fingerprint: F8A2 8693 54EB 8232 17A3  1A34 DDB5 849D 1736 249D

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 22/35] soc: ti: ti_sci_inta_msi: Use msi_desc::msi_index
  2021-12-10 22:19 ` [patch V3 22/35] soc: ti: ti_sci_inta_msi: " Thomas Gleixner
@ 2021-12-13 17:57   ` Nishanth Menon
  0 siblings, 0 replies; 83+ messages in thread
From: Nishanth Menon @ 2021-12-13 17:57 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Tero Kristo,
	Santosh Shilimkar, linux-arm-kernel, Juergen Gross, xen-devel,
	Arnd Bergmann, Michael Ellerman, Benjamin Herrenschmidt,
	linuxppc-dev, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

On 23:19-20211210, Thomas Gleixner wrote:
> From: Thomas Gleixner <tglx@linutronix.de>
> 
> Use the common msi_index member and get rid of the pointless wrapper struct.
> 
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
> Cc: Nishanth Menon <nm@ti.com>
> Cc: Tero Kristo <kristo@kernel.org>
> Cc: Santosh Shilimkar <ssantosh@kernel.org>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: linux-arm-kernel@lists.infradead.org

Acked-by: Nishanth Menon <nm@ti.com>
-- 
Regards,
Nishanth Menon
Key (0xDDB5849D1736249D)/Fingerprint: F8A2 8693 54EB 8232 17A3  1A34 DDB5 849D 1736 249D

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 34/35] soc: ti: ti_sci_inta_msi: Get rid of ti_sci_inta_msi_get_virq()
  2021-12-10 22:19 ` [patch V3 34/35] soc: ti: ti_sci_inta_msi: Get rid of ti_sci_inta_msi_get_virq() Thomas Gleixner
  2021-12-11 15:24   ` Arnd Bergmann
  2021-12-13  5:15   ` Vinod Koul
@ 2021-12-13 17:57   ` Nishanth Menon
  2 siblings, 0 replies; 83+ messages in thread
From: Nishanth Menon @ 2021-12-13 17:57 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Peter Ujfalusi, Vinod Koul,
	dmaengine, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor, Tero Kristo,
	Santosh Shilimkar, linux-arm-kernel, Mark Rutland, Will Deacon,
	Robin Murphy, Joerg Roedel, iommu, Jassi Brar, Sinan Kaya

On 23:19-20211210, Thomas Gleixner wrote:
> From: Thomas Gleixner <tglx@linutronix.de>
> 
> Just use the core function msi_get_virq().
> 
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
> Cc: Peter Ujfalusi <peter.ujfalusi@gmail.com>
> Cc: Vinod Koul <vkoul@kernel.org>
> Cc: dmaengine@vger.kernel.org

Acked-by: Nishanth Menon <nm@ti.com>

-- 
Regards,
Nishanth Menon
Key (0xDDB5849D1736249D)/Fingerprint: F8A2 8693 54EB 8232 17A3  1A34 DDB5 849D 1736 249D

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2
  2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
                   ` (34 preceding siblings ...)
  2021-12-10 22:19 ` [patch V3 35/35] dmaengine: qcom_hidma: Cleanup MSI handling Thomas Gleixner
@ 2021-12-13 18:29 ` Nishanth Menon
  2021-12-14  9:41   ` Thomas Gleixner
  35 siblings, 1 reply; 83+ messages in thread
From: Nishanth Menon @ 2021-12-13 18:29 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Greg Kroah-Hartman, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

On 23:18-20211210, Thomas Gleixner wrote:
[...]

> 
> It's also available from git:
> 
>      git://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git msi-v3-part-2

[...]

> ---
>  drivers/dma/ti/k3-udma-private.c                    |    6 
>  drivers/dma/ti/k3-udma.c                            |   14 -
>  drivers/irqchip/irq-ti-sci-inta.c                   |    2 
>  drivers/soc/ti/k3-ringacc.c                         |    6 
>  drivers/soc/ti/ti_sci_inta_msi.c                    |   22 --
>  include/linux/soc/ti/ti_sci_inta_msi.h              |    1 

Also while testing on TI K3 platforms, I noticed:

msi_device_data_release/msi_device_destroy_sysfs in am64xx-evm / j7200
[1] https://gist.github.com/nmenon/36899c7819681026cfe1ef185fb95f33#file-am64xx-evm-txt-L1018
[2] https://gist.github.com/nmenon/36899c7819681026cfe1ef185fb95f33#file-j7200-evm-txt-L1076

Which is not present in vanilla v5.16-rc4

v5.16-rc4:
https://gist.github.com/nmenon/1aee3f0a7da47d5e9dcb7336b32a70cb

msi-v3-part-2:
https://gist.github.com/nmenon/36899c7819681026cfe1ef185fb95f33

(.config https://gist.github.com/nmenon/ec6f95303828abf16a64022d8e3a269f)

Vs:
next-20211208:
https://gist.github.com/nmenon/f5ca3558bd5c1fbe62dc5ceb420b536e

-- 
Regards,
Nishanth Menon
Key (0xDDB5849D1736249D)/Fingerprint: F8A2 8693 54EB 8232 17A3  1A34 DDB5 849D 1736 249D

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2
  2021-12-13 18:29 ` [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Nishanth Menon
@ 2021-12-14  9:41   ` Thomas Gleixner
  2021-12-14 16:22     ` Nishanth Menon
  0 siblings, 1 reply; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-14  9:41 UTC (permalink / raw)
  To: Nishanth Menon
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Greg Kroah-Hartman, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya, linux-wireless,
	Johannes Berg

On Mon, Dec 13 2021 at 12:29, Nishanth Menon wrote:
> On 23:18-20211210, Thomas Gleixner wrote:
> Also while testing on TI K3 platforms, I noticed:
>
> msi_device_data_release/msi_device_destroy_sysfs in am64xx-evm / j7200

The warning complains about a device being released with MSI descriptors
still attached to the device. This was added by:

  5b012cede0f7 ("device: Add device::msi_data pointer and struct msi_device_data")

That's not a regression caused by this commit. The warning is just
exposing an already existing problem in the iwlwifi driver, which seems
to do:

   probe()
     setup_pci_msi[x]_interrupts()
     start_drv()
       if (try_to_load_firmware() == FAIL)
       	   device_release_driver()
                ...
                msi_device_data_release()
                    WARN()

Thanks,

        tglx

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2
  2021-12-14  9:41   ` Thomas Gleixner
@ 2021-12-14 16:22     ` Nishanth Menon
  2021-12-14 16:36       ` Thomas Gleixner
  0 siblings, 1 reply; 83+ messages in thread
From: Nishanth Menon @ 2021-12-14 16:22 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Greg Kroah-Hartman, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya, linux-wireless,
	Johannes Berg

On 10:41-20211214, Thomas Gleixner wrote:
> On Mon, Dec 13 2021 at 12:29, Nishanth Menon wrote:
> > On 23:18-20211210, Thomas Gleixner wrote:
> > Also while testing on TI K3 platforms, I noticed:
> >
> > msi_device_data_release/msi_device_destroy_sysfs in am64xx-evm / j7200
> 
> The warning complains about a device being released with MSI descriptors
> still attached to the device. This was added by:
> 
>   5b012cede0f7 ("device: Add device::msi_data pointer and struct msi_device_data")
> 
> That's not a regression caused by this commit. The warning is just
> exposing an already existing problem in the iwlwifi driver, which seems
> to do:
> 
>    probe()
>      setup_pci_msi[x]_interrupts()
>      start_drv()
>        if (try_to_load_firmware() == FAIL)
>        	   device_release_driver()
>                 ...
>                 msi_device_data_release()
>                     WARN()
> 

Agreed that the warning is fine, the null pointer exception that follows
[1] [2] it however does'nt look right and it can be trivially fixed with the
following fixup for ee90787487bc ("genirq/msi: Provide
msi_device_populate/destroy_sysfs()") below, with that the log looks
like [3] - the warn is good, the null pointer exception and resultant
crash could be avoided (not saying this is the best solution):

diff --git a/kernel/irq/msi.c b/kernel/irq/msi.c
index ab5e83f41188..24edb870c66f 100644
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -252,11 +252,14 @@ int msi_device_populate_sysfs(struct device *dev)
  */
 void msi_device_destroy_sysfs(struct device *dev)
 {
-	const struct attribute_group **msi_irq_groups = dev->msi.data->attrs;
+	const struct attribute_group **msi_irq_groups;
 	struct device_attribute *dev_attr;
 	struct attribute **msi_attrs;
 	int count = 0;
 
+	if (!dev->msi.data)
+		return;
+	msi_irq_groups = dev->msi.data->attrs;
 	dev->msi.data->attrs = NULL;
 	if (!msi_irq_groups)
 		return;

[1] https://gist.github.com/nmenon/36899c7819681026cfe1ef185fb95f33#file-am64xx-evm-txt-L1049
[2] https://gist.github.com/nmenon/36899c7819681026cfe1ef185fb95f33#file-j7200-evm-txt-L1111

[3] https://gist.github.com/nmenon/575afe7d04463026a7e420a76c2c1c5b
	https://gist.github.com/nmenon/575afe7d04463026a7e420a76c2c1c5b#file-am64xx-evm-txt-L1018
	https://gist.github.com/nmenon/575afe7d04463026a7e420a76c2c1c5b#file-j7200-evm-txt-L1053
-- 
Regards,
Nishanth Menon
Key (0xDDB5849D1736249D)/Fingerprint: F8A2 8693 54EB 8232 17A3  1A34 DDB5 849D 1736 249D

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* Re: [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2
  2021-12-14 16:22     ` Nishanth Menon
@ 2021-12-14 16:36       ` Thomas Gleixner
  2021-12-14 17:03         ` Thomas Gleixner
  0 siblings, 1 reply; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-14 16:36 UTC (permalink / raw)
  To: Nishanth Menon
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Greg Kroah-Hartman, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya, linux-wireless,
	Johannes Berg

On Tue, Dec 14 2021 at 10:22, Nishanth Menon wrote:
> On 10:41-20211214, Thomas Gleixner wrote:
> Agreed that the warning is fine, the null pointer exception that follows
> [1] [2] it however does'nt look right and it can be trivially fixed with the
> following fixup for ee90787487bc ("genirq/msi: Provide
> msi_device_populate/destroy_sysfs()") below, with that the log looks
> like [3] - the warn is good, the null pointer exception and resultant
> crash could be avoided (not saying this is the best solution):

Aaargh.

[   13.478122] Call trace:
[   13.509042]  msi_device_destroy_sysfs+0x18/0x88
[   13.509058]  msi_domain_free_irqs+0x34/0x58
[   13.509064]  pci_msi_teardown_msi_irqs+0x30/0x3c
[   13.509072]  free_msi_irqs+0x78/0xd4
[   13.509077]  pci_disable_msix+0x138/0x164
[   13.529930]  pcim_release+0x70/0x238
[   13.529942]  devres_release_all+0x9c/0xfc
[   13.529951]  device_release_driver_internal+0x1a0/0x244
[   13.542725]  device_release_driver+0x18/0x24
[   13.542741]  iwl_req_fw_callback+0x1a28/0x1ddc [iwlwifi]
[   13.552308]  request_firmware_work_func+0x50/0x9c
[   13.552320]  process_one_work+0x194/0x25c

That's not a driver problem, that's an ordering issue vs. the devres
muck. Let me go back to the drawing board. Sigh...

Thanks,

        tglx


^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2
  2021-12-14 16:36       ` Thomas Gleixner
@ 2021-12-14 17:03         ` Thomas Gleixner
  2021-12-14 20:15           ` Thomas Gleixner
  0 siblings, 1 reply; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-14 17:03 UTC (permalink / raw)
  To: Nishanth Menon
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Greg Kroah-Hartman, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya, linux-wireless,
	Johannes Berg

On Tue, Dec 14 2021 at 17:36, Thomas Gleixner wrote:
> On Tue, Dec 14 2021 at 10:22, Nishanth Menon wrote:
>> On 10:41-20211214, Thomas Gleixner wrote:
> [   13.478122] Call trace:
> [   13.509042]  msi_device_destroy_sysfs+0x18/0x88
> [   13.509058]  msi_domain_free_irqs+0x34/0x58
> [   13.509064]  pci_msi_teardown_msi_irqs+0x30/0x3c
> [   13.509072]  free_msi_irqs+0x78/0xd4
> [   13.509077]  pci_disable_msix+0x138/0x164
> [   13.529930]  pcim_release+0x70/0x238
> [   13.529942]  devres_release_all+0x9c/0xfc
> [   13.529951]  device_release_driver_internal+0x1a0/0x244
> [   13.542725]  device_release_driver+0x18/0x24
> [   13.542741]  iwl_req_fw_callback+0x1a28/0x1ddc [iwlwifi]
> [   13.552308]  request_firmware_work_func+0x50/0x9c
> [   13.552320]  process_one_work+0x194/0x25c
>
> That's not a driver problem, that's an ordering issue vs. the devres
> muck. Let me go back to the drawing board. Sigh...

Which is pretty obvious why:

   pcim_enable_device()
        devres_alloc(pcim_release...);
        ...
        pci_irq_alloc()
          msi_setup_device_data()
             devres_alloc(msi_device_data_release, ...)

and once the device is released:

    msi_device_data_release()
    ...
    pcim_release()
       pci_disable_msi[x]()

Groan....

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2
  2021-12-14 17:03         ` Thomas Gleixner
@ 2021-12-14 20:15           ` Thomas Gleixner
  2021-12-14 20:56             ` Nishanth Menon
  0 siblings, 1 reply; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-14 20:15 UTC (permalink / raw)
  To: Nishanth Menon
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Greg Kroah-Hartman, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya, linux-wireless,
	Johannes Berg

Nishanth,

On Tue, Dec 14 2021 at 18:03, Thomas Gleixner wrote:
>     msi_device_data_release()
>     ...
>     pcim_release()
>        pci_disable_msi[x]()
>
> Groan....

I think I managed to distangle this. Can you please give:

   git://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git msi-v4-part-2

and/or the full pile:

   git://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git msi-v4-part-3

a test ride?

Thanks,

        tglx

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2
  2021-12-14 20:15           ` Thomas Gleixner
@ 2021-12-14 20:56             ` Nishanth Menon
  2021-12-14 21:19               ` Thomas Gleixner
  0 siblings, 1 reply; 83+ messages in thread
From: Nishanth Menon @ 2021-12-14 20:56 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Greg Kroah-Hartman, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya, linux-wireless,
	Johannes Berg

On 21:15-20211214, Thomas Gleixner wrote:
> Nishanth,
> 
> On Tue, Dec 14 2021 at 18:03, Thomas Gleixner wrote:
> >     msi_device_data_release()
> >     ...
> >     pcim_release()
> >        pci_disable_msi[x]()
> >
> > Groan....
> 
> I think I managed to distangle this. Can you please give:
> 
>    git://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git msi-v4-part-2


Umm.. I am not entirely sure what is going on.. but all kinds of weird
corruption seems to occur with msi-v4-part-2 that does'nt seem to be
present in v5.16-rc5. (I use NFS since ethernet in K3 platforms use
inta/intr and dma that is impacted by this series).

I will try and rebase your patches on v5.16-rc4 to be sure as well and
report back later today once i get some time.

[1] https://gist.github.com/nmenon/a66e022926c4c15313c45d44313d860c msi-v4-part-2
[2] https://gist.github.com/nmenon/43085664d69ad846d596e76a06ed0656  v5.16-rc5
-- 
Regards,
Nishanth Menon
Key (0xDDB5849D1736249D) / Fingerprint: F8A2 8693 54EB 8232 17A3  1A34 DDB5 849D 1736 249D

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2
  2021-12-14 20:56             ` Nishanth Menon
@ 2021-12-14 21:19               ` Thomas Gleixner
  2021-12-15 16:18                 ` Thomas Gleixner
  0 siblings, 1 reply; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-14 21:19 UTC (permalink / raw)
  To: Nishanth Menon
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Greg Kroah-Hartman, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya, linux-wireless,
	Johannes Berg

Nishanth,

On Tue, Dec 14 2021 at 14:56, Nishanth Menon wrote:
> On 21:15-20211214, Thomas Gleixner wrote:
>> I think I managed to distangle this. Can you please give:
>> 
>>    git://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git msi-v4-part-2
>
>
> Umm.. I am not entirely sure what is going on.. but all kinds of weird
> corruption seems to occur with msi-v4-part-2 that does'nt seem to be
> present in v5.16-rc5. (I use NFS since ethernet in K3 platforms use
> inta/intr and dma that is impacted by this series).
>
> I will try and rebase your patches on v5.16-rc4 to be sure as well and
> report back later today once i get some time.
>
> [1] https://gist.github.com/nmenon/a66e022926c4c15313c45d44313d860c msi-v4-part-2
> [2] https://gist.github.com/nmenon/43085664d69ad846d596e76a06ed0656  v5.16-rc5

thanks for trying. I'll have a look again with brain awake tomorrow
morning.

Thanks,

        tglx

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2
  2021-12-14 21:19               ` Thomas Gleixner
@ 2021-12-15 16:18                 ` Thomas Gleixner
  2021-12-15 16:35                   ` Thomas Gleixner
  0 siblings, 1 reply; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-15 16:18 UTC (permalink / raw)
  To: Nishanth Menon
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Greg Kroah-Hartman, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya, linux-wireless,
	Johannes Berg

On Tue, Dec 14 2021 at 22:19, Thomas Gleixner wrote:
> On Tue, Dec 14 2021 at 14:56, Nishanth Menon wrote:
>
> thanks for trying. I'll have a look again with brain awake tomorrow
> morning.

Morning was busy with other things, but I found what my sleepy brain
managed to do wrong yesterday evening.

Let me reintegrate the pile and I'll send you an update.

Thanks,

        tglx

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2
  2021-12-15 16:18                 ` Thomas Gleixner
@ 2021-12-15 16:35                   ` Thomas Gleixner
  2021-12-15 18:08                     ` Nishanth Menon
                                       ` (2 more replies)
  0 siblings, 3 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-15 16:35 UTC (permalink / raw)
  To: Nishanth Menon
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Greg Kroah-Hartman, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya, linux-wireless,
	Johannes Berg

On Wed, Dec 15 2021 at 17:18, Thomas Gleixner wrote:

> On Tue, Dec 14 2021 at 22:19, Thomas Gleixner wrote:
>> On Tue, Dec 14 2021 at 14:56, Nishanth Menon wrote:
>>
>> thanks for trying. I'll have a look again with brain awake tomorrow
>> morning.
>
> Morning was busy with other things, but I found what my sleepy brain
> managed to do wrong yesterday evening.
>
> Let me reintegrate the pile and I'll send you an update.

   git://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git msi-v4.1-part-2
   git://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git msi-v4.2-part-3

That should cure the problem.


^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V4 09-01/35] PCI/MSI: Decouple MSI[-X] disable from pcim_release()
  2021-12-10 22:18 ` [patch V3 09/35] PCI/MSI: Allocate MSI device data on first use Thomas Gleixner
@ 2021-12-15 17:16   ` Thomas Gleixner
  2021-12-15 17:19     ` [patch V4 09-02/35] PCI/MSI: Allocate MSI device data on first use Thomas Gleixner
  2021-12-15 17:46     ` [patch V4 09-01/35] PCI/MSI: Decouple MSI[-X] disable from pcim_release() Greg Kroah-Hartman
  0 siblings, 2 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-15 17:16 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Bjorn Helgaas,
	Juergen Gross, xen-devel, Arnd Bergmann, Michael Ellerman,
	Benjamin Herrenschmidt, linuxppc-dev, Stuart Yoder,
	Laurentiu Tudor, Nishanth Menon, Tero Kristo, Santosh Shilimkar,
	linux-arm-kernel, Vinod Koul, dmaengine, Mark Rutland,
	Will Deacon, Robin Murphy, Joerg Roedel, iommu, Jassi Brar,
	Peter Ujfalusi, Sinan Kaya

The MSI core will introduce runtime allocation of MSI related data. This
data will be devres managed and has to be set up before enabling
PCI/MSI[-X]. This would introduce an ordering issue vs. pcim_release().

The setup order is:

   pcim_enable_device()
	devres_alloc(pcim_release...);
	...
	pci_irq_alloc()
	  msi_setup_device_data()
	     devres_alloc(msi_device_data_release, ...)

and once the device is released these release functions are invoked in the
opposite order:

    msi_device_data_release()
    ...
    pcim_release()
       pci_disable_msi[x]()

which is obviously wrong, because pci_disable_msi[x]() requires the MSI
data to be available to tear down the MSI[-X] interrupts.

Remove the MSI[-X] teardown from pcim_release() and add an explicit action
to be installed on the attempt of enabling PCI/MSI[-X].

This allows the MSI core data allocation to be ordered correctly in a
subsequent step.

Reported-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
V4: New patch
---
 drivers/pci/msi/msi.c |   33 +++++++++++++++++++++++++++++++++
 drivers/pci/pci.c     |    5 -----
 include/linux/pci.h   |    3 ++-
 3 files changed, 35 insertions(+), 6 deletions(-)

--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -341,6 +341,31 @@ void pci_restore_msi_state(struct pci_de
 }
 EXPORT_SYMBOL_GPL(pci_restore_msi_state);
 
+static void pcim_msi_release(void *pcidev)
+{
+	struct pci_dev *dev = pcidev;
+
+	dev->is_msi_managed = false;
+	pci_free_irq_vectors(dev);
+}
+
+/*
+ * Needs to be separate from pcim_release to prevent an ordering problem
+ * vs. msi_device_data_release() in the MSI core code.
+ */
+static int pcim_setup_msi_release(struct pci_dev *dev)
+{
+	int ret;
+
+	if (!pci_is_managed(dev) || dev->is_msi_managed)
+		return 0;
+
+	ret = devm_add_action(&dev->dev, pcim_msi_release, dev);
+	if (!ret)
+		dev->is_msi_managed = true;
+	return ret;
+}
+
 static struct msi_desc *
 msi_setup_entry(struct pci_dev *dev, int nvec, struct irq_affinity *affd)
 {
@@ -884,6 +909,10 @@ static int __pci_enable_msi_range(struct
 	if (nvec > maxvec)
 		nvec = maxvec;
 
+	rc = pcim_setup_msi_release(dev);
+	if (rc)
+		return rc;
+
 	for (;;) {
 		if (affd) {
 			nvec = irq_calc_affinity_vectors(minvec, nvec, affd);
@@ -927,6 +956,10 @@ static int __pci_enable_msix_range(struc
 	if (WARN_ON_ONCE(dev->msix_enabled))
 		return -EINVAL;
 
+	rc = pcim_setup_msi_release(dev);
+	if (rc)
+		return rc;
+
 	for (;;) {
 		if (affd) {
 			nvec = irq_calc_affinity_vectors(minvec, nvec, affd);
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -2024,11 +2024,6 @@ static void pcim_release(struct device *
 	struct pci_devres *this = res;
 	int i;
 
-	if (dev->msi_enabled)
-		pci_disable_msi(dev);
-	if (dev->msix_enabled)
-		pci_disable_msix(dev);
-
 	for (i = 0; i < DEVICE_COUNT_RESOURCE; i++)
 		if (this->region_mask & (1 << i))
 			pci_release_region(dev, i);
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -425,7 +425,8 @@ struct pci_dev {
 	unsigned int	ats_enabled:1;		/* Address Translation Svc */
 	unsigned int	pasid_enabled:1;	/* Process Address Space ID */
 	unsigned int	pri_enabled:1;		/* Page Request Interface */
-	unsigned int	is_managed:1;
+	unsigned int	is_managed:1;		/* Managed via devres */
+	unsigned int	is_msi_managed:1;	/* MSI release via devres installed */
 	unsigned int	needs_freset:1;		/* Requires fundamental reset */
 	unsigned int	state_saved:1;
 	unsigned int	is_physfn:1;

^ permalink raw reply	[flat|nested] 83+ messages in thread

* [patch V4 09-02/35] PCI/MSI: Allocate MSI device data on first use
  2021-12-15 17:16   ` [patch V4 09-01/35] PCI/MSI: Decouple MSI[-X] disable from pcim_release() Thomas Gleixner
@ 2021-12-15 17:19     ` Thomas Gleixner
  2021-12-15 17:46       ` Greg Kroah-Hartman
  2021-12-15 17:46     ` [patch V4 09-01/35] PCI/MSI: Decouple MSI[-X] disable from pcim_release() Greg Kroah-Hartman
  1 sibling, 1 reply; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-15 17:19 UTC (permalink / raw)
  To: LKML
  Cc: Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Bjorn Helgaas,
	Juergen Gross, xen-devel, Arnd Bergmann, Michael Ellerman,
	Benjamin Herrenschmidt, linuxppc-dev, Stuart Yoder,
	Laurentiu Tudor, Nishanth Menon, Tero Kristo, Santosh Shilimkar,
	linux-arm-kernel, Vinod Koul, dmaengine, Mark Rutland,
	Will Deacon, Robin Murphy, Joerg Roedel, iommu, Jassi Brar,
	Peter Ujfalusi, Sinan Kaya

Allocate MSI device data on first use, i.e. when a PCI driver invokes one
of the PCI/MSI enablement functions.

Add a wrapper function to ensure that the ordering vs. pcim_msi_release()
is correct.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
V4: Adopted to ensure devres ordering
---
 drivers/pci/msi/msi.c |   17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -366,6 +366,19 @@ static int pcim_setup_msi_release(struct
 	return ret;
 }
 
+/*
+ * Ordering vs. devres: msi device data has to be installed first so that
+ * pcim_msi_release() is invoked before it on device release.
+ */
+static int pci_setup_msi_context(struct pci_dev *dev)
+{
+	int ret = msi_setup_device_data(&dev->dev);
+
+	if (!ret)
+		ret = pcim_setup_msi_release(dev);
+	return ret;
+}
+
 static struct msi_desc *
 msi_setup_entry(struct pci_dev *dev, int nvec, struct irq_affinity *affd)
 {
@@ -909,7 +922,7 @@ static int __pci_enable_msi_range(struct
 	if (nvec > maxvec)
 		nvec = maxvec;
 
-	rc = pcim_setup_msi_release(dev);
+	rc = pci_setup_msi_context(dev);
 	if (rc)
 		return rc;
 
@@ -956,7 +969,7 @@ static int __pci_enable_msix_range(struc
 	if (WARN_ON_ONCE(dev->msix_enabled))
 		return -EINVAL;
 
-	rc = pcim_setup_msi_release(dev);
+	rc = pci_setup_msi_context(dev);
 	if (rc)
 		return rc;
 

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V4 09-01/35] PCI/MSI: Decouple MSI[-X] disable from pcim_release()
  2021-12-15 17:16   ` [patch V4 09-01/35] PCI/MSI: Decouple MSI[-X] disable from pcim_release() Thomas Gleixner
  2021-12-15 17:19     ` [patch V4 09-02/35] PCI/MSI: Allocate MSI device data on first use Thomas Gleixner
@ 2021-12-15 17:46     ` Greg Kroah-Hartman
  1 sibling, 0 replies; 83+ messages in thread
From: Greg Kroah-Hartman @ 2021-12-15 17:46 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Bjorn Helgaas, Juergen Gross, xen-devel,
	Arnd Bergmann, Michael Ellerman, Benjamin Herrenschmidt,
	linuxppc-dev, Stuart Yoder, Laurentiu Tudor, Nishanth Menon,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

On Wed, Dec 15, 2021 at 06:16:44PM +0100, Thomas Gleixner wrote:
> The MSI core will introduce runtime allocation of MSI related data. This
> data will be devres managed and has to be set up before enabling
> PCI/MSI[-X]. This would introduce an ordering issue vs. pcim_release().
> 
> The setup order is:
> 
>    pcim_enable_device()
> 	devres_alloc(pcim_release...);
> 	...
> 	pci_irq_alloc()
> 	  msi_setup_device_data()
> 	     devres_alloc(msi_device_data_release, ...)
> 
> and once the device is released these release functions are invoked in the
> opposite order:
> 
>     msi_device_data_release()
>     ...
>     pcim_release()
>        pci_disable_msi[x]()
> 
> which is obviously wrong, because pci_disable_msi[x]() requires the MSI
> data to be available to tear down the MSI[-X] interrupts.
> 
> Remove the MSI[-X] teardown from pcim_release() and add an explicit action
> to be installed on the attempt of enabling PCI/MSI[-X].
> 
> This allows the MSI core data allocation to be ordered correctly in a
> subsequent step.
> 
> Reported-by: Nishanth Menon <nm@ti.com>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> V4: New patch


Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V4 09-02/35] PCI/MSI: Allocate MSI device data on first use
  2021-12-15 17:19     ` [patch V4 09-02/35] PCI/MSI: Allocate MSI device data on first use Thomas Gleixner
@ 2021-12-15 17:46       ` Greg Kroah-Hartman
  0 siblings, 0 replies; 83+ messages in thread
From: Greg Kroah-Hartman @ 2021-12-15 17:46 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Bjorn Helgaas, Juergen Gross, xen-devel,
	Arnd Bergmann, Michael Ellerman, Benjamin Herrenschmidt,
	linuxppc-dev, Stuart Yoder, Laurentiu Tudor, Nishanth Menon,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

On Wed, Dec 15, 2021 at 06:19:49PM +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.
> 
> Add a wrapper function to ensure that the ordering vs. pcim_msi_release()
> is correct.
> 
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2
  2021-12-15 16:35                   ` Thomas Gleixner
@ 2021-12-15 18:08                     ` Nishanth Menon
  2021-12-16  1:45                     ` Nishanth Menon
  2021-12-16  6:14                     ` Michael Kelley (LINUX)
  2 siblings, 0 replies; 83+ messages in thread
From: Nishanth Menon @ 2021-12-15 18:08 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Greg Kroah-Hartman, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya, linux-wireless,
	Johannes Berg

On 17:35-20211215, Thomas Gleixner wrote:
>    git://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git msi-v4.1-part-2
[...]

> That should cure the problem.

And it sure does. Thanks for looking closer and providing a fix.

https://gist.github.com/nmenon/9862a1c31b17fd6dfe0a30c54d396187
(msi-v4.1-part-2) looks clean

Also while I had detected pointer corruption in the previous v4
https://gist.github.com/nmenon/ce4d12f460db5cd511185c047d5d35d0

Running it again on v4.1 does indicate the fix is in place.
https://gist.github.com/nmenon/3231fbb0faa1b9c827b40d1ae6160626


please feel free to add:

Tested-by: Nishanth Menon <nm@ti.com>

-- 
Regards,
Nishanth Menon
Key (0xDDB5849D1736249D)/Fingerprint: F8A2 8693 54EB 8232 17A3  1A34 DDB5 849D 1736 249D

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2
  2021-12-15 16:35                   ` Thomas Gleixner
  2021-12-15 18:08                     ` Nishanth Menon
@ 2021-12-16  1:45                     ` Nishanth Menon
  2021-12-16 17:23                       ` Thomas Gleixner
  2021-12-16  6:14                     ` Michael Kelley (LINUX)
  2 siblings, 1 reply; 83+ messages in thread
From: Nishanth Menon @ 2021-12-16  1:45 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Greg Kroah-Hartman, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya, linux-wireless,
	Johannes Berg

Hi Thomas,

On 17:35-20211215, Thomas Gleixner wrote:
>    git://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git msi-v4.2-part-3

As you helped offline, summarizing the details on part3 of the series:

I was seeing failure[1] of NFS(DMA) on all TI K3 platforms:

[    1.013258] ti-bcdma 485c0100.dma-controller: Number of rings: 68
[    1.019963] ti-bcdma 485c0100.dma-controller: Failed to allocate IRQs -28
[    1.026938] ti-bcdma 485c0100.dma-controller: Failed to allocate MSI interrupts

Rationale as you explained:
"
-28 is ENOSPC, which is returned when the interrupt allocation in the
 MSI domain fails. Fix below.
"

Which turned out to be the fixup[2] you suggested and I confirm that
fixes the problem for me.

With the fixup in place:

Tested-by: Nishanth Menon <nm@ti.com>

for part 3 of the series as well.

Thanks once again for your help. Hope we can roll in the fixes for
part3.

[1] https://gist.github.com/nmenon/5971ab27aa626c022e276cc946e4b6c3
[2]
--- a/drivers/soc/ti/ti_sci_inta_msi.c
+++ b/drivers/soc/ti/ti_sci_inta_msi.c
@@ -68,6 +68,7 @@ static int ti_sci_inta_msi_alloc_descs(s
 	int set, i, count = 0;
 
 	memset(&msi_desc, 0, sizeof(msi_desc));
+	msi_desc.nvec_used = 1;
 
 	for (set = 0; set < res->sets; set++) {
 		for (i = 0; i < res->desc[set].num; i++, count++) {
-- 
Regards,
Nishanth Menon
Key (0xDDB5849D1736249D)/Fingerprint: F8A2 8693 54EB 8232 17A3  1A34 DDB5 849D 1736 249D

^ permalink raw reply	[flat|nested] 83+ messages in thread

* RE: [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2
  2021-12-15 16:35                   ` Thomas Gleixner
  2021-12-15 18:08                     ` Nishanth Menon
  2021-12-16  1:45                     ` Nishanth Menon
@ 2021-12-16  6:14                     ` Michael Kelley (LINUX)
  2 siblings, 0 replies; 83+ messages in thread
From: Michael Kelley (LINUX) @ 2021-12-16  6:14 UTC (permalink / raw)
  To: Thomas Gleixner, Nishanth Menon
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Greg Kroah-Hartman, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya, linux-wireless,
	Johannes Berg

From: Thomas Gleixner <tglx@linutronix.de> Sent: Wednesday, December 15, 2021 8:36 AM
> 
> On Wed, Dec 15 2021 at 17:18, Thomas Gleixner wrote:
> 
> > On Tue, Dec 14 2021 at 22:19, Thomas Gleixner wrote:
> >> On Tue, Dec 14 2021 at 14:56, Nishanth Menon wrote:
> >>
> >> thanks for trying. I'll have a look again with brain awake tomorrow
> >> morning.
> >
> > Morning was busy with other things, but I found what my sleepy brain
> > managed to do wrong yesterday evening.
> >
> > Let me reintegrate the pile and I'll send you an update.
> 
>    git://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git msi-v4.1-part-2
>    git://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git msi-v4.2-part-3
> 
> That should cure the problem.

Tested the msi-v4.2-part-3 tag in two different Azure/Hyper-V VMs.  One
is a Generation 1 VM that has legacy PCI devices and one is a Generation 2
VM with no legacy PCI devices.   Tested hot add and remove of Mellanox
CX-3 and CX-4 SR-IOV NIC virtual functions that are directly mapped into the
VM.  Also tested local NVMe devices directly mapped into one of the VMs.

No issues encountered.  So for Azure/Hyper-V specifically,

Tested-by: Michael Kelley <mikelley@microsoft.com>


^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2
  2021-12-16  1:45                     ` Nishanth Menon
@ 2021-12-16 17:23                       ` Thomas Gleixner
  0 siblings, 0 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-16 17:23 UTC (permalink / raw)
  To: Nishanth Menon
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Greg Kroah-Hartman, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya, linux-wireless,
	Johannes Berg

Nishanth,

On Wed, Dec 15 2021 at 19:45, Nishanth Menon wrote:
> On 17:35-20211215, Thomas Gleixner wrote:
> Thanks once again for your help. Hope we can roll in the fixes for
> part3.

Sure, it's only the one-liner for ti sci. Got it folded already.

Thanks for your help and testing!

       tglx

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 28/35] PCI/MSI: Simplify pci_irq_get_affinity()
  2021-12-10 22:19 ` [patch V3 28/35] PCI/MSI: Simplify pci_irq_get_affinity() Thomas Gleixner
@ 2021-12-17 22:30   ` Nathan Chancellor
  2021-12-18 10:25     ` Thomas Gleixner
  2022-01-30 17:12   ` Guenter Roeck
  1 sibling, 1 reply; 83+ messages in thread
From: Nathan Chancellor @ 2021-12-17 22:30 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Juergen Gross, xen-devel,
	Arnd Bergmann, Michael Ellerman, Benjamin Herrenschmidt,
	linuxppc-dev, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, linux-arm-kernel,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

Hi Thomas,

On Fri, Dec 10, 2021 at 11:19:26PM +0100, Thomas Gleixner wrote:
> From: Thomas Gleixner <tglx@linutronix.de>
> 
> Replace open coded MSI descriptor chasing and use the proper accessor
> functions instead.
> 
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>

Apologies if this has already been reported somewhere else or already
fixed, I did a search of all of lore and did not see anything similar to
it and I did not see any new commits in -tip around this.

I just bisected a boot failure on my AMD test desktop to this patch as
commit f48235900182 ("PCI/MSI: Simplify pci_irq_get_affinity()") in
-next. It looks like there is a problem with the NVMe drive after this
change according to the logs. Given that the hard drive is not getting
mounted for journald to write logs to, I am not really sure how to get
them from the machine so I have at least taken a picture of what I see
on my screen; open to ideas on that front!

https://github.com/nathanchance/bug-files/blob/0d25d78b5bc1d5e9c15192b3bc80676364de8287/f48235900182/crash.jpg

Please let me know what information I can provide to make debugging this
easier and I am more than happy to apply and test patches as needed.

Cheers,
Nathan

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 28/35] PCI/MSI: Simplify pci_irq_get_affinity()
  2021-12-17 22:30   ` Nathan Chancellor
@ 2021-12-18 10:25     ` Thomas Gleixner
  2021-12-18 19:04       ` Nathan Chancellor
  2021-12-18 20:25       ` Cédric Le Goater
  0 siblings, 2 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-18 10:25 UTC (permalink / raw)
  To: Nathan Chancellor
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Juergen Gross, xen-devel,
	Arnd Bergmann, Michael Ellerman, Benjamin Herrenschmidt,
	linuxppc-dev, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, linux-arm-kernel,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

On Fri, Dec 17 2021 at 15:30, Nathan Chancellor wrote:
> On Fri, Dec 10, 2021 at 11:19:26PM +0100, Thomas Gleixner wrote:
> I just bisected a boot failure on my AMD test desktop to this patch as
> commit f48235900182 ("PCI/MSI: Simplify pci_irq_get_affinity()") in
> -next. It looks like there is a problem with the NVMe drive after this
> change according to the logs. Given that the hard drive is not getting
> mounted for journald to write logs to, I am not really sure how to get
> them from the machine so I have at least taken a picture of what I see
> on my screen; open to ideas on that front!

Bah. Fix below.

Thanks,

        tglx
---
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 71802410e2ab..9b4910befeda 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -1100,7 +1100,7 @@ EXPORT_SYMBOL(pci_irq_vector);
  */
 const struct cpumask *pci_irq_get_affinity(struct pci_dev *dev, int nr)
 {
-	int irq = pci_irq_vector(dev, nr);
+	int idx, irq = pci_irq_vector(dev, nr);
 	struct msi_desc *desc;
 
 	if (WARN_ON_ONCE(irq <= 0))
@@ -1113,7 +1113,10 @@ const struct cpumask *pci_irq_get_affinity(struct pci_dev *dev, int nr)
 
 	if (WARN_ON_ONCE(!desc->affinity))
 		return NULL;
-	return &desc->affinity[nr].mask;
+
+	/* MSI has a mask array in the descriptor. */
+	idx = dev->msi_enabled ? nr : 0;
+	return &desc->affinity[idx].mask;
 }
 EXPORT_SYMBOL(pci_irq_get_affinity);
 


^ permalink raw reply related	[flat|nested] 83+ messages in thread

* Re: [patch V3 28/35] PCI/MSI: Simplify pci_irq_get_affinity()
  2021-12-18 10:25     ` Thomas Gleixner
@ 2021-12-18 19:04       ` Nathan Chancellor
  2021-12-18 20:25       ` Cédric Le Goater
  1 sibling, 0 replies; 83+ messages in thread
From: Nathan Chancellor @ 2021-12-18 19:04 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Cedric Le Goater, Greg Kroah-Hartman, Juergen Gross, xen-devel,
	Arnd Bergmann, Michael Ellerman, Benjamin Herrenschmidt,
	linuxppc-dev, Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor,
	Nishanth Menon, Tero Kristo, Santosh Shilimkar, linux-arm-kernel,
	Vinod Koul, dmaengine, Mark Rutland, Will Deacon, Robin Murphy,
	Joerg Roedel, iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

On Sat, Dec 18, 2021 at 11:25:14AM +0100, Thomas Gleixner wrote:
> On Fri, Dec 17 2021 at 15:30, Nathan Chancellor wrote:
> > On Fri, Dec 10, 2021 at 11:19:26PM +0100, Thomas Gleixner wrote:
> > I just bisected a boot failure on my AMD test desktop to this patch as
> > commit f48235900182 ("PCI/MSI: Simplify pci_irq_get_affinity()") in
> > -next. It looks like there is a problem with the NVMe drive after this
> > change according to the logs. Given that the hard drive is not getting
> > mounted for journald to write logs to, I am not really sure how to get
> > them from the machine so I have at least taken a picture of what I see
> > on my screen; open to ideas on that front!
> 
> Bah. Fix below.

Tested-by: Nathan Chancellor <nathan@kernel.org>

> Thanks,
> 
>         tglx
> ---
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index 71802410e2ab..9b4910befeda 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -1100,7 +1100,7 @@ EXPORT_SYMBOL(pci_irq_vector);
>   */
>  const struct cpumask *pci_irq_get_affinity(struct pci_dev *dev, int nr)
>  {
> -	int irq = pci_irq_vector(dev, nr);
> +	int idx, irq = pci_irq_vector(dev, nr);
>  	struct msi_desc *desc;
>  
>  	if (WARN_ON_ONCE(irq <= 0))
> @@ -1113,7 +1113,10 @@ const struct cpumask *pci_irq_get_affinity(struct pci_dev *dev, int nr)
>  
>  	if (WARN_ON_ONCE(!desc->affinity))
>  		return NULL;
> -	return &desc->affinity[nr].mask;
> +
> +	/* MSI has a mask array in the descriptor. */
> +	idx = dev->msi_enabled ? nr : 0;
> +	return &desc->affinity[idx].mask;
>  }
>  EXPORT_SYMBOL(pci_irq_get_affinity);
>  
> 

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 28/35] PCI/MSI: Simplify pci_irq_get_affinity()
  2021-12-18 10:25     ` Thomas Gleixner
  2021-12-18 19:04       ` Nathan Chancellor
@ 2021-12-18 20:25       ` Cédric Le Goater
  2021-12-20 11:55         ` Thomas Gleixner
  1 sibling, 1 reply; 83+ messages in thread
From: Cédric Le Goater @ 2021-12-18 20:25 UTC (permalink / raw)
  To: Thomas Gleixner, Nathan Chancellor
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Greg Kroah-Hartman, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor, Nishanth Menon,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

On 12/18/21 11:25, Thomas Gleixner wrote:
> On Fri, Dec 17 2021 at 15:30, Nathan Chancellor wrote:
>> On Fri, Dec 10, 2021 at 11:19:26PM +0100, Thomas Gleixner wrote:
>> I just bisected a boot failure on my AMD test desktop to this patch as
>> commit f48235900182 ("PCI/MSI: Simplify pci_irq_get_affinity()") in
>> -next. It looks like there is a problem with the NVMe drive after this
>> change according to the logs. Given that the hard drive is not getting
>> mounted for journald to write logs to, I am not really sure how to get
>> them from the machine so I have at least taken a picture of what I see
>> on my screen; open to ideas on that front!
> 
> Bah. Fix below.

That's a fix for the issue I was seeing on pseries with NVMe.

Tested-by: Cédric Le Goater <clg@kaod.org>

Thanks,

C.


> Thanks,
> 
>          tglx
> ---
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index 71802410e2ab..9b4910befeda 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -1100,7 +1100,7 @@ EXPORT_SYMBOL(pci_irq_vector);
>    */
>   const struct cpumask *pci_irq_get_affinity(struct pci_dev *dev, int nr)
>   {
> -	int irq = pci_irq_vector(dev, nr);
> +	int idx, irq = pci_irq_vector(dev, nr);
>   	struct msi_desc *desc;
>   
>   	if (WARN_ON_ONCE(irq <= 0))
> @@ -1113,7 +1113,10 @@ const struct cpumask *pci_irq_get_affinity(struct pci_dev *dev, int nr)
>   
>   	if (WARN_ON_ONCE(!desc->affinity))
>   		return NULL;
> -	return &desc->affinity[nr].mask;
> +
> +	/* MSI has a mask array in the descriptor. */
> +	idx = dev->msi_enabled ? nr : 0;
> +	return &desc->affinity[idx].mask;
>   }
>   EXPORT_SYMBOL(pci_irq_get_affinity);
>   
> 


^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 28/35] PCI/MSI: Simplify pci_irq_get_affinity()
  2021-12-18 20:25       ` Cédric Le Goater
@ 2021-12-20 11:55         ` Thomas Gleixner
  0 siblings, 0 replies; 83+ messages in thread
From: Thomas Gleixner @ 2021-12-20 11:55 UTC (permalink / raw)
  To: Cédric Le Goater, Nathan Chancellor
  Cc: LKML, Bjorn Helgaas, Marc Zygnier, Alex Williamson, Kevin Tian,
	Jason Gunthorpe, Megha Dey, Ashok Raj, linux-pci,
	Greg Kroah-Hartman, Juergen Gross, xen-devel, Arnd Bergmann,
	Michael Ellerman, Benjamin Herrenschmidt, linuxppc-dev,
	Bjorn Helgaas, Stuart Yoder, Laurentiu Tudor, Nishanth Menon,
	Tero Kristo, Santosh Shilimkar, linux-arm-kernel, Vinod Koul,
	dmaengine, Mark Rutland, Will Deacon, Robin Murphy, Joerg Roedel,
	iommu, Jassi Brar, Peter Ujfalusi, Sinan Kaya

On Sat, Dec 18 2021 at 21:25, Cédric Le Goater wrote:

> On 12/18/21 11:25, Thomas Gleixner wrote:
>> On Fri, Dec 17 2021 at 15:30, Nathan Chancellor wrote:
>>> On Fri, Dec 10, 2021 at 11:19:26PM +0100, Thomas Gleixner wrote:
>>> I just bisected a boot failure on my AMD test desktop to this patch as
>>> commit f48235900182 ("PCI/MSI: Simplify pci_irq_get_affinity()") in
>>> -next. It looks like there is a problem with the NVMe drive after this
>>> change according to the logs. Given that the hard drive is not getting
>>> mounted for journald to write logs to, I am not really sure how to get
>>> them from the machine so I have at least taken a picture of what I see
>>> on my screen; open to ideas on that front!
>> 
>> Bah. Fix below.
>
> That's a fix for the issue I was seeing on pseries with NVMe.
>
> Tested-by: Cédric Le Goater <clg@kaod.org>

I had a faint memory that I've seen that issue before, but couldn't find
the mail in those massive threads.

Thanks for confirming!

       tglx

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 28/35] PCI/MSI: Simplify pci_irq_get_affinity()
  2021-12-10 22:19 ` [patch V3 28/35] PCI/MSI: Simplify pci_irq_get_affinity() Thomas Gleixner
  2021-12-17 22:30   ` Nathan Chancellor
@ 2022-01-30 17:12   ` Guenter Roeck
  2022-01-31 11:27     ` Thomas Gleixner
  1 sibling, 1 reply; 83+ messages in thread
From: Guenter Roeck @ 2022-01-30 17:12 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Nishanth Menon, Mark Rutland, Stuart Yoder,
	Benjamin Herrenschmidt, Will Deacon, Ashok Raj, Michael Ellerman,
	Jassi Brar, Sinan Kaya, iommu, Peter Ujfalusi, Bjorn Helgaas,
	linux-arm-kernel, Jason Gunthorpe, linux-pci, xen-devel,
	Kevin Tian, Arnd Bergmann, Robin Murphy, Alex Williamson,
	Cedric Le Goater, Santosh Shilimkar, Bjorn Helgaas, Megha Dey,
	Juergen Gross, Tero Kristo, Greg Kroah-Hartman, Vinod Koul,
	Marc Zygnier, dmaengine, linuxppc-dev

On Fri, Dec 10, 2021 at 11:19:26PM +0100, Thomas Gleixner wrote:
> From: Thomas Gleixner <tglx@linutronix.de>
> 
> Replace open coded MSI descriptor chasing and use the proper accessor
> functions instead.
> 
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>

This patch results in the following runtime warning when booting x86
(32 bit) nosmp images from NVME in qemu.

[   14.825482] nvme nvme0: 1/0/0 default/read/poll queues
ILLOPC: ca7c6d10: 0f 0b
[   14.826188] ------------[ cut here ]------------
[   14.826307] WARNING: CPU: 0 PID: 7 at drivers/pci/msi/msi.c:1114 pci_irq_get_affinity+0x80/0x90
[   14.826455] Modules linked in:
[   14.826640] CPU: 0 PID: 7 Comm: kworker/u2:0 Not tainted 5.17.0-rc1-00419-g1d2d8baaf053 #1
[   14.826797] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.15.0-0-g2dd4b9b3f840-prebuilt.qemu.org 04/01/2014
[   14.827132] Workqueue: nvme-reset-wq nvme_reset_work
[   14.827336] EIP: pci_irq_get_affinity+0x80/0x90
[   14.827452] Code: e8 d5 30 af ff 85 c0 75 bd 90 0f 0b 31 c0 5b 5e 5d c3 8d b4 26 00 00 00 00 90 5b b8 24 32 7e cb 5e 5d c3 8d b4 26 00 00 00 00 <0f> 0b eb e0 8d b4 26 00 00 00 00 8d 74 26 00 90 55 89 e5 57 56 53
[   14.827717] EAX: 00000000 EBX: c18ba000 ECX: 00000000 EDX: c297c210
[   14.827816] ESI: 00000001 EDI: c18ba000 EBP: c1247e24 ESP: c1247e1c
[   14.827924] DS: 007b ES: 007b FS: 0000 GS: 0000 SS: 0068 EFLAGS: 00000246
[   14.828110] CR0: 80050033 CR2: ffda9000 CR3: 0b8ad000 CR4: 000006d0
[   14.828268] Call Trace:
[   14.828554]  blk_mq_pci_map_queues+0x26/0x70
[   14.828710]  nvme_pci_map_queues+0x75/0xc0
[   14.828808]  blk_mq_update_queue_map+0x86/0xa0
[   14.828891]  blk_mq_alloc_tag_set+0xf3/0x390
[   14.828965]  ? nvme_wait_freeze+0x3d/0x50
[   14.829137]  nvme_reset_work+0xd02/0x1120
[   14.829269]  ? lock_acquire+0xc3/0x290
[   14.829435]  process_one_work+0x1ed/0x490
[   14.829569]  worker_thread+0x15e/0x3c0
[   14.829665]  kthread+0xd3/0x100
[   14.829729]  ? process_one_work+0x490/0x490
[   14.829799]  ? kthread_complete_and_exit+0x20/0x20
[   14.829890]  ret_from_fork+0x1c/0x28

Bisect results below.

#regzbot introduced: f48235900182d6

Guenter

---
# bad: [e783362eb54cd99b2cac8b3a9aeac942e6f6ac07] Linux 5.17-rc1
# good: [df0cc57e057f18e44dac8e6c18aba47ab53202f9] Linux 5.16
git bisect start 'v5.17-rc1' 'v5.16'
# good: [fef8dfaea9d6c444b6c2174b3a2b0fca4d226c5e] Merge tag 'regulator-v5.17' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator
git bisect good fef8dfaea9d6c444b6c2174b3a2b0fca4d226c5e
# bad: [3ceff4ea07410763d5d4cccd60349bf7691e7e61] Merge tag 'sound-5.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
git bisect bad 3ceff4ea07410763d5d4cccd60349bf7691e7e61
# good: [57ea81971b7296b42fc77424af44c5915d3d4ae2] Merge tag 'usb-5.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
git bisect good 57ea81971b7296b42fc77424af44c5915d3d4ae2
# bad: [feb7a43de5ef625ad74097d8fd3481d5dbc06a59] Merge tag 'irq-msi-2022-01-13' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
git bisect bad feb7a43de5ef625ad74097d8fd3481d5dbc06a59
# good: [ce990f1de0bc6ff3de43d385e0985efa980fba24] Merge tag 'for-linus-5.17-rc1-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip
git bisect good ce990f1de0bc6ff3de43d385e0985efa980fba24
# good: [4afd2a9355a9deb16ea42b896820dacf49843a8f] Merge branches 'clk-ingenic' and 'clk-mediatek' into clk-next
git bisect good 4afd2a9355a9deb16ea42b896820dacf49843a8f
# good: [455e73a07f6e288b0061dfcf4fcf54fa9fe06458] Merge tag 'clk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux
git bisect good 455e73a07f6e288b0061dfcf4fcf54fa9fe06458
# bad: [f2948df5f87a722591499da60ab91c611422f755] x86/pci/xen: Use msi_for_each_desc()
git bisect bad f2948df5f87a722591499da60ab91c611422f755
# good: [93296cd1325d1d9afede60202d8833011c9001f2] PCI/MSI: Allocate MSI device data on first use
git bisect good 93296cd1325d1d9afede60202d8833011c9001f2
# good: [82ff8e6b78fc4587a4255301f0a283506daf11b6] PCI/MSI: Use msi_get_virq() in pci_get_vector()
git bisect good 82ff8e6b78fc4587a4255301f0a283506daf11b6
# bad: [125282cd4f33ecd53a24ae4807409da0e5e90fd4] genirq/msi: Move descriptor list to struct msi_device_data
git bisect bad 125282cd4f33ecd53a24ae4807409da0e5e90fd4
# bad: [065afdc9c521f05c53f226dabe5dda2d30294d65] iommu/arm-smmu-v3: Use msi_get_virq()
git bisect bad 065afdc9c521f05c53f226dabe5dda2d30294d65
# bad: [f6632bb2c1454b857adcd131320379ec16fd8666] dmaengine: mv_xor_v2: Get rid of msi_desc abuse
git bisect bad f6632bb2c1454b857adcd131320379ec16fd8666
# bad: [f48235900182d64537c6e8f8dc0932b57a1a0638] PCI/MSI: Simplify pci_irq_get_affinity()
git bisect bad f48235900182d64537c6e8f8dc0932b57a1a0638
# first bad commit: [f48235900182d64537c6e8f8dc0932b57a1a0638] PCI/MSI: Simplify pci_irq_get_affinity()

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 28/35] PCI/MSI: Simplify pci_irq_get_affinity()
  2022-01-30 17:12   ` Guenter Roeck
@ 2022-01-31 11:27     ` Thomas Gleixner
  2022-01-31 15:21       ` Guenter Roeck
  0 siblings, 1 reply; 83+ messages in thread
From: Thomas Gleixner @ 2022-01-31 11:27 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: LKML, Nishanth Menon, Mark Rutland, Stuart Yoder,
	Benjamin Herrenschmidt, Will Deacon, Ashok Raj, Michael Ellerman,
	Jassi Brar, Sinan Kaya, iommu, Peter Ujfalusi, Bjorn Helgaas,
	linux-arm-kernel, Jason Gunthorpe, linux-pci, xen-devel,
	Kevin Tian, Arnd Bergmann, Robin Murphy, Alex Williamson,
	Cedric Le Goater, Santosh Shilimkar, Bjorn Helgaas, Megha Dey,
	Juergen Gross, Tero Kristo, Greg Kroah-Hartman, Vinod Koul,
	Marc Zygnier, dmaengine, linuxppc-dev

On Sun, Jan 30 2022 at 09:12, Guenter Roeck wrote:
> On Fri, Dec 10, 2021 at 11:19:26PM +0100, Thomas Gleixner wrote:
> This patch results in the following runtime warning when booting x86
> (32 bit) nosmp images from NVME in qemu.
>
> [   14.825482] nvme nvme0: 1/0/0 default/read/poll queues
> ILLOPC: ca7c6d10: 0f 0b
> [   14.826188] ------------[ cut here ]------------
> [   14.826307] WARNING: CPU: 0 PID: 7 at drivers/pci/msi/msi.c:1114 pci_irq_get_affinity+0x80/0x90

This complains about msi_desc->affinity being NULL.

> git bisect bad f48235900182d64537c6e8f8dc0932b57a1a0638
> # first bad commit: [f48235900182d64537c6e8f8dc0932b57a1a0638] PCI/MSI: Simplify pci_irq_get_affinity()

Hrm. Can you please provide dmesg and /proc/interrupts from a
kernel before that commit?

Thanks,

        tglx


^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 28/35] PCI/MSI: Simplify pci_irq_get_affinity()
  2022-01-31 11:27     ` Thomas Gleixner
@ 2022-01-31 15:21       ` Guenter Roeck
  2022-01-31 21:16         ` Thomas Gleixner
  0 siblings, 1 reply; 83+ messages in thread
From: Guenter Roeck @ 2022-01-31 15:21 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Nishanth Menon, Mark Rutland, Stuart Yoder,
	Benjamin Herrenschmidt, Will Deacon, Ashok Raj, Michael Ellerman,
	Jassi Brar, Sinan Kaya, iommu, Peter Ujfalusi, Bjorn Helgaas,
	linux-arm-kernel, Jason Gunthorpe, linux-pci, xen-devel,
	Kevin Tian, Arnd Bergmann, Robin Murphy, Alex Williamson,
	Cedric Le Goater, Santosh Shilimkar, Bjorn Helgaas, Megha Dey,
	Juergen Gross, Tero Kristo, Greg Kroah-Hartman, Vinod Koul,
	Marc Zygnier, dmaengine, linuxppc-dev

On 1/31/22 03:27, Thomas Gleixner wrote:
> On Sun, Jan 30 2022 at 09:12, Guenter Roeck wrote:
>> On Fri, Dec 10, 2021 at 11:19:26PM +0100, Thomas Gleixner wrote:
>> This patch results in the following runtime warning when booting x86
>> (32 bit) nosmp images from NVME in qemu.
>>
>> [   14.825482] nvme nvme0: 1/0/0 default/read/poll queues
>> ILLOPC: ca7c6d10: 0f 0b
>> [   14.826188] ------------[ cut here ]------------
>> [   14.826307] WARNING: CPU: 0 PID: 7 at drivers/pci/msi/msi.c:1114 pci_irq_get_affinity+0x80/0x90
> 
> This complains about msi_desc->affinity being NULL.
> 
>> git bisect bad f48235900182d64537c6e8f8dc0932b57a1a0638
>> # first bad commit: [f48235900182d64537c6e8f8dc0932b57a1a0638] PCI/MSI: Simplify pci_irq_get_affinity()
> 
> Hrm. Can you please provide dmesg and /proc/interrupts from a
> kernel before that commit?
> 

Sure. Please see http://server.roeck-us.net/qemu/x86/.
The logs are generated with with v5.16.4.

Guenter

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [patch V3 28/35] PCI/MSI: Simplify pci_irq_get_affinity()
  2022-01-31 15:21       ` Guenter Roeck
@ 2022-01-31 21:16         ` Thomas Gleixner
  0 siblings, 0 replies; 83+ messages in thread
From: Thomas Gleixner @ 2022-01-31 21:16 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: LKML, Nishanth Menon, Mark Rutland, Stuart Yoder,
	Benjamin Herrenschmidt, Will Deacon, Ashok Raj, Michael Ellerman,
	Jassi Brar, Sinan Kaya, iommu, Peter Ujfalusi, Bjorn Helgaas,
	linux-arm-kernel, Jason Gunthorpe, linux-pci, xen-devel,
	Kevin Tian, Arnd Bergmann, Robin Murphy, Alex Williamson,
	Cedric Le Goater, Santosh Shilimkar, Bjorn Helgaas, Megha Dey,
	Juergen Gross, Tero Kristo, Greg Kroah-Hartman, Vinod Koul,
	Marc Zygnier, dmaengine, linuxppc-dev

Guenter,

On Mon, Jan 31 2022 at 07:21, Guenter Roeck wrote:
> Sure. Please see http://server.roeck-us.net/qemu/x86/.
> The logs are generated with with v5.16.4.

thanks for providing the data. It definitely helped me to leave the
state of not seeing the wood for the trees. Fix below.

Thanks,

        tglx
---
Subject: PCI/MSI: Remove bogus warning in pci_irq_get_affinity()
From: Thomas Gleixner <tglx@linutronix.de>
Date: Mon, 31 Jan 2022 22:02:46 +0100

The recent overhaul of pci_irq_get_affinity() introduced a regression when
pci_irq_get_affinity() is called for an MSI-X interrupt which was not
allocated with affinity descriptor information.

The original code just returned a NULL pointer in that case, but the rework
added a WARN_ON() under the assumption that the corresponding WARN_ON() in
the MSI case can be applied to MSI-X as well.

In fact the MSI warning in the original code does not make sense either
because it's legitimate to invoke pci_irq_get_affinity() for a MSI
interrupt which was not allocated with affinity descriptor information.

Remove it and just return NULL as the original code did.

Fixes: f48235900182 ("PCI/MSI: Simplify pci_irq_get_affinity()")
Reported-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
 drivers/pci/msi/msi.c |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -1111,7 +1111,8 @@ const struct cpumask *pci_irq_get_affini
 	if (!desc)
 		return cpu_possible_mask;
 
-	if (WARN_ON_ONCE(!desc->affinity))
+	/* MSI[X] interrupts can be allocated without affinity descriptor */
+	if (!desc->affinity)
 		return NULL;
 
 	/*

^ permalink raw reply	[flat|nested] 83+ messages in thread

end of thread, other threads:[~2022-01-31 21:16 UTC | newest]

Thread overview: 83+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-10 22:18 [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
2021-12-10 22:18 ` [patch V3 01/35] PCI/MSI: Set pci_dev::msi[x]_enabled early Thomas Gleixner
2021-12-13 13:37   ` Jason Gunthorpe
2021-12-10 22:18 ` [patch V3 02/35] x86/pci/XEN: Use PCI device property Thomas Gleixner
2021-12-13 13:56   ` Jason Gunthorpe
2021-12-10 22:18 ` [patch V3 03/35] x86/apic/msi: Use PCI device MSI property Thomas Gleixner
2021-12-11 10:52   ` Greg Kroah-Hartman
2021-12-13 13:59   ` Jason Gunthorpe
2021-12-10 22:18 ` [patch V3 04/35] genirq/msi: Use PCI device property Thomas Gleixner
2021-12-13 13:59   ` Jason Gunthorpe
2021-12-10 22:18 ` [patch V3 05/35] powerpc/cell/axon_msi: " Thomas Gleixner
2021-12-11 15:21   ` Arnd Bergmann
2021-12-13 14:01   ` Jason Gunthorpe
2021-12-10 22:18 ` [patch V3 06/35] powerpc/pseries/msi: Use PCI device properties Thomas Gleixner
2021-12-13 14:04   ` Jason Gunthorpe
2021-12-10 22:18 ` [patch V3 07/35] device: Move MSI related data into a struct Thomas Gleixner
2021-12-11 15:22   ` Arnd Bergmann
2021-12-10 22:18 ` [patch V3 08/35] device: Add device:: Msi_data pointer and struct msi_device_data Thomas Gleixner
2021-12-10 22:18 ` [patch V3 09/35] PCI/MSI: Allocate MSI device data on first use Thomas Gleixner
2021-12-15 17:16   ` [patch V4 09-01/35] PCI/MSI: Decouple MSI[-X] disable from pcim_release() Thomas Gleixner
2021-12-15 17:19     ` [patch V4 09-02/35] PCI/MSI: Allocate MSI device data on first use Thomas Gleixner
2021-12-15 17:46       ` Greg Kroah-Hartman
2021-12-15 17:46     ` [patch V4 09-01/35] PCI/MSI: Decouple MSI[-X] disable from pcim_release() Greg Kroah-Hartman
2021-12-10 22:18 ` [patch V3 10/35] platform-msi: Allocate MSI device data on first use Thomas Gleixner
2021-12-10 22:19 ` [patch V3 11/35] bus: fsl-mc-msi: " Thomas Gleixner
2021-12-10 22:19 ` [patch V3 12/35] soc: ti: ti_sci_inta_msi: " Thomas Gleixner
2021-12-11 15:22   ` Arnd Bergmann
2021-12-13 17:56   ` Nishanth Menon
2021-12-10 22:19 ` [patch V3 13/35] genirq/msi: Provide msi_device_populate/destroy_sysfs() Thomas Gleixner
2021-12-10 22:19 ` [patch V3 14/35] PCI/MSI: Let the irq code handle sysfs groups Thomas Gleixner
2021-12-10 22:19 ` [patch V3 15/35] platform-msi: Let the core " Thomas Gleixner
2021-12-10 22:19 ` [patch V3 16/35] genirq/msi: Remove the original sysfs interfaces Thomas Gleixner
2021-12-10 22:19 ` [patch V3 17/35] platform-msi: Rename functions and clarify comments Thomas Gleixner
2021-12-10 22:19 ` [patch V3 18/35] platform-msi: Store platform private data pointer in msi_device_data Thomas Gleixner
2021-12-10 22:19 ` [patch V3 19/35] genirq/msi: Consolidate MSI descriptor data Thomas Gleixner
2021-12-10 22:19 ` [patch V3 20/35] platform-msi: Use msi_desc::msi_index Thomas Gleixner
2021-12-10 22:19 ` [patch V3 21/35] bus: fsl-mc-msi: " Thomas Gleixner
2021-12-10 22:19 ` [patch V3 22/35] soc: ti: ti_sci_inta_msi: " Thomas Gleixner
2021-12-13 17:57   ` Nishanth Menon
2021-12-10 22:19 ` [patch V3 23/35] PCI/MSI: " Thomas Gleixner
2021-12-10 22:19 ` [patch V3 24/35] PCI/MSI: Provide MSI_FLAG_MSIX_CONTIGUOUS Thomas Gleixner
2021-12-10 22:19 ` [patch V3 25/35] powerpc/pseries/msi: Let core code check for contiguous entries Thomas Gleixner
2021-12-13 14:05   ` Jason Gunthorpe
2021-12-10 22:19 ` [patch V3 26/35] genirq/msi: Provide interface to retrieve Linux interrupt number Thomas Gleixner
2021-12-13 14:22   ` Jason Gunthorpe
2021-12-10 22:19 ` [patch V3 27/35] PCI/MSI: Use __msi_get_virq() in pci_get_vector() Thomas Gleixner
2021-12-13 14:23   ` Jason Gunthorpe
2021-12-10 22:19 ` [patch V3 28/35] PCI/MSI: Simplify pci_irq_get_affinity() Thomas Gleixner
2021-12-17 22:30   ` Nathan Chancellor
2021-12-18 10:25     ` Thomas Gleixner
2021-12-18 19:04       ` Nathan Chancellor
2021-12-18 20:25       ` Cédric Le Goater
2021-12-20 11:55         ` Thomas Gleixner
2022-01-30 17:12   ` Guenter Roeck
2022-01-31 11:27     ` Thomas Gleixner
2022-01-31 15:21       ` Guenter Roeck
2022-01-31 21:16         ` Thomas Gleixner
2021-12-10 22:19 ` [patch V3 29/35] dmaengine: mv_xor_v2: Get rid of msi_desc abuse Thomas Gleixner
2021-12-13  5:14   ` Vinod Koul
2021-12-10 22:19 ` [patch V3 30/35] perf/smmuv3: Use msi_get_virq() Thomas Gleixner
2021-12-10 22:19 ` [patch V3 31/35] iommu/arm-smmu-v3: " Thomas Gleixner
2021-12-10 22:19 ` [patch V3 32/35] mailbox: bcm-flexrm-mailbox: Rework MSI interrupt handling Thomas Gleixner
2021-12-10 22:19 ` [patch V3 33/35] bus: fsl-mc: fsl-mc-allocator: Rework MSI handling Thomas Gleixner
2021-12-10 22:19 ` [patch V3 34/35] soc: ti: ti_sci_inta_msi: Get rid of ti_sci_inta_msi_get_virq() Thomas Gleixner
2021-12-11 15:24   ` Arnd Bergmann
2021-12-13  5:15   ` Vinod Koul
2021-12-13 17:57   ` Nishanth Menon
2021-12-10 22:19 ` [patch V3 35/35] dmaengine: qcom_hidma: Cleanup MSI handling Thomas Gleixner
2021-12-13  5:14   ` Vinod Koul
2021-12-13 18:29 ` [patch V3 00/35] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Nishanth Menon
2021-12-14  9:41   ` Thomas Gleixner
2021-12-14 16:22     ` Nishanth Menon
2021-12-14 16:36       ` Thomas Gleixner
2021-12-14 17:03         ` Thomas Gleixner
2021-12-14 20:15           ` Thomas Gleixner
2021-12-14 20:56             ` Nishanth Menon
2021-12-14 21:19               ` Thomas Gleixner
2021-12-15 16:18                 ` Thomas Gleixner
2021-12-15 16:35                   ` Thomas Gleixner
2021-12-15 18:08                     ` Nishanth Menon
2021-12-16  1:45                     ` Nishanth Menon
2021-12-16 17:23                       ` Thomas Gleixner
2021-12-16  6:14                     ` Michael Kelley (LINUX)

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).