Commit 39305965 authored by Alexander Duyck's avatar Alexander Duyck Committed by David S. Miller

igbvf: fix memory leak when ring size changed while interface down

This patch resolves a memory leak which occurs while changing the ring size
while the interface is down.
Signed-off-by: default avatarAlexander Duyck <alexander.h.duyck@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 759884b4
...@@ -279,7 +279,7 @@ static int igbvf_set_ringparam(struct net_device *netdev, ...@@ -279,7 +279,7 @@ static int igbvf_set_ringparam(struct net_device *netdev,
{ {
struct igbvf_adapter *adapter = netdev_priv(netdev); struct igbvf_adapter *adapter = netdev_priv(netdev);
struct igbvf_ring *temp_ring; struct igbvf_ring *temp_ring;
int err; int err = 0;
u32 new_rx_count, new_tx_count; u32 new_rx_count, new_tx_count;
if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending)) if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending))
...@@ -299,15 +299,22 @@ static int igbvf_set_ringparam(struct net_device *netdev, ...@@ -299,15 +299,22 @@ static int igbvf_set_ringparam(struct net_device *netdev,
return 0; return 0;
} }
temp_ring = vmalloc(sizeof(struct igbvf_ring));
if (!temp_ring)
return -ENOMEM;
while (test_and_set_bit(__IGBVF_RESETTING, &adapter->state)) while (test_and_set_bit(__IGBVF_RESETTING, &adapter->state))
msleep(1); msleep(1);
if (netif_running(adapter->netdev)) if (!netif_running(adapter->netdev)) {
igbvf_down(adapter); 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, * We can't just free everything and then setup again,
...@@ -339,14 +346,11 @@ static int igbvf_set_ringparam(struct net_device *netdev, ...@@ -339,14 +346,11 @@ static int igbvf_set_ringparam(struct net_device *netdev,
memcpy(adapter->rx_ring, temp_ring,sizeof(struct igbvf_ring)); memcpy(adapter->rx_ring, temp_ring,sizeof(struct igbvf_ring));
} }
err = 0;
err_setup: err_setup:
if (netif_running(adapter->netdev)) igbvf_up(adapter);
igbvf_up(adapter);
clear_bit(__IGBVF_RESETTING, &adapter->state);
vfree(temp_ring); vfree(temp_ring);
clear_reset:
clear_bit(__IGBVF_RESETTING, &adapter->state);
return err; return err;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment