An skb allocation failure retries the same completed descriptor forever in hard IRQ context. Return the buffer to DMA and advance the ring even when the packet must be dropped. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Signed-off-by: Florian Fainelli --- drivers/net/ethernet/amd/au1000_eth.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/amd/au1000_eth.c b/drivers/net/ethernet/amd/au1000_eth.c index 8682323d693f..cd25248f4e3a 100644 --- a/drivers/net/ethernet/amd/au1000_eth.c +++ b/drivers/net/ethernet/amd/au1000_eth.c @@ -788,7 +788,7 @@ static int au1000_rx(struct net_device *dev) skb = netdev_alloc_skb(dev, frmlen + 2); if (!skb) { dev->stats.rx_dropped++; - continue; + goto next; } skb_reserve(skb, 2); /* 16 byte IP header align */ skb_copy_to_linear_data(skb, @@ -820,6 +820,7 @@ static int au1000_rx(struct net_device *dev) pr_cont("\n"); } } +next: prxd->buff_stat = lower_32_bits(pDB->dma_addr) | RX_DMA_ENABLE; aup->rx_head = (aup->rx_head + 1) & (NUM_RX_DMA - 1); wmb(); /* drain writebuffer */ -- 2.53.0