vlib: wake up workers if interrupts are posted

Type: fix

Change-Id: If8dbbcb46193fd057fe8d704058609a3a8787d6c
Signed-off-by: Benoît Ganne <bganne@cisco.com>
diff --git a/src/vlib/main.c b/src/vlib/main.c
index 2c397a2..8d7c6c0 100644
--- a/src/vlib/main.c
+++ b/src/vlib/main.c
@@ -1766,6 +1766,8 @@
   /* Pre-allocate interupt runtime indices and lock. */
   vec_alloc (nm->pending_local_interrupts, 32);
   vec_alloc (nm->pending_remote_interrupts, 32);
+  vec_alloc_aligned (nm->pending_remote_interrupts_notify, 1,
+		     CLIB_CACHE_LINE_BYTES);
   clib_spinlock_init (&nm->pending_interrupt_lock);
 
   /* Pre-allocate expired nodes. */
@@ -1857,7 +1859,7 @@
 	cpu_time_now = dispatch_pending_interrupts (vm, nm, cpu_time_now);
 
       /* handle remote interruots */
-      if (_vec_len (nm->pending_remote_interrupts))
+      if (PREDICT_FALSE (_vec_len (nm->pending_remote_interrupts)))
 	{
 	  vlib_node_interrupt_t *in;
 
@@ -1868,6 +1870,7 @@
 	  in = nm->pending_local_interrupts;
 	  nm->pending_local_interrupts = nm->pending_remote_interrupts;
 	  nm->pending_remote_interrupts = in;
+	  *nm->pending_remote_interrupts_notify = 0;
 	  clib_spinlock_unlock (&nm->pending_interrupt_lock);
 
 	  cpu_time_now = dispatch_pending_interrupts (vm, nm, cpu_time_now);
diff --git a/src/vlib/node.h b/src/vlib/node.h
index ca7564a..9c4cadd 100644
--- a/src/vlib/node.h
+++ b/src/vlib/node.h
@@ -698,6 +698,7 @@
   /* Node runtime indices for input nodes with pending interrupts. */
   vlib_node_interrupt_t *pending_local_interrupts;
   vlib_node_interrupt_t *pending_remote_interrupts;
+  volatile u32 *pending_remote_interrupts_notify;
   clib_spinlock_t pending_interrupt_lock;
 
   /* Input nodes are switched from/to interrupt to/from polling mode
diff --git a/src/vlib/node_funcs.h b/src/vlib/node_funcs.h
index b607ef2..89f2123 100644
--- a/src/vlib/node_funcs.h
+++ b/src/vlib/node_funcs.h
@@ -242,6 +242,7 @@
       vec_add2 (nm->pending_remote_interrupts, i, 1);
       i->node_runtime_index = n->runtime_index;
       i->data = data;
+      *nm->pending_remote_interrupts_notify = 1;
       clib_spinlock_unlock (&nm->pending_interrupt_lock);
     }
 }
diff --git a/src/vlib/unix/input.c b/src/vlib/unix/input.c
index 98cb133..7531dd1 100644
--- a/src/vlib/unix/input.c
+++ b/src/vlib/unix/input.c
@@ -249,7 +249,8 @@
 
 		while (nanosleep (&ts, &tsrem) < 0)
 		  ts = tsrem;
-		if (*vlib_worker_threads->wait_at_barrier)
+		if (*vlib_worker_threads->wait_at_barrier
+		    || *nm->pending_remote_interrupts_notify)
 		  goto done;
 	      }
 	  }
diff --git a/src/vppinfra/vec.h b/src/vppinfra/vec.h
index df913c2..d4063e6 100644
--- a/src/vppinfra/vec.h
+++ b/src/vppinfra/vec.h
@@ -119,7 +119,7 @@
 #define _vec_resize_numa(V,L,DB,HB,A,S)					\
 ({									\
   __typeof__ ((V)) _V;							\
-  _V = _vec_resize_inline(V,L,DB,HB,clib_max((__alignof__((V)[0])),(A)),(S)); \
+  _V = _vec_resize_inline((void *)V,L,DB,HB,clib_max((__alignof__((V)[0])),(A)),(S)); \
   _V;									\
 })