提交 d6037d22 编写于 作者: A Arik Nemtsov 提交者: Luciano Coelho

wlcore: don't take mutex before stopping queues

Protect all functions touching queue_stop_reasons by spin-lock, since
they are accessed by op_tx. Now there's no need to take the mutex
before caling wlcore_queue_xxx functions.
Signed-off-by: NArik Nemtsov <arik@wizery.com>
Signed-off-by: NLuciano Coelho <coelho@ti.com>
上级 1c33db78
...@@ -1200,8 +1200,8 @@ static void wl1271_op_tx(struct ieee80211_hw *hw, ...@@ -1200,8 +1200,8 @@ static void wl1271_op_tx(struct ieee80211_hw *hw,
*/ */
if (hlid == WL12XX_INVALID_LINK_ID || if (hlid == WL12XX_INVALID_LINK_ID ||
(!test_bit(hlid, wlvif->links_map)) || (!test_bit(hlid, wlvif->links_map)) ||
(wlcore_is_queue_stopped(wl, wlvif, q) && (wlcore_is_queue_stopped_locked(wl, wlvif, q) &&
!wlcore_is_queue_stopped_by_reason(wl, wlvif, q, !wlcore_is_queue_stopped_by_reason_locked(wl, wlvif, q,
WLCORE_QUEUE_STOP_REASON_WATERMARK))) { WLCORE_QUEUE_STOP_REASON_WATERMARK))) {
wl1271_debug(DEBUG_TX, "DROP skb hlid %d q %d", hlid, q); wl1271_debug(DEBUG_TX, "DROP skb hlid %d q %d", hlid, q);
ieee80211_free_txskb(hw, skb); ieee80211_free_txskb(hw, skb);
...@@ -1220,7 +1220,7 @@ static void wl1271_op_tx(struct ieee80211_hw *hw, ...@@ -1220,7 +1220,7 @@ static void wl1271_op_tx(struct ieee80211_hw *hw,
* the queue here, otherwise the queue will get too long. * the queue here, otherwise the queue will get too long.
*/ */
if (wlvif->tx_queue_count[q] >= WL1271_TX_QUEUE_HIGH_WATERMARK && if (wlvif->tx_queue_count[q] >= WL1271_TX_QUEUE_HIGH_WATERMARK &&
!wlcore_is_queue_stopped_by_reason(wl, wlvif, q, !wlcore_is_queue_stopped_by_reason_locked(wl, wlvif, q,
WLCORE_QUEUE_STOP_REASON_WATERMARK)) { WLCORE_QUEUE_STOP_REASON_WATERMARK)) {
wl1271_debug(DEBUG_TX, "op_tx: stopping queues for q %d", q); wl1271_debug(DEBUG_TX, "op_tx: stopping queues for q %d", q);
wlcore_stop_queue_locked(wl, wlvif, q, wlcore_stop_queue_locked(wl, wlvif, q,
...@@ -3229,10 +3229,7 @@ static int wlcore_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, ...@@ -3229,10 +3229,7 @@ static int wlcore_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
* stop the queues and flush to ensure the next packets are * stop the queues and flush to ensure the next packets are
* in sync with FW spare block accounting * in sync with FW spare block accounting
*/ */
mutex_lock(&wl->mutex);
wlcore_stop_queues(wl, WLCORE_QUEUE_STOP_REASON_SPARE_BLK); wlcore_stop_queues(wl, WLCORE_QUEUE_STOP_REASON_SPARE_BLK);
mutex_unlock(&wl->mutex);
wl1271_tx_flush(wl); wl1271_tx_flush(wl);
} }
......
...@@ -1287,14 +1287,33 @@ void wlcore_wake_queues(struct wl1271 *wl, ...@@ -1287,14 +1287,33 @@ void wlcore_wake_queues(struct wl1271 *wl,
bool wlcore_is_queue_stopped_by_reason(struct wl1271 *wl, bool wlcore_is_queue_stopped_by_reason(struct wl1271 *wl,
struct wl12xx_vif *wlvif, u8 queue, struct wl12xx_vif *wlvif, u8 queue,
enum wlcore_queue_stop_reason reason) enum wlcore_queue_stop_reason reason)
{
unsigned long flags;
bool stopped;
spin_lock_irqsave(&wl->wl_lock, flags);
stopped = wlcore_is_queue_stopped_by_reason_locked(wl, wlvif, queue,
reason);
spin_unlock_irqrestore(&wl->wl_lock, flags);
return stopped;
}
bool wlcore_is_queue_stopped_by_reason_locked(struct wl1271 *wl,
struct wl12xx_vif *wlvif, u8 queue,
enum wlcore_queue_stop_reason reason)
{ {
int hwq = wlcore_tx_get_mac80211_queue(wlvif, queue); int hwq = wlcore_tx_get_mac80211_queue(wlvif, queue);
WARN_ON_ONCE(!spin_is_locked(&wl->wl_lock));
return test_bit(reason, &wl->queue_stop_reasons[hwq]); return test_bit(reason, &wl->queue_stop_reasons[hwq]);
} }
bool wlcore_is_queue_stopped(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool wlcore_is_queue_stopped_locked(struct wl1271 *wl, struct wl12xx_vif *wlvif,
u8 queue) u8 queue)
{ {
int hwq = wlcore_tx_get_mac80211_queue(wlvif, queue); int hwq = wlcore_tx_get_mac80211_queue(wlvif, queue);
WARN_ON_ONCE(!spin_is_locked(&wl->wl_lock));
return !!wl->queue_stop_reasons[hwq]; return !!wl->queue_stop_reasons[hwq];
} }
...@@ -268,7 +268,12 @@ void wlcore_wake_queues(struct wl1271 *wl, ...@@ -268,7 +268,12 @@ void wlcore_wake_queues(struct wl1271 *wl,
bool wlcore_is_queue_stopped_by_reason(struct wl1271 *wl, bool wlcore_is_queue_stopped_by_reason(struct wl1271 *wl,
struct wl12xx_vif *wlvif, u8 queue, struct wl12xx_vif *wlvif, u8 queue,
enum wlcore_queue_stop_reason reason); enum wlcore_queue_stop_reason reason);
bool wlcore_is_queue_stopped(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool
wlcore_is_queue_stopped_by_reason_locked(struct wl1271 *wl,
struct wl12xx_vif *wlvif,
u8 queue,
enum wlcore_queue_stop_reason reason);
bool wlcore_is_queue_stopped_locked(struct wl1271 *wl, struct wl12xx_vif *wlvif,
u8 queue); u8 queue);
/* from main.c */ /* from main.c */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册