vlib: wake up workers if interrupts are posted 43/27743/4
authorBenoît Ganne <bganne@cisco.com>
Tue, 30 Jun 2020 16:17:06 +0000 (18:17 +0200)
committerDave Barach <openvpp@barachs.net>
Wed, 1 Jul 2020 20:39:01 +0000 (20:39 +0000)
Type: fix

Change-Id: If8dbbcb46193fd057fe8d704058609a3a8787d6c
Signed-off-by: Benoît Ganne <bganne@cisco.com>
src/vlib/main.c
src/vlib/node.h
src/vlib/node_funcs.h
src/vlib/unix/input.c
src/vppinfra/vec.h

index 2c397a2..8d7c6c0 100644 (file)
@@ -1766,6 +1766,8 @@ vlib_main_or_worker_loop (vlib_main_t * vm, int is_main)
   /* 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 @@ vlib_main_or_worker_loop (vlib_main_t * vm, int is_main)
        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 @@ vlib_main_or_worker_loop (vlib_main_t * vm, int is_main)
          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);
index ca7564a..9c4cadd 100644 (file)
@@ -698,6 +698,7 @@ typedef struct
   /* 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
index b607ef2..89f2123 100644 (file)
@@ -242,6 +242,7 @@ vlib_node_set_interrupt_pending_with_data (vlib_main_t * vm, u32 node_index,
       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);
     }
 }
index 98cb133..7531dd1 100644 (file)
@@ -249,7 +249,8 @@ linux_epoll_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
 
                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;
              }
          }
index df913c2..d4063e6 100644 (file)
@@ -119,7 +119,7 @@ void *vec_resize_allocate_memory (void *v,
 #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;                                                                  \
 })