From 81a78be20a2d74c3014d8d6f0adf9187a71aff28 Mon Sep 17 00:00:00 2001 From: "bgerofi@riken.jp" Date: Mon, 19 May 2014 11:23:55 +0900 Subject: [PATCH] clean up per process structure in exit_group() and fix wait4() on self bug --- executer/kernel/control.c | 12 ++++++++++++ executer/kernel/syscall.c | 34 ++++++++++++++++++++++++++++++++++ kernel/syscall.c | 8 +++++++- 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/executer/kernel/control.c b/executer/kernel/control.c index abffe176..54da7aa4 100644 --- a/executer/kernel/control.c +++ b/executer/kernel/control.c @@ -390,6 +390,18 @@ retry_alloc: ihk_ikc_spinlock_unlock(&c->wq_list_lock, irqflags); kfree(wqhln); + if (c->param.request_va->number == 61 && + c->param.request_va->args[0] == swd.pid) { + + dprintk("pid: %d, tid: %d: SC %d, swd.cpu: %d, WARNING: wait4() for self?\n", + current->tgid, + current->pid, + c->param.request_va->number, + swd.cpu); + + return -EINTR; + } + if (ret) { return -EINTR; } diff --git a/executer/kernel/syscall.c b/executer/kernel/syscall.c index 668c59ea..6ca941a0 100644 --- a/executer/kernel/syscall.c +++ b/executer/kernel/syscall.c @@ -1202,6 +1202,40 @@ int __do_in_kernel_syscall(ihk_os_t os, struct mcctrl_channel *c, struct syscall ret = remap_user_space(sc->args[0], sc->args[1], sc->args[2]); break; + case __NR_exit_group: { + unsigned long flags; + struct mcctrl_per_proc_data *ppd = NULL, *ppd_iter; + + ppd = NULL; + flags = ihk_ikc_spinlock_lock(&usrdata->per_proc_list_lock); + + list_for_each_entry(ppd_iter, &usrdata->per_proc_list, list) { + if (ppd_iter->pid == current->tgid) { + ppd = ppd_iter; + break; + } + } + + if (ppd) { + list_del(&ppd->list); + + printk("pid: %d, tid: %d: rpgtable for %d (0x%lx) removed\n", + current->tgid, current->pid, ppd->pid, ppd->rpgtable); + + kfree(ppd); + } + else { + printk("WARNING: no per process data for pid %d ?\n", + current->tgid); + } + + ihk_ikc_spinlock_unlock(&usrdata->per_proc_list_lock, flags); + + /* Make sure the user space handler will be called as well */ + error = -ENOSYS; + goto out; + } + default: error = -ENOSYS; goto out; diff --git a/kernel/syscall.c b/kernel/syscall.c index 219015bc..682fdb08 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -107,6 +107,7 @@ static void send_syscall(struct syscall_request *req, int cpu, int pid) struct syscall_response *res; struct syscall_params *scp; struct ihk_ikc_channel_desc *syscall_channel; + int ret; if(req->number == __NR_exit_group || req->number == __NR_kill){ // interrupt syscall @@ -149,7 +150,11 @@ static void send_syscall(struct syscall_request *req, int cpu, int pid) packet.pid = pid ? pid : cpu_local_var(current)->pid; packet.arg = scp->request_rpa; dkprintf("send syscall, nr: %d, pid: %d\n", req->number, packet.pid); - ihk_ikc_send(syscall_channel, &packet, 0); + + ret = ihk_ikc_send(syscall_channel, &packet, 0); + if (ret < 0) { + kprintf("ERROR: sending IKC msg, ret: %d\n", ret); + } #endif } @@ -1179,6 +1184,7 @@ SYSCALL_DECLARE(clone) new->vm->region.user_start; /* 3rd parameter denotes new rpgtable of host process */ request1.args[2] = virt_to_phys(new->vm->page_table); + request1.args[3] = new->pid; dkprintf("fork(): requesting PTE clear and rpgtable (0x%lx) update\n", request1.args[2]);