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

igb: cleanup code related to ring resource allocation and free

This patch cleans up some of the ring alloc and free code to better handle
exceptions such as attempting to free resources on an already freed ring.
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 f7ba205e
...@@ -1952,7 +1952,8 @@ int igb_setup_tx_resources(struct igb_ring *tx_ring) ...@@ -1952,7 +1952,8 @@ int igb_setup_tx_resources(struct igb_ring *tx_ring)
tx_ring->size = tx_ring->count * sizeof(union e1000_adv_tx_desc); tx_ring->size = tx_ring->count * sizeof(union e1000_adv_tx_desc);
tx_ring->size = ALIGN(tx_ring->size, 4096); tx_ring->size = ALIGN(tx_ring->size, 4096);
tx_ring->desc = pci_alloc_consistent(pdev, tx_ring->size, tx_ring->desc = pci_alloc_consistent(pdev,
tx_ring->size,
&tx_ring->dma); &tx_ring->dma);
if (!tx_ring->desc) if (!tx_ring->desc)
...@@ -1978,13 +1979,13 @@ int igb_setup_tx_resources(struct igb_ring *tx_ring) ...@@ -1978,13 +1979,13 @@ int igb_setup_tx_resources(struct igb_ring *tx_ring)
**/ **/
static int igb_setup_all_tx_resources(struct igb_adapter *adapter) static int igb_setup_all_tx_resources(struct igb_adapter *adapter)
{ {
struct pci_dev *pdev = adapter->pdev;
int i, err = 0; int i, err = 0;
int r_idx;
for (i = 0; i < adapter->num_tx_queues; i++) { for (i = 0; i < adapter->num_tx_queues; i++) {
err = igb_setup_tx_resources(&adapter->tx_ring[i]); err = igb_setup_tx_resources(&adapter->tx_ring[i]);
if (err) { if (err) {
dev_err(&adapter->pdev->dev, dev_err(&pdev->dev,
"Allocation for Tx Queue %u failed\n", i); "Allocation for Tx Queue %u failed\n", i);
for (i--; i >= 0; i--) for (i--; i >= 0; i--)
igb_free_tx_resources(&adapter->tx_ring[i]); igb_free_tx_resources(&adapter->tx_ring[i]);
...@@ -1993,7 +1994,7 @@ static int igb_setup_all_tx_resources(struct igb_adapter *adapter) ...@@ -1993,7 +1994,7 @@ static int igb_setup_all_tx_resources(struct igb_adapter *adapter)
} }
for (i = 0; i < IGB_MAX_TX_QUEUES; i++) { for (i = 0; i < IGB_MAX_TX_QUEUES; i++) {
r_idx = i % adapter->num_tx_queues; int r_idx = i % adapter->num_tx_queues;
adapter->multi_tx_table[i] = &adapter->tx_ring[r_idx]; adapter->multi_tx_table[i] = &adapter->tx_ring[r_idx];
} }
return err; return err;
...@@ -2116,6 +2117,7 @@ int igb_setup_rx_resources(struct igb_ring *rx_ring) ...@@ -2116,6 +2117,7 @@ int igb_setup_rx_resources(struct igb_ring *rx_ring)
err: err:
vfree(rx_ring->buffer_info); vfree(rx_ring->buffer_info);
rx_ring->buffer_info = NULL;
dev_err(&pdev->dev, "Unable to allocate memory for " dev_err(&pdev->dev, "Unable to allocate memory for "
"the receive descriptor ring\n"); "the receive descriptor ring\n");
return -ENOMEM; return -ENOMEM;
...@@ -2130,12 +2132,13 @@ int igb_setup_rx_resources(struct igb_ring *rx_ring) ...@@ -2130,12 +2132,13 @@ int igb_setup_rx_resources(struct igb_ring *rx_ring)
**/ **/
static int igb_setup_all_rx_resources(struct igb_adapter *adapter) static int igb_setup_all_rx_resources(struct igb_adapter *adapter)
{ {
struct pci_dev *pdev = adapter->pdev;
int i, err = 0; int i, err = 0;
for (i = 0; i < adapter->num_rx_queues; i++) { for (i = 0; i < adapter->num_rx_queues; i++) {
err = igb_setup_rx_resources(&adapter->rx_ring[i]); err = igb_setup_rx_resources(&adapter->rx_ring[i]);
if (err) { if (err) {
dev_err(&adapter->pdev->dev, dev_err(&pdev->dev,
"Allocation for Rx Queue %u failed\n", i); "Allocation for Rx Queue %u failed\n", i);
for (i--; i >= 0; i--) for (i--; i >= 0; i--)
igb_free_rx_resources(&adapter->rx_ring[i]); igb_free_rx_resources(&adapter->rx_ring[i]);
...@@ -2476,6 +2479,10 @@ void igb_free_tx_resources(struct igb_ring *tx_ring) ...@@ -2476,6 +2479,10 @@ void igb_free_tx_resources(struct igb_ring *tx_ring)
vfree(tx_ring->buffer_info); vfree(tx_ring->buffer_info);
tx_ring->buffer_info = NULL; tx_ring->buffer_info = NULL;
/* if not set, then don't free */
if (!tx_ring->desc)
return;
pci_free_consistent(tx_ring->pdev, tx_ring->size, pci_free_consistent(tx_ring->pdev, tx_ring->size,
tx_ring->desc, tx_ring->dma); tx_ring->desc, tx_ring->dma);
...@@ -2534,14 +2541,10 @@ static void igb_clean_tx_ring(struct igb_ring *tx_ring) ...@@ -2534,14 +2541,10 @@ static void igb_clean_tx_ring(struct igb_ring *tx_ring)
memset(tx_ring->buffer_info, 0, size); memset(tx_ring->buffer_info, 0, size);
/* Zero out the descriptor ring */ /* Zero out the descriptor ring */
memset(tx_ring->desc, 0, tx_ring->size); memset(tx_ring->desc, 0, tx_ring->size);
tx_ring->next_to_use = 0; tx_ring->next_to_use = 0;
tx_ring->next_to_clean = 0; tx_ring->next_to_clean = 0;
writel(0, tx_ring->head);
writel(0, tx_ring->tail);
} }
/** /**
...@@ -2569,6 +2572,10 @@ void igb_free_rx_resources(struct igb_ring *rx_ring) ...@@ -2569,6 +2572,10 @@ void igb_free_rx_resources(struct igb_ring *rx_ring)
vfree(rx_ring->buffer_info); vfree(rx_ring->buffer_info);
rx_ring->buffer_info = NULL; rx_ring->buffer_info = NULL;
/* if not set, then don't free */
if (!rx_ring->desc)
return;
pci_free_consistent(rx_ring->pdev, rx_ring->size, pci_free_consistent(rx_ring->pdev, rx_ring->size,
rx_ring->desc, rx_ring->dma); rx_ring->desc, rx_ring->dma);
...@@ -2601,6 +2608,7 @@ static void igb_clean_rx_ring(struct igb_ring *rx_ring) ...@@ -2601,6 +2608,7 @@ static void igb_clean_rx_ring(struct igb_ring *rx_ring)
if (!rx_ring->buffer_info) if (!rx_ring->buffer_info)
return; return;
/* Free all the Rx ring sk_buffs */ /* Free all the Rx ring sk_buffs */
for (i = 0; i < rx_ring->count; i++) { for (i = 0; i < rx_ring->count; i++) {
buffer_info = &rx_ring->buffer_info[i]; buffer_info = &rx_ring->buffer_info[i];
...@@ -2638,9 +2646,6 @@ static void igb_clean_rx_ring(struct igb_ring *rx_ring) ...@@ -2638,9 +2646,6 @@ static void igb_clean_rx_ring(struct igb_ring *rx_ring)
rx_ring->next_to_clean = 0; rx_ring->next_to_clean = 0;
rx_ring->next_to_use = 0; rx_ring->next_to_use = 0;
writel(0, rx_ring->head);
writel(0, rx_ring->tail);
} }
/** /**
......
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