On Fri, Aug 23, 2024 at 09:25:01PM +0530, Manivannan Sadhasivam wrote: > If a shared IRQ is used by the driver due to platform limitation, then the > IRQ affinity hint is set right after the allocation of IRQ vectors in > ath11k_pci_alloc_msi(). This does no harm unless one of the functions > requesting the IRQ fails and attempt to free the IRQ. > > This may end up with a warning from the IRQ core that is expecting the > affinity hint to be cleared before freeing the IRQ: > > kernel/irq/manage.c: > > /* make sure affinity_hint is cleaned up */ > if (WARN_ON_ONCE(desc->affinity_hint)) > desc->affinity_hint = NULL; > > So to fix this, let's set the IRQ affinity hint after requesting all the > shared IRQ. This will make sure that the affinity hint gets cleared in the > error path before freeing the IRQ. > Apparently, I missed adding the fixes tag: Fixes: a3012f206d07 ("wifi: ath12k: set IRQ affinity to CPU0 in case of one MSI vector") - Mani > Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@xxxxxxxxxx> > --- > drivers/net/wireless/ath/ath12k/pci.c | 24 ++++++++++++------------ > 1 file changed, 12 insertions(+), 12 deletions(-) > > diff --git a/drivers/net/wireless/ath/ath12k/pci.c b/drivers/net/wireless/ath/ath12k/pci.c > index 9e0b9e329bda..f265c1b8ce4e 100644 > --- a/drivers/net/wireless/ath/ath12k/pci.c > +++ b/drivers/net/wireless/ath/ath12k/pci.c > @@ -1446,16 +1446,10 @@ static int ath12k_pci_probe(struct pci_dev *pdev, > if (ret) > goto err_pci_msi_free; > > - ret = ath12k_pci_set_irq_affinity_hint(ab_pci, cpumask_of(0)); > - if (ret) { > - ath12k_err(ab, "failed to set irq affinity %d\n", ret); > - goto err_pci_msi_free; > - } > - > ret = ath12k_mhi_register(ab_pci); > if (ret) { > ath12k_err(ab, "failed to register mhi: %d\n", ret); > - goto err_irq_affinity_cleanup; > + goto err_pci_msi_free; > } > > ret = ath12k_hal_srng_init(ab); > @@ -1476,6 +1470,12 @@ static int ath12k_pci_probe(struct pci_dev *pdev, > goto err_ce_free; > } > > + ret = ath12k_pci_set_irq_affinity_hint(ab_pci, cpumask_of(0)); > + if (ret) { > + ath12k_err(ab, "failed to set irq affinity %d\n", ret); > + goto err_free_irq; > + } > + > /* kernel may allocate a dummy vector before request_irq and > * then allocate a real vector when request_irq is called. > * So get msi_data here again to avoid spurious interrupt > @@ -1484,16 +1484,19 @@ static int ath12k_pci_probe(struct pci_dev *pdev, > ret = ath12k_pci_config_msi_data(ab_pci); > if (ret) { > ath12k_err(ab, "failed to config msi_data: %d\n", ret); > - goto err_free_irq; > + goto err_irq_affinity_cleanup; > } > > ret = ath12k_core_init(ab); > if (ret) { > ath12k_err(ab, "failed to init core: %d\n", ret); > - goto err_free_irq; > + goto err_irq_affinity_cleanup; > } > return 0; > > +err_irq_affinity_cleanup: > + ath12k_pci_set_irq_affinity_hint(ab_pci, NULL); > + > err_free_irq: > ath12k_pci_free_irq(ab); > > @@ -1509,9 +1512,6 @@ static int ath12k_pci_probe(struct pci_dev *pdev, > err_pci_msi_free: > ath12k_pci_msi_free(ab_pci); > > -err_irq_affinity_cleanup: > - ath12k_pci_set_irq_affinity_hint(ab_pci, NULL); > - > err_pci_free_region: > ath12k_pci_free_region(ab_pci); > > -- > 2.25.1 > -- மணிவண்ணன் சதாசிவம்