• A
    mwifiex: hold proper locks when accessing ra_list / bss_prio lists · 2716fd7d
    Andreas Fenkart 提交于
    Not locking ra_list when dequeuing packets creates race conditions.
    When adding a packet 'tx_pkts_queued' is modified before setting
    highest_priority_queue. If in-between the main loop starts, it will
    see a packet queued (tx_pkts_queued > 0) but will not find it, since
    max prio is not set yet. Depending on the scheduling, the thread
    trying to add the packet could complete and restore the situation.
    But this is not something to rely on.
    
    Another race condition exists, if a new packet, exceeding current
    max prio is added. If concurrently a packet is dequeued, the newly
    set max prio will be overwritten with the value of the dequeued
    packet. This can occur, because selecting a packet and modifying
    the max prio is not atomic. The result in an infinite loop unless,
    a new packet is added that has at least the priority of the hidden
    packet.
    
    Same applies to bss_prio_tbl. Forward iteration is no proper
    lock-free technique and provides no protection from calls to
    list_del. Although BSS are currently not added/removed dynamically,
    this must not be the case in the future. Hence always hold proper
    locks when accessing those lists.
    Signed-off-by: NAndreas Fenkart <andreas.fenkart@streamunlimited.com>
    Signed-off-by: NBing Zhao <bzhao@marvell.com>
    Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
    2716fd7d
wmm.c 35.6 KB