some variables definition are gathered to fork_tree_node from process.

- remove both-defined: pid, pgid, status
- move to fork_tree_node: tid
- make dummy fork_tree_node for idle_process.
This commit is contained in:
Tomoki Shirasawa
2014-10-29 16:54:09 +09:00
parent 658ff759ef
commit 3fe7e39607
11 changed files with 102 additions and 126 deletions

View File

@ -172,7 +172,7 @@ do_setpgid(int pid, int pgid)
unsigned long irqstate;
if(pid == 0)
pid = proc->pid;
pid = proc->ftn->pid;
if(pgid == 0)
pgid = pid;
@ -180,15 +180,10 @@ do_setpgid(int pid, int pgid)
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)
if(p->ftn->pid <= 0)
continue;
if(p->pid == pid){
p->pgid = pgid;
/* Update pgid in fork_tree because it's used in wait4 */
ihk_mc_spinlock_lock_noirq(&p->ftn->lock);
p->ftn->pgid = pgid;
ihk_mc_spinlock_unlock_noirq(&p->ftn->lock);
if(p->ftn->pid == pid){
p->ftn->pgid = pgid;
}
}
ihk_mc_spinlock_unlock(&(v->runq_lock), irqstate);
@ -293,7 +288,7 @@ do_signal(unsigned long rc, void *regs0, struct process *proc, struct sig_pendin
struct fork_tree_node *ftn = proc->ftn;
for(w = pending->sigmask.__val[0], sig = 0; w; sig++, w >>= 1);
dkprintf("do_signal,pid=%d,sig=%d\n", proc->pid, sig);
dkprintf("do_signal,pid=%d,sig=%d\n", proc->ftn->pid, sig);
if(regs == NULL){ /* call from syscall */
asm("movq %%gs:132, %0" : "=r" (regs));
@ -383,7 +378,7 @@ do_signal(unsigned long rc, void *regs0, struct process *proc, struct sig_pendin
dkprintf("do_signal,SIGSTOP,sleeping\n");
/* Sleep */
proc->status = PS_STOPPED;
proc->ftn->status = PS_STOPPED;
schedule();
dkprintf("SIGSTOP(): woken up\n");
break;
@ -404,7 +399,6 @@ do_signal(unsigned long rc, void *regs0, struct process *proc, struct sig_pendin
/* Sleep */
dkprintf("do_signal,SIGTRAP,sleeping\n");
proc->status = PS_TRACED;
schedule();
dkprintf("SIGTRAP(): woken up\n");
@ -449,7 +443,7 @@ static int ptrace_report_signal(struct process *proc, struct x86_regs *regs, str
__sigset_t w;
long rc;
dkprintf("ptrace_report_signal,pid=%d\n", proc->pid);
dkprintf("ptrace_report_signal,pid=%d\n", proc->ftn->pid);
/* Save reason why stopped and process state for wait to reap */
for (w = pending->sigmask.__val[0], sig = 0; w; sig++, w >>= 1);
@ -467,9 +461,9 @@ static int ptrace_report_signal(struct process *proc, struct x86_regs *regs, str
memset(&info, '\0', sizeof info);
info.si_signo = SIGCHLD;
info.si_code = CLD_TRAPPED;
info._sifields._sigchld.si_pid = proc->pid;
info._sifields._sigchld.si_pid = proc->ftn->pid;
info._sifields._sigchld.si_status = proc->ftn->exit_status;
rc = do_kill(proc->ftn->parent->owner->pid, -1, SIGCHLD, &info);
rc = do_kill(proc->ftn->parent->pid, -1, SIGCHLD, &info);
if (rc < 0) {
kprintf("ptrace_report_signal,do_kill failed\n");
}
@ -483,7 +477,6 @@ static int ptrace_report_signal(struct process *proc, struct x86_regs *regs, str
peekuser(proc, regs);
dkprintf("ptrace_report_signal,sleeping\n");
/* Sleep */
proc->status = PS_TRACED;
schedule();
dkprintf("ptrace_report_signal,wake up\n");
@ -506,7 +499,7 @@ check_signal(unsigned long rc, void *regs0)
if(clv == NULL)
return;
proc = cpu_local_var(current);
if(proc == NULL || proc->pid == 0)
if(proc == NULL || proc->ftn->pid == 0)
return;
if(regs != NULL && (regs->rsp & 0x8000000000000000)) {
@ -588,9 +581,9 @@ do_kill(int pid, int tid, int sig, siginfo_t *info)
int sendme = 0;
if(pid == 0){
if(proc == NULL || proc->pid <= 0)
if(proc == NULL || proc->ftn->pid <= 0)
return -ESRCH;
pgid = proc->pgid;
pgid = proc->ftn->pgid;
}
pids = kmalloc(sizeof(int) * num_processors, IHK_MC_AP_NOWAIT);
if(!pids)
@ -599,20 +592,20 @@ do_kill(int pid, int tid, int sig, siginfo_t *info)
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)
if(p->ftn->pid <= 0)
continue;
if(proc && p->pid == proc->pid){
if(proc && p->ftn->pid == proc->ftn->pid){
sendme = 1;
continue;
}
if(pgid == 1 || p->pgid == pgid){
if(pgid == 1 || p->ftn->pgid == pgid){
int j;
for(j = 0; j < n; j++)
if(pids[j] == p->pid)
if(pids[j] == p->ftn->pid)
break;
if(j == n){
pids[n] = p->pid;
pids[n] = p->ftn->pid;
n++;
}
}
@ -622,7 +615,7 @@ do_kill(int pid, int tid, int sig, siginfo_t *info)
for(i = 0; i < n; i++)
rc = do_kill(pids[i], -1, sig, info);
if(sendme)
rc = do_kill(proc->pid, -1, sig, info);
rc = do_kill(proc->ftn->pid, -1, sig, info);
kfree(pids);
return rc;
@ -638,8 +631,8 @@ do_kill(int pid, int tid, int sig, siginfo_t *info)
found = 0;
ihk_mc_spinlock_lock_noirq(&(v->runq_lock));
list_for_each_entry(p, &(v->runq), sched_list){
if(p->pid == pid){
if(p->tid == pid || tproc == NULL){
if(p->ftn->pid == pid){
if(p->ftn->tid == pid || tproc == NULL){
if(!(mask & p->sigmask.__val[0])){
tproc = p;
if(!found && savelock) {
@ -659,7 +652,7 @@ do_kill(int pid, int tid, int sig, siginfo_t *info)
}
}
if(!(mask & p->sigmask.__val[0])){
if(p->tid == pid || tproc == NULL){
if(p->ftn->tid == pid || tproc == NULL){
}
}
@ -680,8 +673,8 @@ do_kill(int pid, int tid, int sig, siginfo_t *info)
found = 0;
ihk_mc_spinlock_lock_noirq(&(v->runq_lock));
list_for_each_entry(p, &(v->runq), sched_list){
if(p->pid > 0 &&
p->tid == tid){
if(p->ftn->pid > 0 &&
p->ftn->tid == tid){
savelock = &(v->runq_lock);
found = 1;
tproc = p;
@ -698,8 +691,8 @@ do_kill(int pid, int tid, int sig, siginfo_t *info)
found = 0;
ihk_mc_spinlock_lock_noirq(&(v->runq_lock));
list_for_each_entry(p, &(v->runq), sched_list){
if(p->pid == pid &&
p->tid == tid){
if(p->ftn->pid == pid &&
p->ftn->tid == tid){
savelock = &(v->runq_lock);
found = 1;
tproc = p;
@ -775,7 +768,7 @@ do_kill(int pid, int tid, int sig, siginfo_t *info)
default:
if(proc != tproc){
dkprintf("do_kill,ipi,pid=%d,cpu_id=%d\n",
tproc->pid, tproc->cpu_id);
tproc->ftn->pid, tproc->cpu_id);
ihk_mc_interrupt_cpu(get_x86_cpu_local_variable(tproc->cpu_id)->apic_id, 0xd0);
}
break;
@ -829,7 +822,7 @@ set_signal(int sig, void *regs0, siginfo_t *info)
struct x86_regs *regs = regs0;
struct process *proc = cpu_local_var(current);
if(proc == NULL || proc->pid == 0)
if(proc == NULL || proc->ftn->pid == 0)
return;
if((__sigmask(sig) & proc->sigmask.__val[0]) ||
@ -838,5 +831,5 @@ set_signal(int sig, void *regs0, siginfo_t *info)
terminate(0, sig | 0x80, (ihk_mc_user_context_t *)regs->rsp);
}
else
do_kill(proc->pid, proc->tid, sig, info);
do_kill(proc->ftn->pid, proc->ftn->tid, sig, info);
}