From e3ef88c0cf8ff2528631686801e2b673052a9f75 Mon Sep 17 00:00:00 2001 From: Balazs Gerofi Date: Sun, 25 Dec 2016 17:21:44 +0900 Subject: [PATCH] do_sigsuspend(): deschedule thread when neccessary (fixes gdb deadlock) --- kernel/syscall.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/kernel/syscall.c b/kernel/syscall.c index 04289ba6..9538541e 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -3563,9 +3563,28 @@ do_sigsuspend(struct thread *thread, const sigset_t *set) thread->sigmask.__val[0] = wset; thread->sigevent = 1; - for(;;){ - while(thread->sigevent == 0) - cpu_pause(); + for (;;) { + while (thread->sigevent == 0) { + int do_schedule = 0; + struct cpu_local_var *v; + long runq_irqstate; + runq_irqstate = + ihk_mc_spinlock_lock(&(get_this_cpu_local_var()->runq_lock)); + v = get_this_cpu_local_var(); + + if (v->flags & CPU_FLAG_NEED_RESCHED) { + do_schedule = 1; + } + + ihk_mc_spinlock_unlock(&v->runq_lock, runq_irqstate); + + if (do_schedule) { + schedule(); + } + else { + cpu_pause(); + } + } lock = &thread->sigcommon->lock; head = &thread->sigcommon->sigpending;