@@ -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)
16731661free_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 );
17621719free_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)
18441795static 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