pg: maintain per-worker bitmap of enabled streams 24/3724/2
authorDamjan Marion <damarion@cisco.com>
Tue, 8 Nov 2016 12:20:42 +0000 (13:20 +0100)
committerDave Barach <openvpp@barachs.net>
Tue, 8 Nov 2016 19:29:53 +0000 (19:29 +0000)
Change-Id: I38e476c8080faa5a8647ce6be5a71090e0aa8d5b
Signed-off-by: Damjan Marion <damarion@cisco.com>
vlib/vlib/threads.h
vnet/vnet/pg/input.c
vnet/vnet/pg/pg.h
vnet/vnet/pg/stream.c

index e30b9e3..e264435 100644 (file)
@@ -365,6 +365,18 @@ vlib_get_worker_cpu_index (u32 worker_index)
   return worker_index + 1;
 }
 
+always_inline u32
+vlib_get_worker_index (u32 cpu_index)
+{
+  return cpu_index - 1;
+}
+
+always_inline u32
+vlib_get_current_worker_index ()
+{
+  return os_get_cpu_number () - 1;
+}
+
 always_inline vlib_main_t *
 vlib_get_worker_vlib_main (u32 worker_index)
 {
index 46c8f4f..735a85e 100644 (file)
@@ -1683,15 +1683,15 @@ pg_input (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame)
   uword i;
   pg_main_t *pg = &pg_main;
   uword n_packets = 0;
-  u32 num_workers = vlib_num_workers ();
-  u32 cpu_index = os_get_cpu_number ();
+  u32 worker_index = 0;
+
+  if (vlib_num_workers ())
+    worker_index = vlib_get_current_worker_index ();
 
   /* *INDENT-OFF* */
-  clib_bitmap_foreach (i, pg->enabled_streams, ({
+  clib_bitmap_foreach (i, pg->enabled_streams[worker_index], ({
     pg_stream_t *s = vec_elt_at_index (pg->streams, i);
-    if (num_workers == 0 ||
-       vlib_get_worker_cpu_index (s->worker_index) == cpu_index)
-      n_packets += pg_input_stream (node, pg, s);
+    n_packets += pg_input_stream (node, pg, s);
   }));
   /* *INDENT-ON* */
 
index 1cd4222..a402783 100644 (file)
@@ -313,7 +313,7 @@ typedef struct pg_main_t
   pg_stream_t *streams;
 
   /* Bitmap indicating which streams are currently enabled. */
-  uword *enabled_streams;
+  uword **enabled_streams;
 
   /* Hash mapping name -> stream index. */
   uword *stream_index_by_name;
index eba9941..7c865e1 100644 (file)
@@ -65,8 +65,10 @@ pg_stream_enable_disable (pg_main_t * pg, pg_stream_t * s, int want_enabled)
 
   ASSERT (!pool_is_free (pg->streams, s));
 
-  pg->enabled_streams
-    = clib_bitmap_set (pg->enabled_streams, s - pg->streams, want_enabled);
+  vec_validate (pg->enabled_streams, s->worker_index);
+  pg->enabled_streams[s->worker_index] =
+    clib_bitmap_set (pg->enabled_streams[s->worker_index], s - pg->streams,
+                    want_enabled);
 
   if (want_enabled)
     {
@@ -83,7 +85,8 @@ pg_stream_enable_disable (pg_main_t * pg, pg_stream_t * s, int want_enabled)
     vm = vlib_get_main ();
 
   vlib_node_set_state (vm, pg_input_node.index,
-                      (clib_bitmap_is_zero (pg->enabled_streams) ?
+                      (clib_bitmap_is_zero
+                       (pg->enabled_streams[s->worker_index]) ?
                        VLIB_NODE_STATE_DISABLED : VLIB_NODE_STATE_POLLING));
 
   s->packet_accumulator = 0;