VPP-6: set epoll wait-time to zero when binary API messages are waiting
authorDave Barach <[email protected]>
Tue, 19 Apr 2016 13:38:35 +0000 (09:38 -0400)
committerDave Barach <[email protected]>
Tue, 19 Apr 2016 13:38:53 +0000 (09:38 -0400)
Change-Id: I629ef98ecd3b729d2564b3a1ba8c6039f854f86c
Signed-off-by: Dave Barach <[email protected]>
vlib-api/vlibmemory/memory_vlib.c
vlib/vlib/main.h
vlib/vlib/unix/input.c

index 107fddc..8aa0fe4 100644 (file)
@@ -404,6 +404,7 @@ memclnt_process (vlib_main_t * vm,
         while (1) {
             pthread_mutex_lock (&q->mutex);
             if (q->cursize == 0) {
+                vm->api_queue_nonempty = 0;
                 pthread_mutex_unlock (&q->mutex);
                 
                 if (TRACE_VLIB_MEMORY_QUEUE)
@@ -626,6 +627,7 @@ memclnt_queue_signal (int signum)
     vlib_main_t * vm = vlib_get_main();
 
     vm->queue_signal_pending = 1;
+    vm->api_queue_nonempty = 1;
 }
 
 static void 
index 1a11045..ef36c1e 100644 (file)
@@ -168,8 +168,9 @@ typedef struct vlib_main_t {
   vlib_config_function_runtime_t *config_function_registrations;
   mc_serialize_msg_t *mc_msg_registrations; /* mc_main is a pointer... */
 
-  /* control-plane API queue signal pending */
+  /* control-plane API queue signal pending, length indication */
   volatile u32 queue_signal_pending;
+  volatile u32 api_queue_nonempty;
   void (*queue_signal_callback)(struct vlib_main_t *);
   u8 **argv;
 } vlib_main_t;
index 62b3254..543e2c0 100644 (file)
@@ -127,10 +127,12 @@ linux_epoll_input (vlib_main_t * vm,
     if (nm->input_node_counts_by_state[VLIB_NODE_STATE_POLLING] > 0)
       timeout_ms = 0;
 
-    if (vector_rate > 1)
+    /* 
+     * When busy: don't wait & only epoll for input 
+     * every 1024 times through main loop. 
+     */
+    if (vector_rate > 1 || vm->api_queue_nonempty)
       {
-       /* When busy don't wait & only epoll for input every 8 times
-          through main loop. */
        timeout_ms = 0;
        node->input_main_loops_per_call = 1024;
       }