Multi-thread enablement for the debug cli http server 40/6640/3
authorDave Barach <dbarach@cisco.com>
Wed, 10 May 2017 17:34:04 +0000 (13:34 -0400)
committerDamjan Marion <dmarion.lists@gmail.com>
Wed, 10 May 2017 20:41:04 +0000 (20:41 +0000)
Change-Id: Iec1f739fe24c722d0db6c10cc81b5e8333067ea1
Signed-off-by: Dave Barach <dbarach@cisco.com>
src/vnet/session/node.c
src/vnet/session/session.h
src/vnet/tcp/builtin_http_server.c

index ce7c386..fffc8eb 100644 (file)
@@ -401,6 +401,7 @@ session_queue_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node,
   u32 my_thread_index = vm->thread_index;
   int i, rv;
   f64 now = vlib_time_now (vm);
+  void (*fp) (void *);
 
   SESSION_EVT_DBG (SESSION_EVT_POLL_GAP_TRACK, smm, my_thread_index);
 
@@ -496,6 +497,11 @@ skip_dequeue:
          app = application_get (s0->app_index);
          app->cb_fns.builtin_server_rx_callback (s0);
          break;
+       case FIFO_EVENT_RPC:
+         fp = e0->rpc_args.fp;
+         (*fp) (e0->rpc_args.arg);
+         break;
+
        default:
          clib_warning ("unhandled event type %d", e0->event_type);
        }
index 5c281df..efb9e30 100644 (file)
@@ -32,7 +32,8 @@ typedef enum
   FIFO_EVENT_APP_TX,
   FIFO_EVENT_TIMEOUT,
   FIFO_EVENT_DISCONNECT,
-  FIFO_EVENT_BUILTIN_RX
+  FIFO_EVENT_BUILTIN_RX,
+  FIFO_EVENT_RPC,
 } fifo_event_type_t;
 
 #define foreach_session_input_error                                            \
@@ -91,12 +92,19 @@ typedef enum
   SESSION_STATE_N_STATES,
 } stream_session_state_t;
 
+typedef struct
+{
+  void *fp;
+  void *arg;
+} rpc_args_t;
+
 /* *INDENT-OFF* */
 typedef CLIB_PACKED (struct {
   union
     {
       svm_fifo_t * fifo;
       u64 session_handle;
+      rpc_args_t rpc_args;
     };
   u8 event_type;
   u16 event_id;
index 4e61fbd..763a46e 100644 (file)
@@ -385,6 +385,13 @@ builtin_redirect_connect_callback (u32 client_index, void *mp)
   return -1;
 }
 
+static void
+alloc_http_process_callback (void *s_arg)
+{
+  stream_session_t *s = (stream_session_t *) s_arg;
+  alloc_http_process (s);
+}
+
 static int
 http_server_rx_callback (stream_session_t * s)
 {
@@ -414,7 +421,19 @@ http_server_rx_callback (stream_session_t * s)
   /* send the command to a new/recycled vlib process */
   s->opaque[1] = (u64) vec_dup (hsm->rx_buf);
 
-  alloc_http_process (s);
+  /* Send an RPC request via the thread-0 input node */
+  if (vlib_get_thread_index () != 0)
+    {
+      session_fifo_event_t evt;
+      evt.rpc_args.fp = alloc_http_process_callback;
+      evt.rpc_args.arg = s;
+      evt.event_type = FIFO_EVENT_RPC;
+      unix_shared_memory_queue_add
+       (session_manager_get_vpp_event_queue (0 /* main thread */ ),
+        (u8 *) & evt, 0 /* do wait for mutex */ );
+    }
+  else
+    alloc_http_process (s);
   return 0;
 }