Commit 40b8178b authored by Emil Tantilov's avatar Emil Tantilov Committed by Jeff Kirsher

ixgbevf: clear rx_buffer_info in configure instead of clean

Based on commit d2bead57
("igb: Clear Rx buffer_info in configure instead of clean")

This change makes it so that instead of going through the entire ring on Rx
cleanup we only go through the region that was designated to be cleaned up
and stop when we reach the region where new allocations should start.

In addition we can avoid having to perform a memset on the Rx buffer_info
structures until we are about to start using the ring again.
Signed-off-by: default avatarEmil Tantilov <emil.s.tantilov@intel.com>
Tested-by: default avatarKrishneil Singh <krishneil.k.singh@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 2a35efe5
...@@ -1773,6 +1773,10 @@ static void ixgbevf_configure_rx_ring(struct ixgbevf_adapter *adapter, ...@@ -1773,6 +1773,10 @@ static void ixgbevf_configure_rx_ring(struct ixgbevf_adapter *adapter,
IXGBE_WRITE_REG(hw, IXGBE_VFRDT(reg_idx), 0); IXGBE_WRITE_REG(hw, IXGBE_VFRDT(reg_idx), 0);
ring->tail = adapter->io_addr + IXGBE_VFRDT(reg_idx); ring->tail = adapter->io_addr + IXGBE_VFRDT(reg_idx);
/* initialize rx_buffer_info */
memset(ring->rx_buffer_info, 0,
sizeof(struct ixgbevf_rx_buffer) * ring->count);
/* initialize Rx descriptor 0 */ /* initialize Rx descriptor 0 */
rx_desc = IXGBEVF_RX_DESC(ring, 0); rx_desc = IXGBEVF_RX_DESC(ring, 0);
rx_desc->wb.upper.length = 0; rx_desc->wb.upper.length = 0;
...@@ -2131,8 +2135,7 @@ void ixgbevf_up(struct ixgbevf_adapter *adapter) ...@@ -2131,8 +2135,7 @@ void ixgbevf_up(struct ixgbevf_adapter *adapter)
**/ **/
static void ixgbevf_clean_rx_ring(struct ixgbevf_ring *rx_ring) static void ixgbevf_clean_rx_ring(struct ixgbevf_ring *rx_ring)
{ {
unsigned long size; u16 i = rx_ring->next_to_clean;
unsigned int i;
/* Free Rx ring sk_buff */ /* Free Rx ring sk_buff */
if (rx_ring->skb) { if (rx_ring->skb) {
...@@ -2140,17 +2143,11 @@ static void ixgbevf_clean_rx_ring(struct ixgbevf_ring *rx_ring) ...@@ -2140,17 +2143,11 @@ static void ixgbevf_clean_rx_ring(struct ixgbevf_ring *rx_ring)
rx_ring->skb = NULL; rx_ring->skb = NULL;
} }
/* ring already cleared, nothing to do */
if (!rx_ring->rx_buffer_info)
return;
/* Free all the Rx ring pages */ /* Free all the Rx ring pages */
for (i = 0; i < rx_ring->count; i++) { while (i != rx_ring->next_to_alloc) {
struct ixgbevf_rx_buffer *rx_buffer; struct ixgbevf_rx_buffer *rx_buffer;
rx_buffer = &rx_ring->rx_buffer_info[i]; rx_buffer = &rx_ring->rx_buffer_info[i];
if (!rx_buffer->page)
continue;
/* Invalidate cache lines that may have been written to by /* Invalidate cache lines that may have been written to by
* device so that we avoid corrupting memory. * device so that we avoid corrupting memory.
...@@ -2171,11 +2168,14 @@ static void ixgbevf_clean_rx_ring(struct ixgbevf_ring *rx_ring) ...@@ -2171,11 +2168,14 @@ static void ixgbevf_clean_rx_ring(struct ixgbevf_ring *rx_ring)
__page_frag_cache_drain(rx_buffer->page, __page_frag_cache_drain(rx_buffer->page,
rx_buffer->pagecnt_bias); rx_buffer->pagecnt_bias);
rx_buffer->page = NULL; i++;
if (i == rx_ring->count)
i = 0;
} }
size = sizeof(struct ixgbevf_rx_buffer) * rx_ring->count; rx_ring->next_to_alloc = 0;
memset(rx_ring->rx_buffer_info, 0, size); rx_ring->next_to_clean = 0;
rx_ring->next_to_use = 0;
} }
/** /**
...@@ -3090,7 +3090,7 @@ int ixgbevf_setup_rx_resources(struct ixgbevf_ring *rx_ring) ...@@ -3090,7 +3090,7 @@ int ixgbevf_setup_rx_resources(struct ixgbevf_ring *rx_ring)
int size; int size;
size = sizeof(struct ixgbevf_rx_buffer) * rx_ring->count; size = sizeof(struct ixgbevf_rx_buffer) * rx_ring->count;
rx_ring->rx_buffer_info = vzalloc(size); rx_ring->rx_buffer_info = vmalloc(size);
if (!rx_ring->rx_buffer_info) if (!rx_ring->rx_buffer_info)
goto err; goto 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