aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmil Tantilov <emil.s.tantilov@intel.com>2017-12-11 13:37:20 -0500
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2018-01-26 10:46:51 -0500
commit40b8178bc97dfcc688eb42d04df45e2f3c905830 (patch)
tree6b1a11436a703ff8689bfd4c8edd09997fd69f92
parent2a35efe582116abc3135151bdb53221087ca43e3 (diff)
ixgbevf: clear rx_buffer_info in configure instead of clean
Based on commit d2bead576e67 ("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: Emil Tantilov <emil.s.tantilov@intel.com> Tested-by: Krishneil Singh <krishneil.k.singh@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
-rw-r--r--drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c26
1 files changed, 13 insertions, 13 deletions
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
index 350afec3dde8..a793f9ea05e7 100644
--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
+++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
@@ -1773,6 +1773,10 @@ static void ixgbevf_configure_rx_ring(struct ixgbevf_adapter *adapter,
1773 IXGBE_WRITE_REG(hw, IXGBE_VFRDT(reg_idx), 0); 1773 IXGBE_WRITE_REG(hw, IXGBE_VFRDT(reg_idx), 0);
1774 ring->tail = adapter->io_addr + IXGBE_VFRDT(reg_idx); 1774 ring->tail = adapter->io_addr + IXGBE_VFRDT(reg_idx);
1775 1775
1776 /* initialize rx_buffer_info */
1777 memset(ring->rx_buffer_info, 0,
1778 sizeof(struct ixgbevf_rx_buffer) * ring->count);
1779
1776 /* initialize Rx descriptor 0 */ 1780 /* initialize Rx descriptor 0 */
1777 rx_desc = IXGBEVF_RX_DESC(ring, 0); 1781 rx_desc = IXGBEVF_RX_DESC(ring, 0);
1778 rx_desc->wb.upper.length = 0; 1782 rx_desc->wb.upper.length = 0;
@@ -2131,8 +2135,7 @@ void ixgbevf_up(struct ixgbevf_adapter *adapter)
2131 **/ 2135 **/
2132static void ixgbevf_clean_rx_ring(struct ixgbevf_ring *rx_ring) 2136static void ixgbevf_clean_rx_ring(struct ixgbevf_ring *rx_ring)
2133{ 2137{
2134 unsigned long size; 2138 u16 i = rx_ring->next_to_clean;
2135 unsigned int i;
2136 2139
2137 /* Free Rx ring sk_buff */ 2140 /* Free Rx ring sk_buff */
2138 if (rx_ring->skb) { 2141 if (rx_ring->skb) {
@@ -2140,17 +2143,11 @@ static void ixgbevf_clean_rx_ring(struct ixgbevf_ring *rx_ring)
2140 rx_ring->skb = NULL; 2143 rx_ring->skb = NULL;
2141 } 2144 }
2142 2145
2143 /* ring already cleared, nothing to do */
2144 if (!rx_ring->rx_buffer_info)
2145 return;
2146
2147 /* Free all the Rx ring pages */ 2146 /* Free all the Rx ring pages */
2148 for (i = 0; i < rx_ring->count; i++) { 2147 while (i != rx_ring->next_to_alloc) {
2149 struct ixgbevf_rx_buffer *rx_buffer; 2148 struct ixgbevf_rx_buffer *rx_buffer;
2150 2149
2151 rx_buffer = &rx_ring->rx_buffer_info[i]; 2150 rx_buffer = &rx_ring->rx_buffer_info[i];
2152 if (!rx_buffer->page)
2153 continue;
2154 2151
2155 /* Invalidate cache lines that may have been written to by 2152 /* Invalidate cache lines that may have been written to by
2156 * device so that we avoid corrupting memory. 2153 * device so that we avoid corrupting memory.
@@ -2171,11 +2168,14 @@ static void ixgbevf_clean_rx_ring(struct ixgbevf_ring *rx_ring)
2171 __page_frag_cache_drain(rx_buffer->page, 2168 __page_frag_cache_drain(rx_buffer->page,
2172 rx_buffer->pagecnt_bias); 2169 rx_buffer->pagecnt_bias);
2173 2170
2174 rx_buffer->page = NULL; 2171 i++;
2172 if (i == rx_ring->count)
2173 i = 0;
2175 } 2174 }
2176 2175
2177 size = sizeof(struct ixgbevf_rx_buffer) * rx_ring->count; 2176 rx_ring->next_to_alloc = 0;
2178 memset(rx_ring->rx_buffer_info, 0, size); 2177 rx_ring->next_to_clean = 0;
2178 rx_ring->next_to_use = 0;
2179} 2179}
2180 2180
2181/** 2181/**
@@ -3090,7 +3090,7 @@ int ixgbevf_setup_rx_resources(struct ixgbevf_ring *rx_ring)
3090 int size; 3090 int size;
3091 3091
3092 size = sizeof(struct ixgbevf_rx_buffer) * rx_ring->count; 3092 size = sizeof(struct ixgbevf_rx_buffer) * rx_ring->count;
3093 rx_ring->rx_buffer_info = vzalloc(size); 3093 rx_ring->rx_buffer_info = vmalloc(size);
3094 if (!rx_ring->rx_buffer_info) 3094 if (!rx_ring->rx_buffer_info)
3095 goto err; 3095 goto err;
3096 3096