nat: add prefetching to in2out_ed/out2in_ed 77/27877/3
authorKlement Sekera <ksekera@cisco.com>
Mon, 13 Jul 2020 13:59:33 +0000 (13:59 +0000)
committerMatthew Smith <mgsmith@netgate.com>
Wed, 15 Jul 2020 16:27:29 +0000 (16:27 +0000)
This saves about 20 clocks/packet in both code paths.

Type: improvement
Signed-off-by: Klement Sekera <ksekera@cisco.com>
Change-Id: Ib559c74bf8168e3ddd764d51b7e5bcd2a557f591

src/plugins/nat/in2out_ed.c
src/plugins/nat/out2in_ed.c

index c59c2d4..080f37e 100644 (file)
@@ -943,6 +943,19 @@ nat44_ed_in2out_fast_path_node_fn_inline (vlib_main_t * vm,
       ip_csum_t sum0;
 
       b0 = *b;
+      b++;
+
+      /* Prefetch next iteration. */
+      if (PREDICT_TRUE (n_left_from >= 2))
+       {
+         vlib_buffer_t *p2;
+
+         p2 = *b;
+
+         vlib_prefetch_buffer_header (p2, LOAD);
+
+         CLIB_PREFETCH (p2->data, CLIB_CACHE_LINE_BYTES, LOAD);
+       }
 
       if (is_output_feature)
        {
@@ -1158,7 +1171,6 @@ nat44_ed_in2out_fast_path_node_fn_inline (vlib_main_t * vm,
 
       n_left_from--;
       next++;
-      b++;
     }
 
   vlib_buffer_enqueue_to_next (vm, node, from, (u16 *) nexts,
index 8286e66..05fc75f 100644 (file)
@@ -705,6 +705,20 @@ nat44_ed_out2in_fast_path_node_fn_inline (vlib_main_t * vm,
       ip_csum_t sum0;
 
       b0 = *b;
+      b++;
+
+      /* Prefetch next iteration. */
+      if (PREDICT_TRUE (n_left_from >= 2))
+       {
+         vlib_buffer_t *p2;
+
+         p2 = *b;
+
+         vlib_prefetch_buffer_header (p2, LOAD);
+
+         CLIB_PREFETCH (p2->data, CLIB_CACHE_LINE_BYTES, LOAD);
+       }
+
       next[0] = vnet_buffer2 (b0)->nat.arc_next;
 
       vnet_buffer (b0)->snat.flags = 0;
@@ -927,7 +941,6 @@ nat44_ed_out2in_fast_path_node_fn_inline (vlib_main_t * vm,
 
       n_left_from--;
       next++;
-      b++;
     }
 
   vlib_buffer_enqueue_to_next (vm, node, from, (u16 *) nexts,