From: Antonio Huete Jimenez Date: Tue, 20 Sep 2016 22:03:05 +0000 (+0200) Subject: vkernel - Fix a vkernel lockup on startup X-Git-Tag: v4.8.0rc~989 X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/4dd1b99459f58c096edd1945eb144cf12006d85a vkernel - Fix a vkernel lockup on startup - 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. --- diff --git a/sys/kern/lwkt_ipiq.c b/sys/kern/lwkt_ipiq.c index 5eb162d801..13104fcbe4 100644 --- a/sys/kern/lwkt_ipiq.c +++ b/sys/kern/lwkt_ipiq.c @@ -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; diff --git a/sys/platform/vkernel64/x86_64/mp.c b/sys/platform/vkernel64/x86_64/mp.c index 7dec8147d3..09b574c8f9 100644 --- a/sys/platform/vkernel64/x86_64/mp.c +++ b/sys/platform/vkernel64/x86_64/mp.c @@ -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(); /*