Skip to content

Commit

Permalink
net: moxa: continue loop on skb allocation failure
Browse files Browse the repository at this point in the history
If netdev_alloc_skb_ip_align() fails, subsequent code will
try to dereference an invalid pointer.

Continue to next descriptor on error.

While we're at it,

1. eliminate the chance of an endless loop, replace the main
   loop with while(rx < budget)

2. use napi_complete() and remove the explicit napi_gro_flush()

Signed-off-by: Jonas Jensen <jonas.jensen@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Jonas Jensen authored and David S. Miller committed Aug 26, 2014
1 parent 777fbc3 commit 2b7890e
Showing 1 changed file with 5 additions and 7 deletions.
12 changes: 5 additions & 7 deletions drivers/net/ethernet/moxa/moxart_ether.c
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ static int moxart_rx_poll(struct napi_struct *napi, int budget)
int rx_head = priv->rx_head;
int rx = 0;

while (1) {
while (rx < budget) {
desc = priv->rx_desc_base + (RX_REG_DESC_SIZE * rx_head);
desc0 = readl(desc + RX_REG_OFFSET_DESC0);

Expand All @@ -218,7 +218,7 @@ static int moxart_rx_poll(struct napi_struct *napi, int budget)
net_dbg_ratelimited("packet error\n");
priv->stats.rx_dropped++;
priv->stats.rx_errors++;
continue;
goto rx_next;
}

len = desc0 & RX_DESC0_FRAME_LEN_MASK;
Expand All @@ -235,6 +235,7 @@ static int moxart_rx_poll(struct napi_struct *napi, int budget)
net_dbg_ratelimited("netdev_alloc_skb_ip_align failed\n");
priv->stats.rx_dropped++;
priv->stats.rx_errors++;
goto rx_next;
}

memcpy(skb->data, priv->rx_buf[rx_head], len);
Expand All @@ -249,18 +250,15 @@ static int moxart_rx_poll(struct napi_struct *napi, int budget)
if (desc0 & RX_DESC0_MULTICAST)
priv->stats.multicast++;

rx_next:
writel(RX_DESC0_DMA_OWN, desc + RX_REG_OFFSET_DESC0);

rx_head = RX_NEXT(rx_head);
priv->rx_head = rx_head;

if (rx >= budget)
break;
}

if (rx < budget) {
napi_gro_flush(napi, false);
__napi_complete(napi);
napi_complete(napi);
}

priv->reg_imr |= RPKT_FINISH_M;
Expand Down

0 comments on commit 2b7890e

Please sign in to comment.