diff options
author | florian <florian@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2012-11-16 16:32:55 +0000 |
---|---|---|
committer | florian <florian@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2012-11-16 16:32:55 +0000 |
commit | 763c067152ac8f8acc6a4920bd335254435feb2b (patch) | |
tree | 2e0e2146effb547c681faed71e1cd042af250d90 /target/linux/leon/patches-2.6.36/021-greth_fix_memory_leak.patch | |
parent | 8642151a3411335fe43e3b93ad1c867c1ed7b6d7 (diff) |
[leon] move patches to patches-2.6.36
Signed-off-by: Florian Fainelli <florian@openwrt.org>
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@34220 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/leon/patches-2.6.36/021-greth_fix_memory_leak.patch')
-rw-r--r-- | target/linux/leon/patches-2.6.36/021-greth_fix_memory_leak.patch | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/target/linux/leon/patches-2.6.36/021-greth_fix_memory_leak.patch b/target/linux/leon/patches-2.6.36/021-greth_fix_memory_leak.patch new file mode 100644 index 000000000..1d05af124 --- /dev/null +++ b/target/linux/leon/patches-2.6.36/021-greth_fix_memory_leak.patch @@ -0,0 +1,49 @@ +From 54789a03adf9c924d0cf7b890323c9c1ca7ab042 Mon Sep 17 00:00:00 2001 +From: Daniel Hellstrom <daniel@gaisler.com> +Date: Wed, 1 Dec 2010 10:26:09 +0100 +Subject: [PATCH] GRETH: fixed skb buffer memory leak on frame errors + +A new SKB buffer should not be allocated when the old SKB is reused. + +Signed-off-by: Daniel Hellstrom <daniel@gaisler.com> +--- + drivers/net/greth.c | 17 +++++++++++------ + 1 files changed, 11 insertions(+), 6 deletions(-) + +--- a/drivers/net/greth.c ++++ b/drivers/net/greth.c +@@ -879,10 +879,8 @@ static int greth_rx_gbit(struct net_devi + } + } + +- /* Allocate new skb to replace current */ +- newskb = netdev_alloc_skb(dev, MAX_FRAME_SIZE + NET_IP_ALIGN); +- +- if (!bad && newskb) { ++ /* Allocate new skb to replace current, not needed if the current skb can be reused */ ++ if (!bad && (newskb=netdev_alloc_skb(dev, MAX_FRAME_SIZE + NET_IP_ALIGN))) { + skb_reserve(newskb, NET_IP_ALIGN); + + dma_addr = dma_map_single(greth->dev, +@@ -919,12 +917,19 @@ static int greth_rx_gbit(struct net_devi + if (net_ratelimit()) + dev_warn(greth->dev, "Could not create DMA mapping, dropping packet\n"); + dev_kfree_skb(newskb); +- dev->stats.rx_dropped++; ++ dev->stats.rx_dropped++; /* reusing current skb, so it is a drop */ + } ++ } else if ( bad ) { ++ /* Bad Frame transfer, the skb is reused */ ++ dev->stats.rx_dropped++; + } else { ++ /* Failed Allocating a new skb. This is rather stupid but the current "filled" ++ * skb is reused, as if transfer failure. One could argue that RX descriptor table ++ * handling should be divided into cleaning and filling as the TX part of the driver ++ */ + if (net_ratelimit()) + dev_warn(greth->dev, "Could not allocate SKB, dropping packet\n"); +- dev->stats.rx_dropped++; ++ dev->stats.rx_dropped++; /* reusing current skb, so it is a drop */ + } + + status = GRETH_BD_EN | GRETH_BD_IE; |