mt76: dma: queue more rx frames internally before passing them to the stack

On MT7615 and MT7915, packets received from DMA can include TX_FREE events,
which free up space for tx. In order to process those packets faster, keep
keep a longer internal queue of packets and pass as many packets to the
stack as the NAPI budget allows

Signed-off-by: Felix Fietkau <[email protected]>
This commit is contained in:
Felix Fietkau
2020-09-04 19:34:57 +02:00
parent bab866a01e
commit 0fc3c5eb61
5 changed files with 21 additions and 12 deletions
+7 -5
View File
@@ -599,7 +599,8 @@ static int
mt76_dma_rx_poll(struct napi_struct *napi, int budget)
{
struct mt76_dev *dev;
int qid, done = 0, cur;
int qid, done = 0, cur, cur_dma;
int rxq_budget;
dev = container_of(napi->dev, struct mt76_dev, napi_dev);
qid = napi - dev->napi;
@@ -607,17 +608,18 @@ mt76_dma_rx_poll(struct napi_struct *napi, int budget)
rcu_read_lock();
do {
cur = mt76_dma_rx_process(dev, &dev->q_rx[qid], budget - done);
mt76_rx_poll_complete(dev, qid, napi);
rxq_budget = MT_RX_QUEUE_LEN - skb_queue_len(&dev->rx_skb[qid]);
cur_dma = mt76_dma_rx_process(dev, &dev->q_rx[qid], rxq_budget);
cur = mt76_rx_poll_complete(dev, qid, napi, budget - done);
done += cur;
} while (cur && done < budget);
} while ((cur || cur_dma) && done < budget);
rcu_read_unlock();
if (done < budget && napi_complete(napi))
dev->drv->rx_poll_complete(dev, qid);
return done;
return min(done, budget);
}
static int
+8 -3
View File
@@ -962,20 +962,25 @@ void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames,
}
}
void mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q,
struct napi_struct *napi)
int mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q,
struct napi_struct *napi, int budget)
{
struct sk_buff_head frames;
struct sk_buff *skb;
int nframes;
__skb_queue_head_init(&frames);
while ((skb = __skb_dequeue(&dev->rx_skb[q])) != NULL) {
while (budget > skb_queue_len(&frames) &&
(skb = __skb_dequeue(&dev->rx_skb[q])) != NULL) {
mt76_check_sta(dev, skb);
mt76_rx_aggr_reorder(skb, &frames);
}
nframes = skb_queue_len(&frames);
mt76_rx_complete(dev, &frames, napi);
return nframes;
}
EXPORT_SYMBOL_GPL(mt76_rx_poll_complete);
+4 -2
View File
@@ -24,6 +24,8 @@
#define MT_MAX_NON_AQL_PKT 16
#define MT_TXQ_FREE_THR 32
#define MT_RX_QUEUE_LEN 256
struct mt76_dev;
struct mt76_phy;
struct mt76_wcid;
@@ -1013,8 +1015,8 @@ mt76_tx_status_get_hw(struct mt76_dev *dev, struct sk_buff *skb)
void mt76_put_txwi(struct mt76_dev *dev, struct mt76_txwi_cache *t);
void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames,
struct napi_struct *napi);
void mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q,
struct napi_struct *napi);
int mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q,
struct napi_struct *napi, int budget);
void mt76_rx_aggr_reorder(struct sk_buff *skb, struct sk_buff_head *frames);
void mt76_testmode_tx_pending(struct mt76_dev *dev);
void mt76_queue_tx_complete(struct mt76_dev *dev, struct mt76_queue *q,
+1 -1
View File
@@ -126,7 +126,7 @@ mt76s_process_rx_queue(struct mt76_dev *dev, struct mt76_queue *q)
nframes++;
}
if (qid == MT_RXQ_MAIN)
mt76_rx_poll_complete(dev, MT_RXQ_MAIN, NULL);
mt76_rx_poll_complete(dev, MT_RXQ_MAIN, NULL, MT_RX_QUEUE_LEN);
return nframes;
}
+1 -1
View File
@@ -666,7 +666,7 @@ mt76u_process_rx_queue(struct mt76_dev *dev, struct mt76_queue *q)
mt76u_submit_rx_buf(dev, qid, urb);
}
if (qid == MT_RXQ_MAIN)
mt76_rx_poll_complete(dev, MT_RXQ_MAIN, NULL);
mt76_rx_poll_complete(dev, MT_RXQ_MAIN, NULL, MT_RX_QUEUE_LEN);
}
static void mt76u_rx_tasklet(unsigned long data)