From 559fc9746c98d876ed04d353146e1222e5f03241 Mon Sep 17 00:00:00 2001 From: Tomoki Shirasawa Date: Sun, 28 Jan 2018 13:38:51 +0900 Subject: [PATCH] signal: check_signal must be called after check_need_resched. --- arch/x86_64/kernel/syscall.c | 4 ++-- kernel/mem.c | 10 +++++----- kernel/syscall.c | 10 +++++----- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/arch/x86_64/kernel/syscall.c b/arch/x86_64/kernel/syscall.c index ec62ba65..e11b0e92 100644 --- a/arch/x86_64/kernel/syscall.c +++ b/arch/x86_64/kernel/syscall.c @@ -252,8 +252,8 @@ SYSCALL_DECLARE(rt_sigreturn) regs->gpr.rflags &= ~RFLAGS_TF; info.si_code = TRAP_TRACE; set_signal(SIGTRAP, regs, &info); - check_signal(0, regs, 0); check_need_resched(); + check_signal(0, regs, 0); } if(ksigsp.fpregs && xsavesize){ @@ -820,8 +820,8 @@ do_signal(unsigned long rc, void *regs0, struct thread *thread, struct sig_pendi regs->gpr.rflags &= ~RFLAGS_TF; info.si_code = TRAP_TRACE; set_signal(SIGTRAP, regs, &info); - check_signal(0, regs, 0); check_need_resched(); + check_signal(0, regs, 0); } } else { diff --git a/kernel/mem.c b/kernel/mem.c index 62cb2065..061b2e48 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -1212,10 +1212,6 @@ static void page_fault_handler(void *fault_addr, uint64_t reason, void *regs) info._sifields._sigfault.si_addr = fault_addr; set_signal(SIGSEGV, regs, &info); } - if(interrupt_from_user(regs)){ - cpu_enable_interrupt(); - check_signal(0, regs, 0); - } goto out; } @@ -1224,7 +1220,11 @@ static void page_fault_handler(void *fault_addr, uint64_t reason, void *regs) out: dkprintf("%s: addr: %p, reason: %lx, regs: %p -> error: %d\n", __FUNCTION__, fault_addr, reason, regs, error); - check_need_resched(); + if(interrupt_from_user(regs)){ + cpu_enable_interrupt(); + check_need_resched(); + check_signal(0, regs, 0); + } set_cputime(0); #ifdef PROFILE_ENABLE if (thread->profile) diff --git a/kernel/syscall.c b/kernel/syscall.c index 2d5f8ac2..dd53b4de 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -9429,11 +9429,6 @@ long syscall(int num, ihk_mc_user_context_t *ctx) save_syscall_return_value(num, l); - if (!list_empty(&thread->sigpending) || - !list_empty(&thread->sigcommon->sigpending)) { - check_signal(l, NULL, num); - } - #ifdef PROFILE_ENABLE { unsigned long ts = rdtsc(); @@ -9472,6 +9467,11 @@ long syscall(int num, ihk_mc_user_context_t *ctx) } #endif /* POSTK_DEBUG_TEMP_FIX_60 && POSTK_DEBUG_TEMP_FIX_56 */ + if (!list_empty(&thread->sigpending) || + !list_empty(&thread->sigcommon->sigpending)) { + check_signal(l, NULL, num); + } + #ifdef DISABLE_SCHED_YIELD if (num != __NR_sched_yield) #endif // DISABLE_SCHED_YIELD