Skip to content

Commit deabc0f

Browse files
committed
net:mana: Use gic functions to allocate glocal EQs
Replace the interrupt setup code with gic functions. Those functions keep track of interrupt context usage from vPorts EQs and RDMA EQs.
1 parent 80cbddc commit deabc0f

1 file changed

Lines changed: 8 additions & 66 deletions

File tree

drivers/net/ethernet/microsoft/mana/gdma_main.c

Lines changed: 8 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1623,30 +1623,18 @@ static int mana_gd_setup_dyn_irqs(struct pci_dev *pdev, int nvec)
16231623
* further used in irq_setup()
16241624
*/
16251625
for (i = 1; i <= nvec; i++) {
1626-
gic = kzalloc(sizeof(*gic), GFP_KERNEL);
1626+
gic = gdma_get_gic(gc, false, 0, i, &i);
16271627
if (!gic) {
16281628
err = -ENOMEM;
16291629
goto free_irq;
16301630
}
1631-
gic->handler = mana_gd_process_eq_events;
1632-
INIT_LIST_HEAD(&gic->eq_list);
1633-
spin_lock_init(&gic->lock);
1634-
1635-
snprintf(gic->name, MANA_IRQ_NAME_SZ, "mana_q%d@pci:%s",
1636-
i - 1, pci_name(pdev));
16371631

16381632
/* one pci vector is already allocated for HWC */
16391633
irqs[i - 1] = pci_irq_vector(pdev, i);
16401634
if (irqs[i - 1] < 0) {
16411635
err = irqs[i - 1];
16421636
goto free_current_gic;
16431637
}
1644-
1645-
err = request_irq(irqs[i - 1], mana_gd_intr, 0, gic->name, gic);
1646-
if (err)
1647-
goto free_current_gic;
1648-
1649-
xa_store(&gc->irq_contexts, i, gic, GFP_KERNEL);
16501638
}
16511639

16521640
/*
@@ -1673,14 +1661,8 @@ static int mana_gd_setup_dyn_irqs(struct pci_dev *pdev, int nvec)
16731661
free_irq:
16741662
for (i -= 1; i > 0; i--) {
16751663
irq = pci_irq_vector(pdev, i);
1676-
gic = xa_load(&gc->irq_contexts, i);
1677-
if (WARN_ON(!gic))
1678-
continue;
1679-
16801664
irq_update_affinity_hint(irq, NULL);
1681-
free_irq(irq, gic);
1682-
xa_erase(&gc->irq_contexts, i);
1683-
kfree(gic);
1665+
gdma_put_gic(gc, false, i);
16841666
}
16851667
kfree(irqs);
16861668
return err;
@@ -1701,34 +1683,11 @@ static int mana_gd_setup_irqs(struct pci_dev *pdev, int nvec)
17011683
start_irqs = irqs;
17021684

17031685
for (i = 0; i < nvec; i++) {
1704-
gic = kzalloc(sizeof(*gic), GFP_KERNEL);
1686+
gic = gdma_get_gic(gc, false, 0, i, &i);
17051687
if (!gic) {
17061688
err = -ENOMEM;
17071689
goto free_irq;
17081690
}
1709-
1710-
gic->handler = mana_gd_process_eq_events;
1711-
INIT_LIST_HEAD(&gic->eq_list);
1712-
spin_lock_init(&gic->lock);
1713-
1714-
if (!i)
1715-
snprintf(gic->name, MANA_IRQ_NAME_SZ, "mana_hwc@pci:%s",
1716-
pci_name(pdev));
1717-
else
1718-
snprintf(gic->name, MANA_IRQ_NAME_SZ, "mana_q%d@pci:%s",
1719-
i - 1, pci_name(pdev));
1720-
1721-
irqs[i] = pci_irq_vector(pdev, i);
1722-
if (irqs[i] < 0) {
1723-
err = irqs[i];
1724-
goto free_current_gic;
1725-
}
1726-
1727-
err = request_irq(irqs[i], mana_gd_intr, 0, gic->name, gic);
1728-
if (err)
1729-
goto free_current_gic;
1730-
1731-
xa_store(&gc->irq_contexts, i, gic, GFP_KERNEL);
17321691
}
17331692

17341693
/* If number of IRQ is one extra than number of online CPUs,
@@ -1757,19 +1716,11 @@ static int mana_gd_setup_irqs(struct pci_dev *pdev, int nvec)
17571716
kfree(start_irqs);
17581717
return 0;
17591718

1760-
free_current_gic:
1761-
kfree(gic);
17621719
free_irq:
17631720
for (i -= 1; i >= 0; i--) {
17641721
irq = pci_irq_vector(pdev, i);
1765-
gic = xa_load(&gc->irq_contexts, i);
1766-
if (WARN_ON(!gic))
1767-
continue;
1768-
17691722
irq_update_affinity_hint(irq, NULL);
1770-
free_irq(irq, gic);
1771-
xa_erase(&gc->irq_contexts, i);
1772-
kfree(gic);
1723+
gdma_put_gic(gc, false, i);
17731724
}
17741725

17751726
kfree(start_irqs);
@@ -1844,26 +1795,17 @@ static int mana_gd_setup_remaining_irqs(struct pci_dev *pdev)
18441795
static void mana_gd_remove_irqs(struct pci_dev *pdev)
18451796
{
18461797
struct gdma_context *gc = pci_get_drvdata(pdev);
1847-
struct gdma_irq_context *gic;
18481798
int irq, i;
18491799

18501800
if (gc->max_num_msix < 1)
18511801
return;
18521802

1853-
for (i = 0; i < gc->max_num_msix; i++) {
1854-
irq = pci_irq_vector(pdev, i);
1855-
if (irq < 0)
1856-
continue;
1857-
1858-
gic = xa_load(&gc->irq_contexts, i);
1859-
if (WARN_ON(!gic))
1860-
continue;
1861-
1803+
for (i = 0; i < (gc->msi_sharing ? gc->max_num_msix : 1); i++) {
18621804
/* Need to clear the hint before free_irq */
1805+
irq = pci_irq_vector(pdev, i);
18631806
irq_update_affinity_hint(irq, NULL);
1864-
free_irq(irq, gic);
1865-
xa_erase(&gc->irq_contexts, i);
1866-
kfree(gic);
1807+
1808+
gdma_put_gic(gc, !gc->msi_sharing, i);
18671809
}
18681810

18691811
pci_free_irq_vectors(pdev);

0 commit comments

Comments
 (0)