delete unused member

This commit is contained in:
Tomoki Shirasawa
2015-10-19 20:12:26 +09:00
parent a325a78866
commit 4e4f1208f7
4 changed files with 38 additions and 53 deletions

View File

@@ -369,6 +369,7 @@ static int process_msg_prepare_process(unsigned long rphys)
vm = thread->vm; vm = thread->vm;
proc->pid = pn->pid; proc->pid = pn->pid;
proc->vm->address_space->pids[0] = pn->pid;
proc->pgid = pn->pgid; proc->pgid = pn->pgid;
proc->ruid = pn->cred[0]; proc->ruid = pn->cred[0];
proc->euid = pn->cred[1]; proc->euid = pn->cred[1];

View File

@@ -216,8 +216,6 @@ struct thread_hash {
struct address_space { struct address_space {
struct page_table *page_table; struct page_table *page_table;
struct list_head siblings_list;
struct resource_set *res;
int type; int type;
#define ADDRESS_SPACE_NORMAL 1 #define ADDRESS_SPACE_NORMAL 1
#define ADDRESS_SPACE_PVAS 2 #define ADDRESS_SPACE_PVAS 2
@@ -369,7 +367,7 @@ struct process {
// | ^ ^ // | ^ ^
// | |---+ | // | |---+ |
// V | | // V | |
// PS_STOPPING | | // PS_STOPPING-)---+
// (PS_TRACING)| | // (PS_TRACING)| |
// | | | // | | |
// V +---- | // V +---- |
@@ -457,7 +455,14 @@ struct thread {
// thread info // thread info
int cpu_id; int cpu_id;
int tid; int tid;
int tstatus; int tstatus; // PS_RUNNING -> PS_EXITED
// | ^ ^
// | | |
// V | |
// PS_STOPPED------+
// PS_TRACED
// PS_INTERRPUTIBLE
// PS_UNINTERRUPTIBLE
// process vm // process vm
struct process_vm *vm; struct process_vm *vm;

View File

@@ -156,7 +156,6 @@ create_address_space(struct resource_set *res, int type, int n)
} }
memset(asp, '\0', sizeof(struct address_space) + sizeof(int) * n); memset(asp, '\0', sizeof(struct address_space) + sizeof(int) * n);
asp->res = res;
asp->type = type; asp->type = type;
asp->nslots = n; asp->nslots = n;
asp->page_table = pt; asp->page_table = pt;

View File

@@ -1514,16 +1514,16 @@ static int ptrace_report_exec(struct thread *thread)
static void ptrace_syscall_enter(struct thread *thread) static void ptrace_syscall_enter(struct thread *thread)
{ {
int ptrace = thread->proc->ptrace; int ptrace = thread->proc->ptrace;
struct mcs_rwlock_node_irqsave lock;
if (ptrace & PT_TRACE_SYSCALL_ENTER) { if (ptrace & PT_TRACE_SYSCALL_ENTER) {
int sig = (SIGTRAP | ((ptrace & PTRACE_O_TRACESYSGOOD) ? 0x80 : 0)); int sig = (SIGTRAP | ((ptrace & PTRACE_O_TRACESYSGOOD) ? 0x80 : 0));
ptrace_report_signal(thread, sig); ptrace_report_signal(thread, sig);
// TODO(sira): フラグ設定を排他的に行う必要がある! mcs_rwlock_writer_lock(&thread->proc->update_lock, &lock);
//?ihk_mc_spinlock_lock_noirq(&thread->proc->lock);
if (thread->proc->ptrace & PT_TRACE_SYSCALL_ENTER) { if (thread->proc->ptrace & PT_TRACE_SYSCALL_ENTER) {
thread->proc->ptrace |= PT_TRACE_SYSCALL_EXIT; thread->proc->ptrace |= PT_TRACE_SYSCALL_EXIT;
} }
//?ihk_mc_spinlock_unlock_noirq(&thread->proc->lock); mcs_rwlock_writer_unlock(&thread->proc->update_lock, &lock);
} }
} }
@@ -1564,58 +1564,46 @@ static int ptrace_check_clone_event(struct thread *thread, int clone_flags)
return event; return event;
} }
// TODO(sira): 全体的にチェック必要
static int ptrace_report_clone(struct thread *thread, struct thread *new, int event) static int ptrace_report_clone(struct thread *thread, struct thread *new, int event)
{ {
dkprintf("ptrace_report_clone,enter\n"); dkprintf("ptrace_report_clone,enter\n");
int error = 0; int error = 0;
long rc; long rc;
struct siginfo info; struct siginfo info;
mcs_rwlock_node_t lock; struct mcs_rwlock_node lock;
struct mcs_rwlock_node updatelock;
int parent_pid;
/* Save reason why stopped and process state for wait4() to reap */ /* Save reason why stopped and process state for wait4() to reap */
// TODO(sira): フラグ設定を排他的に行う必要がある! mcs_rwlock_writer_lock_noirq(&thread->proc->update_lock, &lock);
//?ihk_mc_spinlock_lock_noirq(&thread->proc->lock);
thread->proc->exit_status = (SIGTRAP | (event << 8)); thread->proc->exit_status = (SIGTRAP | (event << 8));
/* Transition process state */ /* Transition process state */
thread->proc->pstatus = PS_TRACED; thread->proc->pstatus = PS_TRACED;
thread->tstatus = PS_TRACED; thread->tstatus = PS_TRACED;
thread->proc->ptrace_eventmsg = new->tid; thread->proc->ptrace_eventmsg = new->tid;
thread->proc->ptrace &= ~PT_TRACE_SYSCALL_MASK; thread->proc->ptrace &= ~PT_TRACE_SYSCALL_MASK;
//?ihk_mc_spinlock_unlock_noirq(&thread->proc->lock); parent_pid = thread->proc->parent->pid;
mcs_rwlock_writer_unlock_noirq(&thread->proc->update_lock, &lock);
dkprintf("ptrace_report_clone,kill SIGCHLD\n"); dkprintf("ptrace_report_clone,kill SIGCHLD\n");
if (thread->proc->parent) { memset(&info, '\0', sizeof info);
/* kill SIGCHLD */ info.si_signo = SIGCHLD;
// このロックは不要と思われる info.si_code = CLD_TRAPPED;
//?ihk_mc_spinlock_lock_noirq(&thread->proc->parent->lock); info._sifields._sigchld.si_pid = thread->proc->pid;
// 条件も不要 必ず親がある info._sifields._sigchld.si_status = thread->proc->exit_status;
if (thread->proc->parent) { rc = do_kill(cpu_local_var(current), parent_pid, -1, SIGCHLD, &info, 0);
memset(&info, '\0', sizeof info); if(rc < 0) {
info.si_signo = SIGCHLD; dkprintf("ptrace_report_clone,do_kill failed\n");
info.si_code = CLD_TRAPPED;
info._sifields._sigchld.si_pid = thread->proc->pid;
info._sifields._sigchld.si_status = thread->proc->exit_status;
rc = do_kill(cpu_local_var(current), thread->proc->parent->pid, -1, SIGCHLD, &info, 0);
if(rc < 0) {
dkprintf("ptrace_report_clone,do_kill failed\n");
}
}
//?ihk_mc_spinlock_unlock_noirq(&thread->proc->parent->lock);
/* Wake parent (if sleeping in wait4()) */
waitq_wakeup(&thread->proc->parent->waitpid_q);
} }
/* Wake parent (if sleeping in wait4()) */
waitq_wakeup(&thread->proc->parent->waitpid_q);
if (event != PTRACE_EVENT_VFORK_DONE) { if (event != PTRACE_EVENT_VFORK_DONE) {
/* PTRACE_EVENT_FORK or PTRACE_EVENT_VFORK or PTRACE_EVENT_CLONE */ /* PTRACE_EVENT_FORK or PTRACE_EVENT_VFORK or PTRACE_EVENT_CLONE */
struct process *child, *next; mcs_rwlock_writer_lock_noirq(&new->proc->update_lock, &updatelock);
/* set ptrace features to new process */ /* set ptrace features to new process */
// このロックは不要と思われる
//?ihk_mc_spinlock_lock_noirq(&new->proc->lock);
new->proc->ptrace = thread->proc->ptrace; new->proc->ptrace = thread->proc->ptrace;
new->proc->ppid_parent = new->proc->parent; /* maybe proc */ new->proc->ppid_parent = new->proc->parent; /* maybe proc */
@@ -1624,30 +1612,21 @@ static int ptrace_report_clone(struct thread *thread, struct thread *new, int ev
} }
mcs_rwlock_writer_lock_noirq(&new->proc->parent->children_lock, &lock); mcs_rwlock_writer_lock_noirq(&new->proc->parent->children_lock, &lock);
list_for_each_entry_safe(child, next, &new->proc->parent->children_list, siblings_list) { list_del(&new->proc->siblings_list);
if(child == new->proc) { list_add_tail(&new->proc->ptraced_siblings_list, &new->proc->parent->ptraced_children_list);
list_del(&child->siblings_list);
goto found;
}
}
panic("ptrace_report_clone: missing parent-child relationship.");
found:
mcs_rwlock_writer_unlock_noirq(&new->proc->parent->children_lock, &lock); mcs_rwlock_writer_unlock_noirq(&new->proc->parent->children_lock, &lock);
new->proc->parent = thread->proc->parent; /* new ptracing parent */ new->proc->parent = thread->proc->parent; /* new ptracing parent */
mcs_rwlock_writer_lock_noirq(&new->proc->parent->children_lock, &lock);
/* TODO(sira): 作り直し list_add_tail(&new->siblings_list, &new->proc->parent->children_list);
ihk_mc_spinlock_lock_noirq(&new->proc->parent->children_lock); mcs_rwlock_writer_unlock_noirq(&new->proc->parent->children_lock, &lock);
list_add_tail(&new->proc->ptrace_siblings_list, &new->proc->parent->ptrace_children);
ihk_mc_spinlock_unlock_noirq(&new->proc->parent->children_lock);
*/
/* trace and SIGSTOP */ /* trace and SIGSTOP */
new->proc->exit_status = SIGSTOP; new->proc->exit_status = SIGSTOP;
new->proc->pstatus = PS_TRACED; new->proc->pstatus = PS_TRACED;
new->tstatus = PS_TRACED; new->tstatus = PS_TRACED;
//?ihk_mc_spinlock_unlock_noirq(&new->proc->lock); mcs_rwlock_writer_unlock_noirq(&new->proc->update_lock, &updatelock);
} }
return error; return error;
@@ -1876,6 +1855,7 @@ unsigned long do_fork(int clone_flags, unsigned long newsp,
/* In a single threaded process TID equals to PID */ /* In a single threaded process TID equals to PID */
settid(new, 0, cpuid, -1); settid(new, 0, cpuid, -1);
new->vm->address_space->pids[0] = new->proc->pid;
dkprintf("fork(): new pid: %d\n", new->proc->pid); dkprintf("fork(): new pid: %d\n", new->proc->pid);
/* clear user space PTEs and set new rpgtable so that consequent /* clear user space PTEs and set new rpgtable so that consequent