Skip to content

Commit

Permalink
igbvf: fix memory leak when ring size changed while interface down
Browse files Browse the repository at this point in the history
This patch resolves a memory leak which occurs while changing the ring size
while the interface is down.

Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Alexander Duyck authored and David S. Miller committed Oct 26, 2009
1 parent 759884b commit 3930596
Showing 1 changed file with 17 additions and 13 deletions.
30 changes: 17 additions & 13 deletions drivers/net/igbvf/ethtool.c
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,7 @@ static int igbvf_set_ringparam(struct net_device *netdev,
{
struct igbvf_adapter *adapter = netdev_priv(netdev);
struct igbvf_ring *temp_ring;
int err;
int err = 0;
u32 new_rx_count, new_tx_count;

if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending))
Expand All @@ -299,15 +299,22 @@ static int igbvf_set_ringparam(struct net_device *netdev,
return 0;
}

temp_ring = vmalloc(sizeof(struct igbvf_ring));
if (!temp_ring)
return -ENOMEM;

while (test_and_set_bit(__IGBVF_RESETTING, &adapter->state))
msleep(1);

if (netif_running(adapter->netdev))
igbvf_down(adapter);
if (!netif_running(adapter->netdev)) {
adapter->tx_ring->count = new_tx_count;
adapter->rx_ring->count = new_rx_count;
goto clear_reset;
}

temp_ring = vmalloc(sizeof(struct igbvf_ring));
if (!temp_ring) {
err = -ENOMEM;
goto clear_reset;
}

igbvf_down(adapter);

/*
* We can't just free everything and then setup again,
Expand Down Expand Up @@ -339,14 +346,11 @@ static int igbvf_set_ringparam(struct net_device *netdev,

memcpy(adapter->rx_ring, temp_ring,sizeof(struct igbvf_ring));
}

err = 0;
err_setup:
if (netif_running(adapter->netdev))
igbvf_up(adapter);

clear_bit(__IGBVF_RESETTING, &adapter->state);
igbvf_up(adapter);
vfree(temp_ring);
clear_reset:
clear_bit(__IGBVF_RESETTING, &adapter->state);
return err;
}

Expand Down

0 comments on commit 3930596

Please sign in to comment.