Fix MP hazard in interrupt node scheduling

Change-Id: Iff14ed6ffd822eb2286aac6af467d9c8660e3d81
Signed-off-by: Dave Barach <dave@barachs.net>
diff --git a/src/vlib/main.c b/src/vlib/main.c
index d32ca7b..f915aa4 100644
--- a/src/vlib/main.c
+++ b/src/vlib/main.c
@@ -1514,13 +1514,19 @@
 
       /* Next handle interrupts. */
       {
+	/* unlocked read, for performance */
 	uword l = _vec_len (nm->pending_interrupt_node_runtime_indices);
 	uword i;
-	if (l > 0)
+	if (PREDICT_FALSE (l > 0))
 	  {
 	    u32 *tmp;
 	    if (!is_main)
-	      clib_spinlock_lock (&nm->pending_interrupt_lock);
+	      {
+		clib_spinlock_lock (&nm->pending_interrupt_lock);
+		/* Re-read w/ lock held, in case another thread added an item */
+		l = _vec_len (nm->pending_interrupt_node_runtime_indices);
+	      }
+
 	    tmp = nm->pending_interrupt_node_runtime_indices;
 	    nm->pending_interrupt_node_runtime_indices =
 	      last_node_runtime_indices;