diff --git a/arch/x86/kernel/syscall.c b/arch/x86/kernel/syscall.c index 21259603..38c1ea42 100644 --- a/arch/x86/kernel/syscall.c +++ b/arch/x86/kernel/syscall.c @@ -288,14 +288,16 @@ check_signal(unsigned long rc, void *regs0) unsigned long do_kill(int pid, int tid, int sig) { + struct cpu_local_var *v; + struct process *p; struct process *proc = cpu_local_var(current); struct process *tproc = NULL; int i; __sigset_t mask; struct sig_pending *pending; struct list_head *head; - int irqstate; int rc; + unsigned long irqstate; if(proc == NULL || proc->pid == 0){ return -ESRCH; @@ -314,37 +316,52 @@ do_kill(int pid, int tid, int sig) } else{ for(i = 0; i < num_processors; i++){ - if(get_cpu_local_var(i)->current && - get_cpu_local_var(i)->current->pid == pid){ - tproc = get_cpu_local_var(i)->current; - break; + v = get_cpu_local_var(i); + irqstate = ihk_mc_spinlock_lock(&(v->runq_lock)); + list_for_each_entry(p, &(v->runq), sched_list){ + if(p->pid == pid){ + tproc = p; + break; + } } + ihk_mc_spinlock_unlock(&(v->runq_lock), irqstate); } } } else if(pid == -1){ - for(i = 0; i < num_processors; i++) - if(get_cpu_local_var(i)->current && - get_cpu_local_var(i)->current->pid > 0 && - get_cpu_local_var(i)->current->tid == tid){ - tproc = get_cpu_local_var(i)->current; - break; + for(i = 0; i < num_processors; i++){ + v = get_cpu_local_var(i); + irqstate = ihk_mc_spinlock_lock(&(v->runq_lock)); + list_for_each_entry(p, &(v->runq), sched_list){ + if(p->pid > 0 && + p->tid == tid){ + tproc = p; + break; + } } + ihk_mc_spinlock_unlock(&(v->runq_lock), irqstate); + } } else{ if(pid == 0) return -ESRCH; - for(i = 0; i < num_processors; i++) - if(get_cpu_local_var(i)->current && - get_cpu_local_var(i)->current->pid == pid && - get_cpu_local_var(i)->current->tid == tid){ - tproc = get_cpu_local_var(i)->current; - break; + for(i = 0; i < num_processors; i++){ + v = get_cpu_local_var(i); + irqstate = ihk_mc_spinlock_lock(&(v->runq_lock)); + list_for_each_entry(p, &(v->runq), sched_list){ + if(p->pid == pid && + p->tid == tid){ + tproc = p; + break; + } } + ihk_mc_spinlock_unlock(&(v->runq_lock), irqstate); + } } - if(!tproc) + if(!tproc){ return -ESRCH; + } if(sig == 0) return 0; @@ -375,7 +392,7 @@ do_kill(int pid, int tid, int sig) } else{ list_add_tail(&pending->list, head); - proc->sigevent = 1; + tproc->sigevent = 1; } } if(tid == -1){ diff --git a/kernel/init.c b/kernel/init.c index 39a54993..6f31113c 100644 --- a/kernel/init.c +++ b/kernel/init.c @@ -211,8 +211,11 @@ static void post_init(void) } if (find_command_line("hidos")) { + extern ihk_spinlock_t syscall_lock; + init_host_syscall_channel(); init_host_syscall_channel2(); + ihk_mc_spinlock_init(&syscall_lock); } ap_start(); } diff --git a/kernel/syscall.c b/kernel/syscall.c index 5fb5cc13..7b27e667 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -168,6 +168,7 @@ static void send_syscall(struct syscall_request *req, int cpu, int pid) #endif } +ihk_spinlock_t syscall_lock; long do_syscall(struct syscall_request *req, ihk_mc_user_context_t *ctx, int cpu, int pid) @@ -176,6 +177,9 @@ long do_syscall(struct syscall_request *req, ihk_mc_user_context_t *ctx, struct syscall_request req2 IHK_DMA_ALIGN; struct syscall_params *scp; int error; + long rc; + int islock = 0; + unsigned long irqstate; dkprintf("SC(%d)[%3d] sending syscall\n", ihk_mc_get_processor_id(), @@ -184,6 +188,8 @@ long do_syscall(struct syscall_request *req, ihk_mc_user_context_t *ctx, if(req->number == __NR_exit_group || req->number == __NR_kill){ // interrupt syscall scp = &get_cpu_local_var(0)->scp2; + islock = 1; + irqstate = ihk_mc_spinlock_lock(&syscall_lock); } else{ scp = &get_cpu_local_var(cpu)->scp; @@ -225,7 +231,12 @@ long do_syscall(struct syscall_request *req, ihk_mc_user_context_t *ctx, ihk_mc_get_processor_id(), req->number, res->ret); - return res->ret; + rc = res->ret; + if(islock){ + ihk_mc_spinlock_unlock(&syscall_lock, irqstate); + } + + return rc; } long syscall_generic_forwarding(int n, ihk_mc_user_context_t *ctx)