vkernel - Fix a vkernel lockup on startup
authorAntonio Huete Jimenez <tuxillo@quantumachine.net>
Tue, 20 Sep 2016 22:03:05 +0000 (00:03 +0200)
committerAntonio Huete Jimenez <tuxillo@quantumachine.net>
Wed, 21 Sep 2016 00:08:56 +0000 (02:08 +0200)
- During ap_init() any pending IPIs is processed manually so
  clear gd_npoll as the real kernel does.
- Do not disable interrupts for vkernels during lwkt_send_ipiq3()
  because they don't seem to be re-enabled afterwards as they should.
  I'm not entirely sure this is the right fix, more investigation
  is required.

sys/kern/lwkt_ipiq.c
sys/platform/vkernel64/x86_64/mp.c

index 5eb162d..13104fc 100644 (file)
@@ -197,7 +197,7 @@ lwkt_send_ipiq3(globaldata_t target, ipifunc3_t func, void *arg1, int arg2)
        func(arg1, arg2, NULL);
        logipiq(send_end, func, arg1, arg2, gd, target);
        return(0);
-    } 
+    }
     crit_enter();
     ++gd->gd_intr_nesting_level;
 #ifdef INVARIANTS
@@ -297,7 +297,9 @@ lwkt_send_ipiq3(globaldata_t target, ipifunc3_t func, void *arg1, int arg2)
      *    just be made pending).
      */
     rflags = read_rflags();
+#ifndef _KERNEL_VIRTUAL
     cpu_disable_intr();
+#endif
 
     windex = ip->ip_windex & MAXCPUFIFO_MASK;
     ip->ip_info[windex].func = func;
index 7dec814..09b574c 100644 (file)
@@ -333,6 +333,14 @@ ap_init(void)
        mdcpu->gd_fpending = 0;
        mdcpu->gd_ipending = 0;
        initclocks_pcpu();      /* clock interrupts (via IPIs) */
+
+       /*
+        * Since we may have cleaned up the interrupt triggers, manually
+        * process any pending IPIs before exiting our critical section.
+        * Once the critical section has exited, normal interrupt processing
+        * may occur.
+        */
+       atomic_swap_int(&mycpu->gd_npoll, 0);
        lwkt_process_ipiq();
 
         /*