From 3988b0fc6132679dcbdd9ff33f3748994cf70580 Mon Sep 17 00:00:00 2001 From: Balazs Gerofi Date: Thu, 23 Jul 2015 16:55:46 +0900 Subject: [PATCH] keep track of IRQ context and don't do thread migration there --- arch/x86/kernel/cpu.c | 5 +++++ kernel/include/cls.h | 1 + kernel/process.c | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/arch/x86/kernel/cpu.c b/arch/x86/kernel/cpu.c index 82167273..87d9fdbc 100644 --- a/arch/x86/kernel/cpu.c +++ b/arch/x86/kernel/cpu.c @@ -610,6 +610,9 @@ extern void tlb_flush_handler(int vector); void handle_interrupt(int vector, struct x86_user_context *regs) { struct ihk_mc_interrupt_handler *h; + struct cpu_local_var *v = get_this_cpu_local_var(); + + v->in_interrupt = 1; lapic_ack(); @@ -680,6 +683,8 @@ void handle_interrupt(int vector, struct x86_user_context *regs) check_signal(0, regs, 0); check_need_resched(); + + v->in_interrupt = 0; } void gpe_handler(struct x86_user_context *regs) diff --git a/kernel/include/cls.h b/kernel/include/cls.h index 3a7784cf..04dfd308 100644 --- a/kernel/include/cls.h +++ b/kernel/include/cls.h @@ -67,6 +67,7 @@ struct cpu_local_var { ihk_spinlock_t migq_lock; struct list_head migq; + int in_interrupt; } __attribute__((aligned(64))); diff --git a/kernel/process.c b/kernel/process.c index 29e48c9f..ee093efb 100644 --- a/kernel/process.c +++ b/kernel/process.c @@ -2293,7 +2293,7 @@ redo: ihk_mc_spinlock_unlock(&(v->runq_lock), irqstate); } - if (v->flags & CPU_FLAG_NEED_MIGRATE) { + if (v->flags & CPU_FLAG_NEED_MIGRATE && !v->in_interrupt) { v->flags &= ~CPU_FLAG_NEED_MIGRATE; do_migrate(); goto redo;