> > 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@xxxxxxxxxx> > --- > drivers/net/wireless/mediatek/mt76/dma.c | 15 +++++++-------- > 1 file changed, 7 insertions(+), 8 deletions(-) > > diff --git a/drivers/net/wireless/mediatek/mt76/dma.c b/drivers/net/wireless/mediatek/mt76/dma.c > index b7fd2e110663..1db163c40dcf 100644 > --- a/drivers/net/wireless/mediatek/mt76/dma.c > +++ b/drivers/net/wireless/mediatek/mt76/dma.c > @@ -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; > -- > 2.19.2 > Hi Felix, what about this patch? Regards, Lorenzo