aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel
diff options
context:
space:
mode:
authorAlexander Duyck <alexander.h.duyck@intel.com>2016-09-12 17:18:39 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2016-09-25 01:15:12 -0400
commit64bfd68eaecdce7b86e179fe39662340c8aed20d (patch)
treec1bc2fe1d83edff087ec5d750daed46d524f8171 /drivers/net/ethernet/intel
parentf19a973f46e85d4394cadb90fa7717f7ec98197a (diff)
i40e: Fix Flow Director raw_buf cleanup
The Tx cleanup flow was incorrectly assuming it could check for the flow director bits after it had unmapped the buffer. However in this case it results in us trying to free a raw_buf as though it is an sk_buff. To fix this I am moving up the flag test for the FD_SB bit so that when find a non-NULL skb or raw_buf value we then check the flag and use the appropriate call to free the buffer. Change-ID: I6284034ba1ea87c9922e56f6eb3181f7f09bddde Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com> Tested-by: Andrew Bowers <andrewx.bowers@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel')
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_txrx.c8
-rw-r--r--drivers/net/ethernet/intel/i40evf/i40e_txrx.c8
2 files changed, 8 insertions, 8 deletions
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
index 7ada05e7776f..a2077bedac93 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
@@ -532,7 +532,10 @@ static void i40e_unmap_and_free_tx_resource(struct i40e_ring *ring,
532 struct i40e_tx_buffer *tx_buffer) 532 struct i40e_tx_buffer *tx_buffer)
533{ 533{
534 if (tx_buffer->skb) { 534 if (tx_buffer->skb) {
535 dev_kfree_skb_any(tx_buffer->skb); 535 if (tx_buffer->tx_flags & I40E_TX_FLAGS_FD_SB)
536 kfree(tx_buffer->raw_buf);
537 else
538 dev_kfree_skb_any(tx_buffer->skb);
536 if (dma_unmap_len(tx_buffer, len)) 539 if (dma_unmap_len(tx_buffer, len))
537 dma_unmap_single(ring->dev, 540 dma_unmap_single(ring->dev,
538 dma_unmap_addr(tx_buffer, dma), 541 dma_unmap_addr(tx_buffer, dma),
@@ -545,9 +548,6 @@ static void i40e_unmap_and_free_tx_resource(struct i40e_ring *ring,
545 DMA_TO_DEVICE); 548 DMA_TO_DEVICE);
546 } 549 }
547 550
548 if (tx_buffer->tx_flags & I40E_TX_FLAGS_FD_SB)
549 kfree(tx_buffer->raw_buf);
550
551 tx_buffer->next_to_watch = NULL; 551 tx_buffer->next_to_watch = NULL;
552 tx_buffer->skb = NULL; 552 tx_buffer->skb = NULL;
553 dma_unmap_len_set(tx_buffer, len, 0); 553 dma_unmap_len_set(tx_buffer, len, 0);
diff --git a/drivers/net/ethernet/intel/i40evf/i40e_txrx.c b/drivers/net/ethernet/intel/i40evf/i40e_txrx.c
index e3427ebd5b84..cb6b13098699 100644
--- a/drivers/net/ethernet/intel/i40evf/i40e_txrx.c
+++ b/drivers/net/ethernet/intel/i40evf/i40e_txrx.c
@@ -51,7 +51,10 @@ static void i40e_unmap_and_free_tx_resource(struct i40e_ring *ring,
51 struct i40e_tx_buffer *tx_buffer) 51 struct i40e_tx_buffer *tx_buffer)
52{ 52{
53 if (tx_buffer->skb) { 53 if (tx_buffer->skb) {
54 dev_kfree_skb_any(tx_buffer->skb); 54 if (tx_buffer->tx_flags & I40E_TX_FLAGS_FD_SB)
55 kfree(tx_buffer->raw_buf);
56 else
57 dev_kfree_skb_any(tx_buffer->skb);
55 if (dma_unmap_len(tx_buffer, len)) 58 if (dma_unmap_len(tx_buffer, len))
56 dma_unmap_single(ring->dev, 59 dma_unmap_single(ring->dev,
57 dma_unmap_addr(tx_buffer, dma), 60 dma_unmap_addr(tx_buffer, dma),
@@ -64,9 +67,6 @@ static void i40e_unmap_and_free_tx_resource(struct i40e_ring *ring,
64 DMA_TO_DEVICE); 67 DMA_TO_DEVICE);
65 } 68 }
66 69
67 if (tx_buffer->tx_flags & I40E_TX_FLAGS_FD_SB)
68 kfree(tx_buffer->raw_buf);
69
70 tx_buffer->next_to_watch = NULL; 70 tx_buffer->next_to_watch = NULL;
71 tx_buffer->skb = NULL; 71 tx_buffer->skb = NULL;
72 dma_unmap_len_set(tx_buffer, len, 0); 72 dma_unmap_len_set(tx_buffer, len, 0);