mt76: dma: do not build skb if reported len does not fit in buf_size
authorLorenzo Bianconi <lorenzo.bianconi@redhat.com>
Mon, 3 Dec 2018 14:34:24 +0000 (15:34 +0100)
committerFelix Fietkau <nbd@nbd.name>
Fri, 11 Jan 2019 14:10:18 +0000 (15:10 +0100)
Precompute data length in order to avoid to allocate the related
skb data structure if reported length does not fit in queue buf_size

Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/dma.c

index b7fd2e1..1db163c 100644 (file)
@@ -417,10 +417,9 @@ mt76_add_fragment(struct mt76_dev *dev, struct mt76_queue *q, void *data,
 static int
 mt76_dma_rx_process(struct mt76_dev *dev, struct mt76_queue *q, int budget)
 {
+       int len, data_len, done = 0;
        struct sk_buff *skb;
        unsigned char *data;
-       int len;
-       int done = 0;
        bool more;
 
        while (done < budget) {
@@ -430,7 +429,12 @@ mt76_dma_rx_process(struct mt76_dev *dev, struct mt76_queue *q, int budget)
                if (!data)
                        break;
 
-               if (q->buf_size < len + q->buf_offset) {
+               if (q->rx_head)
+                       data_len = q->buf_size;
+               else
+                       data_len = SKB_WITH_OVERHEAD(q->buf_size);
+
+               if (data_len < len + q->buf_offset) {
                        dev_kfree_skb(q->rx_head);
                        q->rx_head = NULL;
 
@@ -448,12 +452,7 @@ mt76_dma_rx_process(struct mt76_dev *dev, struct mt76_queue *q, int budget)
                        skb_free_frag(data);
                        continue;
                }
-
                skb_reserve(skb, q->buf_offset);
-               if (skb->tail + len > skb->end) {
-                       dev_kfree_skb(skb);
-                       continue;
-               }
 
                if (q == &dev->q_rx[MT_RXQ_MCU]) {
                        u32 *rxfce = (u32 *) skb->cb;