mwifiex: hold proper locks when accessing ra_list / bss_prio lists
authorAndreas Fenkart <andreas.fenkart@streamunlimited.com>
Fri, 5 Apr 2013 03:03:53 +0000 (20:03 -0700)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 8 Apr 2013 19:28:40 +0000 (15:28 -0400)
commit2716fd7d455e277ad8676df794fe65bd1e1ba442
treef5d963c27c3f82653e47ebf5d5603db666a8fcd3
parent333f6b22c5b88a9d856703b440257f46efa714c8
mwifiex: hold proper locks when accessing ra_list / bss_prio lists

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: Andreas Fenkart <andreas.fenkart@streamunlimited.com>
Signed-off-by: Bing Zhao <bzhao@marvell.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/mwifiex/wmm.c