mt76: retry rx polling as long as there is budget left
authorFelix Fietkau <nbd@nbd.name>
Wed, 24 Jan 2018 15:19:10 +0000 (16:19 +0100)
committerKalle Valo <kvalo@codeaurora.org>
Fri, 26 Jan 2018 09:18:31 +0000 (11:18 +0200)
Sending frames to mac80211 needs time, which could allow for more rx
packets to end up in the DMA ring. Retry polling until there are no more
frames left. Improves rx latency under load.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/mediatek/mt76/dma.c

index ecd409a4a89b1f7bb5ce721a6a2009d1ecd41481..e539b3838b9447e82f5db2da2d52196b24d033f3 100644 (file)
@@ -387,17 +387,21 @@ static int
 mt76_dma_rx_poll(struct napi_struct *napi, int budget)
 {
        struct mt76_dev *dev;
-       int qid, done;
+       int qid, done = 0, cur;
 
        dev = container_of(napi->dev, struct mt76_dev, napi_dev);
        qid = napi - dev->napi;
 
-       done = mt76_dma_rx_process(dev, &dev->q_rx[qid], budget);
+       do {
+               cur = mt76_dma_rx_process(dev, &dev->q_rx[qid], budget - done);
+               mt76_rx_complete(dev, qid);
+               done += cur;
+       } while (cur && done < budget);
+
        if (done < budget) {
                napi_complete(napi);
                dev->drv->rx_poll_complete(dev, qid);
        }
-       mt76_rx_complete(dev, qid);
 
        return done;
 }