mirror of https://gitee.com/openkylin/linux.git
mt76: dma: do not build skb if reported len does not fit in buf_size
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>
This commit is contained in:
parent
c09f4d0a1f
commit
87e86f9019
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue