From 88313aa32d176460368996642c334fb9ad42951c Mon Sep 17 00:00:00 2001 From: Joe Talbott Date: Sat, 30 Jun 2007 15:42:33 -0400 Subject: [PATCH] More minor IPI work. Set RQF_IPIQ if IPI interrupt occurs while in a critical section. Add initial support for IPIs into splz(). --- sys/platform/vkernel/i386/exception.c | 13 ++++++++----- sys/platform/vkernel/platform/machintr.c | 5 +++++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/sys/platform/vkernel/i386/exception.c b/sys/platform/vkernel/i386/exception.c index d8c5646658..9f5983f96a 100644 --- a/sys/platform/vkernel/i386/exception.c +++ b/sys/platform/vkernel/i386/exception.c @@ -74,16 +74,19 @@ static void ipi(int nada, siginfo_t *info, void *ctxp) { + struct globaldata *gd = mycpu; + kprintf("ipi\n"); ++mycpu->gd_intr_nesting_level; - if (curthread->td_pri < TDPRI_CRIT) { - kprintf("ipi pri < TDPRI_CRIT"); - curthread->td_pri += TDPRI_CRIT; + if (IN_CRITICAL_SECT(curthread)) { + kprintf("JAT: ipi in critical section\n"); + gd->gd_reqflags &= RQF_IPIQ; lwkt_process_ipiq(); - curthread->td_pri -= TDPRI_CRIT; } else { - kprintf("ipi pri > TDPRI_CRIT"); + kprintf("JAT: ipi NOT in critical section\n"); + curthread->td_pri += TDPRI_CRIT; lwkt_process_ipiq(); + curthread->td_pri -= TDPRI_CRIT; } --mycpu->gd_intr_nesting_level; } diff --git a/sys/platform/vkernel/platform/machintr.c b/sys/platform/vkernel/platform/machintr.c index d606937958..6a187d7e47 100644 --- a/sys/platform/vkernel/platform/machintr.c +++ b/sys/platform/vkernel/platform/machintr.c @@ -129,6 +129,11 @@ splz(void) atomic_clear_int(&gd->gd_fpending, 1 << irq); sched_ithd(irq); } + while ((gd->mi.gd_reqflags & RQF_IPIQ) != 0) { + gd->mi.gd_reqflags &= ~RQF_IPIQ; + lwkt_process_ipiq(); + } + } void -- 2.11.4.GIT