From bbb7f77706d4b028f68356dab03892a9d0bf90de Mon Sep 17 00:00:00 2001 From: Tomoki Shirasawa Date: Wed, 11 Jun 2014 21:06:52 +0900 Subject: [PATCH] interrupt syscall of signal recieved process --- arch/x86/kernel/syscall.c | 4 ++-- kernel/syscall.c | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/arch/x86/kernel/syscall.c b/arch/x86/kernel/syscall.c index d194533f..2caad76e 100644 --- a/arch/x86/kernel/syscall.c +++ b/arch/x86/kernel/syscall.c @@ -143,7 +143,7 @@ SYSCALL_DECLARE(rt_sigreturn) extern struct cpu_local_var *clv; extern unsigned long do_kill(int pid, int tid, int sig); -extern void interrupt_syscall(int all); +extern void interrupt_syscall(int all, int pid); extern int num_processors; void @@ -370,7 +370,7 @@ do_kill(int pid, int tid, int sig) if(proc != tproc){ ihk_mc_interrupt_cpu(get_x86_cpu_local_variable(tproc->cpu_id)->apic_id, 0xd0); } - interrupt_syscall(1); + interrupt_syscall(1, tproc->pid); return rc; } diff --git a/kernel/syscall.c b/kernel/syscall.c index 4d264d84..5dd7b94c 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -127,6 +127,8 @@ static void send_syscall(struct syscall_request *req, int cpu, int pid) /* XXX: is this really going to work if multiple processes * exit/receive signals at the same time?? */ cpu = num_processors; + if(req->number == __NR_kill) + pid = req->args[2]; } else{ scp = &get_cpu_local_var(cpu)->scp; @@ -234,6 +236,7 @@ long syscall_generic_forwarding(int n, ihk_mc_user_context_t *ctx) SYSCALL_FOOTER; } +#if 0 void sigchld_parent(struct process *parent, int status) { struct process *proc = cpu_local_var(current); @@ -275,6 +278,7 @@ void sigchld_parent(struct process *parent, int status) ihk_mc_spinlock_unlock(&parent->sigpendinglock, irqstate); } +#endif /* * From glibc: INLINE_SYSCALL (wait4, 4, pid, stat_loc, options, NULL); @@ -438,13 +442,14 @@ terminate(int rc, int sig, ihk_mc_user_context_t *ctx) } void -interrupt_syscall(int all) +interrupt_syscall(int all, int pid) { ihk_mc_user_context_t ctx; long lerror; ihk_mc_syscall_arg0(&ctx) = all? -1: ihk_mc_get_processor_id(); ihk_mc_syscall_arg1(&ctx) = 0; + ihk_mc_syscall_arg2(&ctx) = pid; lerror = syscall_generic_forwarding(__NR_kill, &ctx); if (lerror) {