ath11k: Fix napi related hang
PATCH 1/1 ath11k: Fix napi related hang
From: Ben Greear <[email protected]>
Similar to the same bug in ath10k, a napi disable w/out it being enabled will hang forever. I believe I saw this while trying rmmod after driver had some failure on startup. Fix it by keeping state on whether napi is enabled or not.
And, remove un-used napi pointer in ath10k driver base struct.
--- drivers/net/wireless/ath/ath11k/ahb.c | 12 +++++++++--- drivers/net/wireless/ath/ath11k/core.h | 2 +- drivers/net/wireless/ath/ath11k/pci.c | 12 +++++++++--- 3 files changed, 19 insertions(+), 7 deletions(-)
drivers/net/wireless/ath/ath11k/ahb.c +9 -3
@@ -411,8 +411,11 @@ static void __ath11k_ahb_ext_irq_disable(struct ath11k_base *ab)ath11k_ahb_ext_grp_disable (irq_grp); -napi_synchronize (&irq_grp->napi); -napi_disable (&irq_grp->napi); +if (irq_grp->napi_enabled) { +napi_synchronize (&irq_grp->napi); +napi_disable (&irq_grp->napi); + irq_grp->napi_enabled = false; + } } }
@@ -536,7 +539,10 @@ static void ath11k_ahb_ext_irq_enable(struct ath11k_base *ab)for (i =0 ; i <ATH11K_EXT_IRQ_GRP_NUM_MAX ; i++) {struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; -napi_enable (&irq_grp->napi); +if (!irq_grp->napi_enabled) { +napi_enable (&irq_grp->napi); + irq_grp->napi_enabled = true; + }ath11k_ahb_ext_grp_enable (irq_grp); } }
drivers/net/wireless/ath/ath11k/core.h +1 -1
@@ -111,6 +111,7 @@ struct ath11k_ext_irq_grp {u32 num_irq;u32 grp_id;u64 timestamp; +bool napi_enabled;struct napi_struct napi;struct net_device napi_ndev; };
@@ -674,7 +675,6 @@ struct ath11k_base {u32 wlan_init_status;int irq_num[ATH11K_IRQ_NUM_MAX ];struct ath11k_ext_irq_grp ext_irq_grp[ATH11K_EXT_IRQ_GRP_NUM_MAX ]; -struct napi_struct *napi;struct ath11k_targ_cap target_caps;u32 ext_service_bitmap[WMI_SERVICE_EXT_BM_SIZE ];bool pdevs_macaddr_valid;
drivers/net/wireless/ath/ath11k/pci.c +9 -3
@@ -569,8 +569,11 @@ static void __ath11k_pci_ext_irq_disable(struct ath11k_base *sc)ath11k_pci_ext_grp_disable (irq_grp); -napi_synchronize (&irq_grp->napi); -napi_disable (&irq_grp->napi); +if (irq_grp->napi_enabled) { +napi_synchronize (&irq_grp->napi); +napi_disable (&irq_grp->napi); + irq_grp->napi_enabled = false; + } } }
@@ -589,7 +592,10 @@ static void ath11k_pci_ext_irq_enable(struct ath11k_base *ab)for (i =0 ; i <ATH11K_EXT_IRQ_GRP_NUM_MAX ; i++) {struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; -napi_enable (&irq_grp->napi); +if (!irq_grp->napi_enabled) { +napi_enable (&irq_grp->napi); + irq_grp->napi_enabled = true; + }ath11k_pci_ext_grp_enable (irq_grp); } }
Signature · 7 lines
2.26.2 -- ath11k mailing list [email protected] http://lists.infradead.org/mailman/listinfo/ath11k
Quoted 9 lines · [email protected] wrote:
Similar to the same bug in ath10k, a napi disable w/out it being enabled will hang forever. I believe I saw this while trying rmmod after driver had some failure on startup. Fix it by keeping state on whether napi is enabled or not.
And, remove un-used napi pointer in ath11k driver base struct.
Signed-off-by Ben Greear <[email protected]>Signed-off-by Kalle Valo <[email protected]>
Patch applied to ath-next branch of ath.git, thanks.
d943fdad7589 ath11k: Fix napi related hang
Signature · 3 lines
https://patchwork.kernel.org/project/linux-wireless/patch/[email protected]/ https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches