From: Gabor Juhos Date: Wed, 24 Nov 2010 10:01:12 +0000 (+0000) Subject: ramips: Don't trigger BUG_ON due to skb allocation failure X-Git-Tag: reboot~18289 X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fopenwrt.git;a=commitdiff_plain;h=f833e399f212a432d03750caa2f666db97b96624 ramips: Don't trigger BUG_ON due to skb allocation failure Instead just drop the rx'ed frame silently and reuse the already available buffer. Signed-off-by: Helmut Schaa SVN-Revision: 24122 --- diff --git a/target/linux/ramips/files/drivers/net/ramips.c b/target/linux/ramips/files/drivers/net/ramips.c index e297cbec75..e3c4f13d46 100644 --- a/target/linux/ramips/files/drivers/net/ramips.c +++ b/target/linux/ramips/files/drivers/net/ramips.c @@ -272,23 +272,26 @@ ramips_eth_rx_hw(unsigned long ptr) break; max_rx--; - rx_skb = priv->rx_skb[rx]; - skb_put(rx_skb, RX_DMA_PLEN0(priv->rx[rx].rxd2)); - rx_skb->dev = dev; - rx_skb->protocol = eth_type_trans(rx_skb, dev); - rx_skb->ip_summed = CHECKSUM_NONE; - dev->stats.rx_packets++; - dev->stats.rx_bytes += rx_skb->len; - netif_rx(rx_skb); - new_skb = netdev_alloc_skb(dev, MAX_RX_LENGTH + 2); - priv->rx_skb[rx] = new_skb; - BUG_ON(!new_skb); - skb_reserve(new_skb, 2); - priv->rx[rx].rxd1 = dma_map_single(NULL, - new_skb->data, - MAX_RX_LENGTH + 2, - DMA_FROM_DEVICE); + /* Reuse the buffer on allocation failures */ + if (new_skb) { + rx_skb = priv->rx_skb[rx]; + skb_put(rx_skb, RX_DMA_PLEN0(priv->rx[rx].rxd2)); + rx_skb->dev = dev; + rx_skb->protocol = eth_type_trans(rx_skb, dev); + rx_skb->ip_summed = CHECKSUM_NONE; + dev->stats.rx_packets++; + dev->stats.rx_bytes += rx_skb->len; + netif_rx(rx_skb); + + priv->rx_skb[rx] = new_skb; + skb_reserve(new_skb, 2); + priv->rx[rx].rxd1 = dma_map_single(NULL, + new_skb->data, + MAX_RX_LENGTH + 2, + DMA_FROM_DEVICE); + } + priv->rx[rx].rxd2 &= ~RX_DMA_DONE; wmb(); ramips_fe_wr(rx, RAMIPS_RX_CALC_IDX0);