Patch "wifi: ath11k: fix race due to setting ATH11K_FLAG_EXT_IRQ_ENABLED too early" has been added to the 6.6-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    wifi: ath11k: fix race due to setting ATH11K_FLAG_EXT_IRQ_ENABLED too early

to the 6.6-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     wifi-ath11k-fix-race-due-to-setting-ath11k_flag_ext_.patch
and it can be found in the queue-6.6 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit d5644a63d4e3a62723c187a021da27b58c3217e9
Author: Baochen Qiang <quic_bqiang@xxxxxxxxxxx>
Date:   Fri Nov 17 08:39:19 2023 +0800

    wifi: ath11k: fix race due to setting ATH11K_FLAG_EXT_IRQ_ENABLED too early
    
    [ Upstream commit 5082b3e3027eae393a4e86874bffb4ce3f83c26e ]
    
    We are seeing below error randomly in the case where only
    one MSI vector is configured:
    
    kernel: ath11k_pci 0000:03:00.0: wmi command 16387 timeout
    
    The reason is, currently, in ath11k_pcic_ext_irq_enable(),
    ATH11K_FLAG_EXT_IRQ_ENABLED is set before NAPI is enabled.
    This results in a race condition: after
    ATH11K_FLAG_EXT_IRQ_ENABLED is set but before NAPI enabled,
    CE interrupt breaks in. Since IRQ is shared by CE and data
    path, ath11k_pcic_ext_interrupt_handler() is also called
    where we call disable_irq_nosync() to disable IRQ. Then
    napi_schedule() is called but it does nothing because NAPI
    is not enabled at that time, meaning
    ath11k_pcic_ext_grp_napi_poll() will never run, so we have
    no chance to call enable_irq() to enable IRQ back. Finally
    we get above error.
    
    Fix it by setting ATH11K_FLAG_EXT_IRQ_ENABLED after all
    NAPI and IRQ work are done. With the fix, we are sure that
    by the time ATH11K_FLAG_EXT_IRQ_ENABLED is set, NAPI is
    enabled.
    
    Note that the fix above also introduce some side effects:
    if ath11k_pcic_ext_interrupt_handler() breaks in after NAPI
    enabled but before ATH11K_FLAG_EXT_IRQ_ENABLED set, nothing
    will be done by the handler this time, the work will be
    postponed till the next time the IRQ fires.
    
    Tested-on: WCN6855 hw2.1 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.23
    
    Signed-off-by: Baochen Qiang <quic_bqiang@xxxxxxxxxxx>
    Acked-by: Jeff Johnson <quic_jjohnson@xxxxxxxxxxx>
    Signed-off-by: Kalle Valo <quic_kvalo@xxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20231117003919.26218-1-quic_bqiang@xxxxxxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/wireless/ath/ath11k/pcic.c b/drivers/net/wireless/ath/ath11k/pcic.c
index c63083633b37..011cf5fb8023 100644
--- a/drivers/net/wireless/ath/ath11k/pcic.c
+++ b/drivers/net/wireless/ath/ath11k/pcic.c
@@ -460,8 +460,6 @@ void ath11k_pcic_ext_irq_enable(struct ath11k_base *ab)
 {
 	int i;
 
-	set_bit(ATH11K_FLAG_EXT_IRQ_ENABLED, &ab->dev_flags);
-
 	for (i = 0; i < ATH11K_EXT_IRQ_GRP_NUM_MAX; i++) {
 		struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i];
 
@@ -471,6 +469,8 @@ void ath11k_pcic_ext_irq_enable(struct ath11k_base *ab)
 		}
 		ath11k_pcic_ext_grp_enable(irq_grp);
 	}
+
+	set_bit(ATH11K_FLAG_EXT_IRQ_ENABLED, &ab->dev_flags);
 }
 EXPORT_SYMBOL(ath11k_pcic_ext_irq_enable);
 




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux