mt76: introduce q->stopped parameter
Subsystems (2)
A message that is not in the archive (sent off-list or not yet received): [email protected]
Lorenzo Bianconi
maintainerPATCH 1/1 mt76: introduce q->stopped parameter
Introduce mt76_queue stopped parameter in order to run ieee80211_wake_queue only when mac80211 queues have been previously stopped and avoid to disable interrupts when it is not necessary.
Move ieee80211_stop_queue out of q->lock critical section
--- drivers/net/wireless/mediatek/mt76/dma.c | 5 ++++- drivers/net/wireless/mediatek/mt76/mt76.h | 1 + drivers/net/wireless/mediatek/mt76/tx.c | 12 +++++++++--- drivers/net/wireless/mediatek/mt76/usb.c | 6 +++++- 4 files changed, 19 insertions(+), 5 deletions(-)
drivers/net/wireless/mediatek/mt76/dma.c +4 -1
@@ -180,7 +180,10 @@ mt76_dma_tx_cleanup(struct mt76_dev *dev, enum mt76_txq_id qid, bool flush)else mt76_dma_sync_idx (dev, q); - wake = wake && qid <IEEE80211_NUM_ACS && q->queued < q->ndesc -8 ; + wake = wake && q->stopped && + qid <IEEE80211_NUM_ACS && q->queued < q->ndesc -8 ; +if (wake) + q->stopped = false;if (!q->queued)wake_up (&dev->tx_wait);
drivers/net/wireless/mediatek/mt76/mt76.h +1 -0
@@ -126,6 +126,7 @@ struct mt76_queue {int ndesc;int queued;int buf_size; +bool stopped;u8 buf_offset;u8 hw_idx;
drivers/net/wireless/mediatek/mt76/tx.c +9 -3
@@ -258,8 +258,9 @@ mt76_tx(struct mt76_dev *dev, struct ieee80211_sta *sta, {struct ieee80211_tx_info *info =IEEE80211_SKB_CB (skb);struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; -struct mt76_queue *q;int qid =skb_get_queue_mapping (skb); +struct mt76_queue *q; +bool stop;if (WARN_ON (qid >=MT_TXQ_PSD )) { qid =MT_TXQ_BE ;
@@ -289,9 +290,14 @@ mt76_tx(struct mt76_dev *dev, struct ieee80211_sta *sta, dev->queue_ops->tx_queue_skb (dev, q, skb, wcid, sta); dev->queue_ops->kick (dev, q); -if (q->queued > q->ndesc -8 ) -ieee80211_stop_queue (dev->hw,skb_get_queue_mapping (skb)); + stop = q->queued > q->ndesc -8 && !q->stopped; +if (stop) + q->stopped = true; +spin_unlock_bh (&q->lock); + +if (stop) +ieee80211_stop_queue (dev->hw,skb_get_queue_mapping (skb)); }EXPORT_SYMBOL_GPL (mt76_tx);
drivers/net/wireless/mediatek/mt76/usb.c +5 -1
@@ -655,7 +655,11 @@ static void mt76u_tx_tasklet(unsigned long data)spin_lock_bh (&q->lock); }mt76_txq_schedule (dev, q); - wake = i <IEEE80211_NUM_ACS && q->queued < q->ndesc -8 ; + + wake = q->stopped && q->queued < q->ndesc -8 ; +if (wake) + q->stopped = false; +if (!q->queued)wake_up (&dev->tx_wait);
Signature · 1 line
2.20.1
Quoted 4 lines · Lorenzo Bianconi
drivers/net/wireless/mediatek/mt76/tx.c +0
-0@@ -289,9 +290,14 @@ mt76_tx(struct mt76_dev *dev, struct ieee80211_sta *sta, dev->queue_ops->tx_queue_skb (dev, q, skb, wcid, sta); dev->queue_ops->kick (dev, q);
drivers/net/wireless/mediatek/mt76/tx.c mt76_tx(struct mt76_dev *dev, struct ieee80211_sta *sta, · line 300
Quoted 10 lines
drivers/net/wireless/mediatek/mt76/tx.c +7
-2-if (q->queued > q->ndesc -8 ) -ieee80211_stop_queue (dev->hw,skb_get_queue_mapping (skb)); + stop = q->queued > q->ndesc -8 && !q->stopped; +if (stop) + q->stopped = true; +spin_unlock_bh (&q->lock); + +if (stop) +ieee80211_stop_queue (dev->hw,skb_get_queue_mapping (skb));
I don't think taking this outside of spin_lock section is beneficial. Actually is better to do this faster than slower to prevent enqueue frames by mac80211 and then dropped them due to lack of space in mt76 queue.
Stanislaw
Quoted 5 lines · Lorenzo Bianconi
Quoted 4 lines
drivers/net/wireless/mediatek/mt76/tx.c +0
-0@@ -289,9 +290,14 @@ mt76_tx(struct mt76_dev *dev, struct ieee80211_sta *sta, dev->queue_ops->tx_queue_skb (dev, q, skb, wcid, sta); dev->queue_ops->kick (dev, q);
Quoted 15 lines
drivers/net/wireless/mediatek/mt76/tx.c mt76_tx(struct mt76_dev *dev, struct ieee80211_sta *sta, · line 300
Quoted 10 lines
drivers/net/wireless/mediatek/mt76/tx.c +7
-2-if (q->queued > q->ndesc -8 ) -ieee80211_stop_queue (dev->hw,skb_get_queue_mapping (skb)); + stop = q->queued > q->ndesc -8 && !q->stopped; +if (stop) + q->stopped = true; +spin_unlock_bh (&q->lock); + +if (stop) +ieee80211_stop_queue (dev->hw,skb_get_queue_mapping (skb));I don't think taking this outside of
spin_locksection is beneficial. Actually is better to do this faster than slower to prevent enqueue frames by mac80211 and then dropped them due to lack of space in mt76 queue.
ack, I will send a v2 moving it back.
Regards,
Lorenzo
Quoted 2 lines
Stanislaw