From 2db3717e57fe30a0a79bf65a96d2836ee645c01a Mon Sep 17 00:00:00 2001 From: Balazs Gerofi Date: Thu, 26 Sep 2019 12:07:43 +0900 Subject: [PATCH] handle_interrupt_gicv3(): check for CPU_FLAG_NEED_RESCHED as well Change-Id: Id6ade08e4e572a6d837476de2872126442d3591c --- arch/arm64/kernel/irq-gic-v3.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/arch/arm64/kernel/irq-gic-v3.c b/arch/arm64/kernel/irq-gic-v3.c index 9f72b4d0..12184d7b 100644 --- a/arch/arm64/kernel/irq-gic-v3.c +++ b/arch/arm64/kernel/irq-gic-v3.c @@ -310,6 +310,9 @@ void handle_interrupt_gicv3(struct pt_regs *regs) { uint64_t irqnr; const int from_user = interrupt_from_user(regs); + struct cpu_local_var *v = get_this_cpu_local_var(); + unsigned long irqflags; + int do_check = 0; irqnr = gic_read_iar(); cpu_enable_nmi(); @@ -323,10 +326,18 @@ void handle_interrupt_gicv3(struct pt_regs *regs) } set_cputime(from_user ? CPUTIME_MODE_K2U : CPUTIME_MODE_K2K_OUT); - /* for migration by IPI */ - if (get_this_cpu_local_var()->flags & CPU_FLAG_NEED_MIGRATE) { - schedule(); + irqflags = ihk_mc_spinlock_lock(&v->runq_lock); + /* For migration by IPI or by timesharing */ + if (v->flags & + (CPU_FLAG_NEED_MIGRATE | CPU_FLAG_NEED_RESCHED)) { + v->flags &= ~CPU_FLAG_NEED_RESCHED; + do_check = 1; + } + ihk_mc_spinlock_unlock(&v->runq_lock, irqflags); + + if (do_check) { check_signal(0, regs, 0); + schedule(); } }