• Andreas Fenkart's avatar
    mwifiex: fix infinite loop by removing NO_PKT_PRIO_TID · 333f6b22
    Andreas Fenkart authored
    Using NO_PKT_PRIO_TID and tx_pkts_queued to check for an empty
    state, can lead to a contradictory state, resulting in an
    infinite loop. Currently queueing and dequeuing of packets is
    not synchronized, and can happen concurrently. While tx_pkts_queued
    is incremented when adding a packet, max prio is set to NO_PKT when
    the WMM list is empty. If a packet is added right after the check
    for empty, but before setting max prio to NO_PKT, that packet is
    trapped and creates an infinite loop.
    
    Because of the new packet, tx_pkts_queued is at least 1, indicating
    wmm lists are not empty. Opposing that max prio is NO_PKT, which
    means "skip this wmm queue, it has no packets". The infinite loop
    results, because the main loop checks the wmm lists for not empty
    via tx_pkts_queued, but for dequeing it uses max_prio to see if it
    can skip current list. This will never end, unless a new packet is
    added which will restore max prio to the level of the trapped packet.
    
    The solution here is to rely on tx_pkts_queued solely for checking
    wmm queue to be empty, and drop the NO_PKT define. It does not
    address the locking issue.
    Signed-off-by: default avatarAndreas Fenkart <andreas.fenkart@streamunlimited.com>
    Signed-off-by: default avatarAvinash Patil <patila@marvell.com>
    Signed-off-by: default avatarBing Zhao <bzhao@marvell.com>
    Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
    333f6b22
wmm.c 35.5 KB