@@ -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)
16721660free_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 );
17611718free_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)
18431794static 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