021-greth_fix_memory_leak.patch 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. From 54789a03adf9c924d0cf7b890323c9c1ca7ab042 Mon Sep 17 00:00:00 2001
  2. From: Daniel Hellstrom <[email protected]>
  3. Date: Wed, 1 Dec 2010 10:26:09 +0100
  4. Subject: [PATCH] GRETH: fixed skb buffer memory leak on frame errors
  5. A new SKB buffer should not be allocated when the old SKB is reused.
  6. Signed-off-by: Daniel Hellstrom <[email protected]>
  7. ---
  8. drivers/net/greth.c | 17 +++++++++++------
  9. 1 files changed, 11 insertions(+), 6 deletions(-)
  10. --- a/drivers/net/greth.c
  11. +++ b/drivers/net/greth.c
  12. @@ -879,10 +879,8 @@ static int greth_rx_gbit(struct net_devi
  13. }
  14. }
  15. - /* Allocate new skb to replace current */
  16. - newskb = netdev_alloc_skb(dev, MAX_FRAME_SIZE + NET_IP_ALIGN);
  17. -
  18. - if (!bad && newskb) {
  19. + /* Allocate new skb to replace current, not needed if the current skb can be reused */
  20. + if (!bad && (newskb=netdev_alloc_skb(dev, MAX_FRAME_SIZE + NET_IP_ALIGN))) {
  21. skb_reserve(newskb, NET_IP_ALIGN);
  22. dma_addr = dma_map_single(greth->dev,
  23. @@ -919,12 +917,19 @@ static int greth_rx_gbit(struct net_devi
  24. if (net_ratelimit())
  25. dev_warn(greth->dev, "Could not create DMA mapping, dropping packet\n");
  26. dev_kfree_skb(newskb);
  27. - dev->stats.rx_dropped++;
  28. + dev->stats.rx_dropped++; /* reusing current skb, so it is a drop */
  29. }
  30. + } else if ( bad ) {
  31. + /* Bad Frame transfer, the skb is reused */
  32. + dev->stats.rx_dropped++;
  33. } else {
  34. + /* Failed Allocating a new skb. This is rather stupid but the current "filled"
  35. + * skb is reused, as if transfer failure. One could argue that RX descriptor table
  36. + * handling should be divided into cleaning and filling as the TX part of the driver
  37. + */
  38. if (net_ratelimit())
  39. dev_warn(greth->dev, "Could not allocate SKB, dropping packet\n");
  40. - dev->stats.rx_dropped++;
  41. + dev->stats.rx_dropped++; /* reusing current skb, so it is a drop */
  42. }
  43. status = GRETH_BD_EN | GRETH_BD_IE;