Skip to content

Commit 45e5260

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 09fcf8e commit 45e5260

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
@@ -1622,30 +1622,18 @@ static int mana_gd_setup_dyn_irqs(struct pci_dev *pdev, int nvec)
16221622
* further used in irq_setup()
16231623
*/
16241624
for (i = 1; i <= nvec; i++) {
1625-
gic = kzalloc(sizeof(*gic), GFP_KERNEL);
1625+
gic = gdma_get_gic(gc, false, 0, i, &i);
16261626
if (!gic) {
16271627
err = -ENOMEM;
16281628
goto free_irq;
16291629
}
1630-
gic->handler = mana_gd_process_eq_events;
1631-
INIT_LIST_HEAD(&gic->eq_list);
1632-
spin_lock_init(&gic->lock);
1633-
1634-
snprintf(gic->name, MANA_IRQ_NAME_SZ, "mana_q%d@pci:%s",
1635-
i - 1, pci_name(pdev));
16361630

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

16511639
/*
@@ -1672,14 +1660,8 @@ static int mana_gd_setup_dyn_irqs(struct pci_dev *pdev, int nvec)
16721660
free_irq:
16731661
for (i -= 1; i > 0; i--) {
16741662
irq = pci_irq_vector(pdev, i);
1675-
gic = xa_load(&gc->irq_contexts, i);
1676-
if (WARN_ON(!gic))
1677-
continue;
1678-
16791663
irq_update_affinity_hint(irq, NULL);
1680-
free_irq(irq, gic);
1681-
xa_erase(&gc->irq_contexts, i);
1682-
kfree(gic);
1664+
gdma_put_gic(gc, false, i);
16831665
}
16841666
kfree(irqs);
16851667
return err;
@@ -1700,34 +1682,11 @@ static int mana_gd_setup_irqs(struct pci_dev *pdev, int nvec)
17001682
start_irqs = irqs;
17011683

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

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

1759-
free_current_gic:
1760-
kfree(gic);
17611718
free_irq:
17621719
for (i -= 1; i >= 0; i--) {
17631720
irq = pci_irq_vector(pdev, i);
1764-
gic = xa_load(&gc->irq_contexts, i);
1765-
if (WARN_ON(!gic))
1766-
continue;
1767-
17681721
irq_update_affinity_hint(irq, NULL);
1769-
free_irq(irq, gic);
1770-
xa_erase(&gc->irq_contexts, i);
1771-
kfree(gic);
1722+
gdma_put_gic(gc, false, i);
17721723
}
17731724

17741725
kfree(start_irqs);
@@ -1843,26 +1794,17 @@ static int mana_gd_setup_remaining_irqs(struct pci_dev *pdev)
18431794
static void mana_gd_remove_irqs(struct pci_dev *pdev)
18441795
{
18451796
struct gdma_context *gc = pci_get_drvdata(pdev);
1846-
struct gdma_irq_context *gic;
18471797
int irq, i;
18481798

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

1852-
for (i = 0; i < gc->max_num_msix; i++) {
1853-
irq = pci_irq_vector(pdev, i);
1854-
if (irq < 0)
1855-
continue;
1856-
1857-
gic = xa_load(&gc->irq_contexts, i);
1858-
if (WARN_ON(!gic))
1859-
continue;
1860-
1802+
for (i = 0; i < (gc->msi_sharing ? gc->max_num_msix : 1); i++) {
18611803
/* Need to clear the hint before free_irq */
1804+
irq = pci_irq_vector(pdev, i);
18621805
irq_update_affinity_hint(irq, NULL);
1863-
free_irq(irq, gic);
1864-
xa_erase(&gc->irq_contexts, i);
1865-
kfree(gic);
1806+
1807+
gdma_put_gic(gc, !gc->msi_sharing, i);
18661808
}
18671809

18681810
pci_free_irq_vectors(pdev);

0 commit comments

Comments
 (0)