vnet: l2-classify: prefetch (n+2, n+3) rather than (n+1, n+2) inside dual loop code 16/11016/5
authorAndrew Yourtchenko <ayourtch@gmail.com>
Wed, 7 Mar 2018 16:35:59 +0000 (17:35 +0100)
committerDamjan Marion <dmarion.lists@gmail.com>
Sun, 11 Mar 2018 19:29:27 +0000 (19:29 +0000)
The dual loop within the L2 classifier processes the (n, n+1) packets,
the prefetching was trying to prefetch (n+1, n+2) - thus half of the
prefetches were not used - because the next iteration needs (n+2, n+3).

Change-Id: I827d20845dbdd0dcdcf463ee25661a7921428992
Signed-off-by: Andrew Yourtchenko <ayourtch@gmail.com>
src/vnet/l2/l2_input_classify.c
src/vnet/l2/l2_output_classify.c

index ee8042a..fcf4783 100644 (file)
@@ -167,7 +167,7 @@ l2_input_classify_node_fn (vlib_main_t * vm,
 
   /* First pass: compute hash */
 
-  while (n_left_from > 2)
+  while (n_left_from >= 4)
     {
       vlib_buffer_t *b0, *b1;
       u32 bi0, bi1;
@@ -182,15 +182,15 @@ l2_input_classify_node_fn (vlib_main_t * vm,
 
       /* prefetch next iteration */
       {
-       vlib_buffer_t *p1, *p2;
+       vlib_buffer_t *p2, *p3;
 
-       p1 = vlib_get_buffer (vm, from[1]);
        p2 = vlib_get_buffer (vm, from[2]);
+       p3 = vlib_get_buffer (vm, from[3]);
 
-       vlib_prefetch_buffer_header (p1, STORE);
-       CLIB_PREFETCH (p1->data, CLIB_CACHE_LINE_BYTES, STORE);
        vlib_prefetch_buffer_header (p2, STORE);
        CLIB_PREFETCH (p2->data, CLIB_CACHE_LINE_BYTES, STORE);
+       vlib_prefetch_buffer_header (p3, STORE);
+       CLIB_PREFETCH (p3->data, CLIB_CACHE_LINE_BYTES, STORE);
       }
 
       bi0 = from[0];
index a49abec..338fe84 100644 (file)
@@ -160,7 +160,7 @@ l2_output_classify_node_fn (vlib_main_t * vm,
 
   /* First pass: compute hash */
 
-  while (n_left_from > 2)
+  while (n_left_from >= 4)
     {
       vlib_buffer_t *b0, *b1;
       u32 bi0, bi1;
@@ -175,15 +175,15 @@ l2_output_classify_node_fn (vlib_main_t * vm,
 
       /* prefetch next iteration */
       {
-       vlib_buffer_t *p1, *p2;
+       vlib_buffer_t *p2, *p3;
 
-       p1 = vlib_get_buffer (vm, from[1]);
        p2 = vlib_get_buffer (vm, from[2]);
+       p3 = vlib_get_buffer (vm, from[3]);
 
-       vlib_prefetch_buffer_header (p1, STORE);
-       CLIB_PREFETCH (p1->data, CLIB_CACHE_LINE_BYTES, STORE);
        vlib_prefetch_buffer_header (p2, STORE);
        CLIB_PREFETCH (p2->data, CLIB_CACHE_LINE_BYTES, STORE);
+       vlib_prefetch_buffer_header (p3, STORE);
+       CLIB_PREFETCH (p3->data, CLIB_CACHE_LINE_BYTES, STORE);
       }
 
       bi0 = from[0];