dpdk: maintain per-worker trace buffer
authorDamjan Marion <[email protected]>
Fri, 18 Nov 2016 10:41:37 +0000 (11:41 +0100)
committerNeale Ranns <[email protected]>
Fri, 18 Nov 2016 11:56:33 +0000 (11:56 +0000)
Change-Id: I8234054cef4cadada6745a8c00c8df2c20daac33
Signed-off-by: Damjan Marion <[email protected]>
vnet/vnet/devices/dpdk/dpdk.h
vnet/vnet/devices/dpdk/init.c
vnet/vnet/devices/dpdk/node.c

index ad97332..b970d4a 100644 (file)
@@ -183,7 +183,7 @@ typedef struct
   struct rte_mbuf ***rx_vectors;
 
   /* vector of traced contexts, per device */
-  u32 *d_trace_buffers;
+  u32 **d_trace_buffers;
 
   dpdk_pmd_t pmd:8;
   i8 cpu_socket;
index e014506..7ca3ded 100644 (file)
@@ -731,6 +731,9 @@ dpdk_lib_init (dpdk_main_t * dm)
          vec_reset_length (xd->rx_vectors[j]);
        }
 
+      vec_validate_aligned (xd->d_trace_buffers, tm->n_vlib_mains,
+                           CLIB_CACHE_LINE_BYTES);
+
       rv = dpdk_port_setup (dm, xd);
 
       if (rv)
index ed92bde..fa89403 100644 (file)
@@ -241,7 +241,7 @@ dpdk_device_input (dpdk_main_t * dm,
 
   buffer_flags_template = dm->buffer_flags_template;
 
-  vec_reset_length (xd->d_trace_buffers);
+  vec_reset_length (xd->d_trace_buffers[cpu_index]);
   trace_cnt = n_trace = vlib_get_trace_count (vm, node);
 
   fl = vlib_buffer_get_free_list (vm, VLIB_BUFFER_DEFAULT_FREE_LIST_INDEX);
@@ -360,19 +360,19 @@ dpdk_device_input (dpdk_main_t * dm,
                                           to_next, n_left_to_next,
                                           bi0, next0);
          if (PREDICT_FALSE (n_trace > mb_index))
-           vec_add1 (xd->d_trace_buffers, bi0);
+           vec_add1 (xd->d_trace_buffers[cpu_index], bi0);
          n_buffers--;
          mb_index++;
        }
       vlib_put_next_frame (vm, node, next_index, n_left_to_next);
     }
 
-  if (PREDICT_FALSE (vec_len (xd->d_trace_buffers) > 0))
+  if (PREDICT_FALSE (vec_len (xd->d_trace_buffers[cpu_index]) > 0))
     {
-      dpdk_rx_trace (dm, node, xd, queue_id, xd->d_trace_buffers,
-                    vec_len (xd->d_trace_buffers));
+      dpdk_rx_trace (dm, node, xd, queue_id, xd->d_trace_buffers[cpu_index],
+                    vec_len (xd->d_trace_buffers[cpu_index]));
       vlib_set_trace_count (vm, node,
-                           n_trace - vec_len (xd->d_trace_buffers));
+                           n_trace - vec_len (xd->d_trace_buffers[cpu_index]));
     }
 
   vlib_increment_combined_counter