Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bus: fsl-mc: fsl-mc-allocator: Rework MSI handling

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>
Link: https://lore.kernel.org/r/20211210221815.207838579@linutronix.de

+22 -30
+4 -4
drivers/bus/fsl-mc/dprc-driver.c
··· 400 400 struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev); 401 401 struct fsl_mc_bus *mc_bus = to_fsl_mc_bus(mc_dev); 402 402 struct fsl_mc_io *mc_io = mc_dev->mc_io; 403 - struct msi_desc *msi_desc = mc_dev->irqs[0]->msi_desc; 403 + int irq = mc_dev->irqs[0]->virq; 404 404 405 405 dev_dbg(dev, "DPRC IRQ %d triggered on CPU %u\n", 406 406 irq_num, smp_processor_id()); ··· 409 409 return IRQ_HANDLED; 410 410 411 411 mutex_lock(&mc_bus->scan_mutex); 412 - if (!msi_desc || msi_desc->irq != (u32)irq_num) 412 + if (irq != (u32)irq_num) 413 413 goto out; 414 414 415 415 status = 0; ··· 521 521 * function that programs the MSI physically in the device 522 522 */ 523 523 error = devm_request_threaded_irq(&mc_dev->dev, 524 - irq->msi_desc->irq, 524 + irq->virq, 525 525 dprc_irq0_handler, 526 526 dprc_irq0_handler_thread, 527 527 IRQF_NO_SUSPEND | IRQF_ONESHOT, ··· 771 771 772 772 (void)disable_dprc_irq(mc_dev); 773 773 774 - devm_free_irq(&mc_dev->dev, irq->msi_desc->irq, &mc_dev->dev); 774 + devm_free_irq(&mc_dev->dev, irq->virq, &mc_dev->dev); 775 775 776 776 fsl_mc_free_irqs(mc_dev); 777 777 }
+2 -7
drivers/bus/fsl-mc/fsl-mc-allocator.c
··· 350 350 unsigned int irq_count) 351 351 { 352 352 unsigned int i; 353 - struct msi_desc *msi_desc; 354 353 struct fsl_mc_device_irq *irq_resources; 355 354 struct fsl_mc_device_irq *mc_dev_irq; 356 355 int error; ··· 387 388 mc_dev_irq->resource.type = res_pool->type; 388 389 mc_dev_irq->resource.data = mc_dev_irq; 389 390 mc_dev_irq->resource.parent_pool = res_pool; 391 + mc_dev_irq->virq = msi_get_virq(&mc_bus_dev->dev, i); 392 + mc_dev_irq->resource.id = mc_dev_irq->virq; 390 393 INIT_LIST_HEAD(&mc_dev_irq->resource.node); 391 394 list_add_tail(&mc_dev_irq->resource.node, &res_pool->free_list); 392 - } 393 - 394 - for_each_msi_entry(msi_desc, &mc_bus_dev->dev) { 395 - mc_dev_irq = &irq_resources[msi_desc->msi_index]; 396 - mc_dev_irq->msi_desc = msi_desc; 397 - mc_dev_irq->resource.id = msi_desc->irq; 398 395 } 399 396 400 397 res_pool->max_count = irq_count;
+3 -3
drivers/bus/fsl-mc/fsl-mc-msi.c
··· 58 58 } 59 59 60 60 static void __fsl_mc_msi_write_msg(struct fsl_mc_device *mc_bus_dev, 61 - struct fsl_mc_device_irq *mc_dev_irq) 61 + struct fsl_mc_device_irq *mc_dev_irq, 62 + struct msi_desc *msi_desc) 62 63 { 63 64 int error; 64 65 struct fsl_mc_device *owner_mc_dev = mc_dev_irq->mc_dev; 65 - struct msi_desc *msi_desc = mc_dev_irq->msi_desc; 66 66 struct dprc_irq_cfg irq_cfg; 67 67 68 68 /* ··· 129 129 /* 130 130 * Program the MSI (paddr, value) pair in the device: 131 131 */ 132 - __fsl_mc_msi_write_msg(mc_bus_dev, mc_dev_irq); 132 + __fsl_mc_msi_write_msg(mc_bus_dev, mc_dev_irq, msi_desc); 133 133 } 134 134 135 135 static void fsl_mc_msi_update_chip_ops(struct msi_domain_info *info)
+2 -2
drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
··· 4246 4246 } 4247 4247 4248 4248 irq = ls_dev->irqs[0]; 4249 - err = devm_request_threaded_irq(&ls_dev->dev, irq->msi_desc->irq, 4249 + err = devm_request_threaded_irq(&ls_dev->dev, irq->virq, 4250 4250 NULL, dpni_irq0_handler_thread, 4251 4251 IRQF_NO_SUSPEND | IRQF_ONESHOT, 4252 4252 dev_name(&ls_dev->dev), &ls_dev->dev); ··· 4273 4273 return 0; 4274 4274 4275 4275 free_irq: 4276 - devm_free_irq(&ls_dev->dev, irq->msi_desc->irq, &ls_dev->dev); 4276 + devm_free_irq(&ls_dev->dev, irq->virq, &ls_dev->dev); 4277 4277 free_mc_irq: 4278 4278 fsl_mc_free_irqs(ls_dev); 4279 4279
+1 -3
drivers/net/ethernet/freescale/dpaa2/dpaa2-ptp.c
··· 129 129 static int dpaa2_ptp_probe(struct fsl_mc_device *mc_dev) 130 130 { 131 131 struct device *dev = &mc_dev->dev; 132 - struct fsl_mc_device_irq *irq; 133 132 struct ptp_qoriq *ptp_qoriq; 134 133 struct device_node *node; 135 134 void __iomem *base; ··· 176 177 goto err_unmap; 177 178 } 178 179 179 - irq = mc_dev->irqs[0]; 180 - ptp_qoriq->irq = irq->msi_desc->irq; 180 + ptp_qoriq->irq = mc_dev->irqs[0]->virq; 181 181 182 182 err = request_threaded_irq(ptp_qoriq->irq, NULL, 183 183 dpaa2_ptp_irq_handler_thread,
+2 -3
drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c
··· 1553 1553 1554 1554 irq = sw_dev->irqs[DPSW_IRQ_INDEX_IF]; 1555 1555 1556 - err = devm_request_threaded_irq(dev, irq->msi_desc->irq, 1557 - NULL, 1556 + err = devm_request_threaded_irq(dev, irq->virq, NULL, 1558 1557 dpaa2_switch_irq0_handler_thread, 1559 1558 IRQF_NO_SUSPEND | IRQF_ONESHOT, 1560 1559 dev_name(dev), dev); ··· 1579 1580 return 0; 1580 1581 1581 1582 free_devm_irq: 1582 - devm_free_irq(dev, irq->msi_desc->irq, dev); 1583 + devm_free_irq(dev, irq->virq, dev); 1583 1584 free_irq: 1584 1585 fsl_mc_free_irqs(sw_dev); 1585 1586 return err;
+4 -4
drivers/soc/fsl/dpio/dpio-driver.c
··· 88 88 irq = dpio_dev->irqs[0]; 89 89 90 90 /* clear the affinity hint */ 91 - irq_set_affinity_hint(irq->msi_desc->irq, NULL); 91 + irq_set_affinity_hint(irq->virq, NULL); 92 92 } 93 93 94 94 static int register_dpio_irq_handlers(struct fsl_mc_device *dpio_dev, int cpu) ··· 98 98 99 99 irq = dpio_dev->irqs[0]; 100 100 error = devm_request_irq(&dpio_dev->dev, 101 - irq->msi_desc->irq, 101 + irq->virq, 102 102 dpio_irq_handler, 103 103 0, 104 104 dev_name(&dpio_dev->dev), ··· 111 111 } 112 112 113 113 /* set the affinity hint */ 114 - if (irq_set_affinity_hint(irq->msi_desc->irq, cpumask_of(cpu))) 114 + if (irq_set_affinity_hint(irq->virq, cpumask_of(cpu))) 115 115 dev_err(&dpio_dev->dev, 116 116 "irq_set_affinity failed irq %d cpu %d\n", 117 - irq->msi_desc->irq, cpu); 117 + irq->virq, cpu); 118 118 119 119 return 0; 120 120 }
+2 -2
drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c
··· 67 67 int hwirq; 68 68 int ret; 69 69 70 - hwirq = vdev->mc_dev->irqs[index]->msi_desc->irq; 70 + hwirq = vdev->mc_dev->irqs[index]->virq; 71 71 if (irq->trigger) { 72 72 free_irq(hwirq, irq); 73 73 kfree(irq->name); ··· 137 137 return vfio_set_trigger(vdev, index, fd); 138 138 } 139 139 140 - hwirq = vdev->mc_dev->irqs[index]->msi_desc->irq; 140 + hwirq = vdev->mc_dev->irqs[index]->virq; 141 141 142 142 irq = &vdev->mc_irqs[index]; 143 143
+2 -2
include/linux/fsl/mc.h
··· 91 91 92 92 /** 93 93 * struct fsl_mc_device_irq - MC object device message-based interrupt 94 - * @msi_desc: pointer to MSI descriptor allocated by fsl_mc_msi_alloc_descs() 94 + * @virq: Linux virtual interrupt number 95 95 * @mc_dev: MC object device that owns this interrupt 96 96 * @dev_irq_index: device-relative IRQ index 97 97 * @resource: MC generic resource associated with the interrupt 98 98 */ 99 99 struct fsl_mc_device_irq { 100 - struct msi_desc *msi_desc; 100 + unsigned int virq; 101 101 struct fsl_mc_device *mc_dev; 102 102 u8 dev_irq_index; 103 103 struct fsl_mc_resource resource;