nsim: enable output scheduling on main thread 51/24451/4
authorDave Wallace <dwallacelf@gmail.com>
Tue, 21 Jan 2020 16:56:19 +0000 (16:56 +0000)
committerDave Wallace <dwallacelf@gmail.com>
Wed, 22 Jan 2020 06:57:53 +0000 (06:57 +0000)
Type: fix

Change-Id: I5d47cb9bc7eb7f3c8485e3b42f0701e81d87ba2a
Signed-off-by: Dave Wallace <dwallacelf@gmail.com>
src/plugins/nsim/nsim.c
src/plugins/nsim/nsim.h

index 5bc9eae..c641490 100644 (file)
@@ -182,7 +182,8 @@ nsim_configure (nsim_main_t * nsm, f64 bandwidth, f64 delay, f64 packet_size,
   vec_validate (nsm->wheel_by_thread, num_workers);
 
   /* Initialize the output scheduler wheels */
-  for (i = num_workers ? 1 : 0; i < num_workers + 1; i++)
+  i = (!nsm->poll_main_thread && num_workers) ? 1 : 0;
+  for (; i < num_workers + 1; i++)
     {
       nsim_wheel_t *wp;
 
@@ -205,7 +206,8 @@ nsim_configure (nsim_main_t * nsm, f64 bandwidth, f64 delay, f64 packet_size,
   vlib_worker_thread_barrier_sync (vm);
 
   /* turn on the ring scrapers */
-  for (i = num_workers ? 1 : 0; i < num_workers + 1; i++)
+  i = (!nsm->poll_main_thread && num_workers) ? 1 : 0;
+  for (; i < num_workers + 1; i++)
     {
       vlib_main_t *this_vm = vlib_mains[i];
 
@@ -287,6 +289,28 @@ nsim_cross_connect_enable_disable_command_fn (vlib_main_t * vm,
   return 0;
 }
 
+static clib_error_t *
+nsim_config (vlib_main_t * vm, unformat_input_t * input)
+{
+  nsim_main_t *nsm = &nsim_main;
+
+  while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (input, "poll-main-thread"))
+       {
+         nsm->poll_main_thread = 1;
+       }
+      else
+       {
+         return clib_error_return (0, "unknown input '%U'",
+                                   format_unformat_error, input);
+       }
+    }
+  return 0;
+}
+
+VLIB_CONFIG_FUNCTION (nsim_config, "nsim");
+
 /*?
  * Enable or disable network simulation cross-connect on two interfaces
  * The network simulator must have already been configured, see
@@ -584,6 +608,8 @@ set_nsim_command_fn (vlib_main_t * vm,
            return clib_error_return
              (0, "drop fraction must be between zero and 1");
        }
+      else if (unformat (input, "poll-main-thread"))
+       nsm->poll_main_thread = 1;
       else
        break;
     }
index 6afe32d..0ed9b25 100644 (file)
@@ -68,6 +68,7 @@ typedef struct
   f64 bandwidth;
   f64 packet_size;
   f64 drop_fraction;
+  u32 poll_main_thread;
 
   u64 mmap_size;