• Johannes Berg's avatar
    iwlwifi: mvm: fix delBA vs. NSSN queue sync race · 2438d430
    Johannes Berg authored
    If we happen to decide an NSSN queue sync (IWL_MVM_RXQ_NSSN_SYNC)
    for some remaining packets that are still on the queue, but just
    after we've decided to do a delBA (which causes its own queues
    sync with IWL_MVM_RXQ_NOTIF_DEL_BA) we can end up with a sequence
    of events like this:
    
     CPU 1                              CPU 2
    
    remove BA session with baid N
    send IWL_MVM_RXQ_NOTIF_DEL_BA
    send IWL_MVM_RXQ_NSSN_SYNC
    get IWL_MVM_RXQ_NOTIF_DEL_BA
                                        get IWL_MVM_RXQ_NOTIF_DEL_BA
    get IWL_MVM_RXQ_NSSN_SYNC
    complete IWL_MVM_RXQ_NOTIF_DEL_BA
    remove N from baid_map[]
                                        get IWL_MVM_RXQ_NSSN_SYNC
                                        WARN_ON(!baid_map[N])
    
    Thus, there's a race that leads in hitting the WARN_ON, but more
    importantly, it's a race that potentially even results in a new
    aggregation session getting assigned to baid N.
    
    To fix this, remove the WARN_ON() in the NSSN_SYNC case, we can't
    completely protect against hitting this case, so we shouldn't be
    warning. However, guard ourselves against BAID reuse by doing yet
    another round of queue synchronization after the entry is removed
    from the baid_map, so that it cannot be reused with any in-flight
    IWL_MVM_RXQ_NSSN_SYNC messages.
    Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
    Signed-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
    Link: https://lore.kernel.org/r/iwlwifi.20211204083237.44abbbc50f40.I5492600dfe513356555abe2d7df0e2835846e3d8@changeidSigned-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
    2438d430
rxmq.c 68.3 KB