diff --git a/sys/kern/lwkt_ipiq.c b/sys/kern/lwkt_ipiq.c index 5eb162d..13104fc 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 7dec814..09b574c 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(); /*