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;
proc->pid = pn->pid;
proc->vm->address_space->pids[0] = pn->pid;
proc->pgid = pn->pgid;
proc->ruid = pn->cred[0];
proc->euid = pn->cred[1];

View File

@@ -216,8 +216,6 @@ struct thread_hash {
struct address_space {
struct page_table *page_table;
struct list_head siblings_list;
struct resource_set *res;
int type;
#define ADDRESS_SPACE_NORMAL 1
#define ADDRESS_SPACE_PVAS 2
@@ -369,7 +367,7 @@ struct process {
// | ^ ^
// | |---+ |
// V | |
// PS_STOPPING | |
// PS_STOPPING-)---+
// (PS_TRACING)| |
// | | |
// V +---- |
@@ -457,7 +455,14 @@ struct thread {
// thread info
int cpu_id;
int tid;
int tstatus;
int tstatus; // PS_RUNNING -> PS_EXITED
// | ^ ^
// | | |
// V | |
// PS_STOPPED------+
// PS_TRACED
// PS_INTERRPUTIBLE
// PS_UNINTERRUPTIBLE
// process 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);
asp->res = res;
asp->type = type;
asp->nslots = n;
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)
{
int ptrace = thread->proc->ptrace;
struct mcs_rwlock_node_irqsave lock;
if (ptrace & PT_TRACE_SYSCALL_ENTER) {
int sig = (SIGTRAP | ((ptrace & PTRACE_O_TRACESYSGOOD) ? 0x80 : 0));
ptrace_report_signal(thread, sig);
// TODO(sira): フラグ設定を排他的に行う必要がある!
//?ihk_mc_spinlock_lock_noirq(&thread->proc->lock);
mcs_rwlock_writer_lock(&thread->proc->update_lock, &lock);
if (thread->proc->ptrace & PT_TRACE_SYSCALL_ENTER) {
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;
}
// TODO(sira): 全体的にチェック必要
static int ptrace_report_clone(struct thread *thread, struct thread *new, int event)
{
dkprintf("ptrace_report_clone,enter\n");
int error = 0;
long rc;
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 */
// TODO(sira): フラグ設定を排他的に行う必要がある!
//?ihk_mc_spinlock_lock_noirq(&thread->proc->lock);
mcs_rwlock_writer_lock_noirq(&thread->proc->update_lock, &lock);
thread->proc->exit_status = (SIGTRAP | (event << 8));
/* Transition process state */
thread->proc->pstatus = PS_TRACED;
thread->tstatus = PS_TRACED;
thread->proc->ptrace_eventmsg = new->tid;
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");
if (thread->proc->parent) {
/* kill SIGCHLD */
// このロックは不要と思われる
//?ihk_mc_spinlock_lock_noirq(&thread->proc->parent->lock);
// 条件も不要 必ず親がある
if (thread->proc->parent) {
memset(&info, '\0', sizeof info);
info.si_signo = SIGCHLD;
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);
memset(&info, '\0', sizeof info);
info.si_signo = SIGCHLD;
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), parent_pid, -1, SIGCHLD, &info, 0);
if(rc < 0) {
dkprintf("ptrace_report_clone,do_kill failed\n");
}
/* Wake parent (if sleeping in wait4()) */
waitq_wakeup(&thread->proc->parent->waitpid_q);
if (event != PTRACE_EVENT_VFORK_DONE) {
/* 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 */
// このロックは不要と思われる
//?ihk_mc_spinlock_lock_noirq(&new->proc->lock);
new->proc->ptrace = thread->proc->ptrace;
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);
list_for_each_entry_safe(child, next, &new->proc->parent->children_list, siblings_list) {
if(child == new->proc) {
list_del(&child->siblings_list);
goto found;
}
}
panic("ptrace_report_clone: missing parent-child relationship.");
found:
list_del(&new->proc->siblings_list);
list_add_tail(&new->proc->ptraced_siblings_list, &new->proc->parent->ptraced_children_list);
mcs_rwlock_writer_unlock_noirq(&new->proc->parent->children_lock, &lock);
new->proc->parent = thread->proc->parent; /* new ptracing parent */
/* TODO(sira): 作り直し
ihk_mc_spinlock_lock_noirq(&new->proc->parent->children_lock);
list_add_tail(&new->proc->ptrace_siblings_list, &new->proc->parent->ptrace_children);
ihk_mc_spinlock_unlock_noirq(&new->proc->parent->children_lock);
*/
mcs_rwlock_writer_lock_noirq(&new->proc->parent->children_lock, &lock);
list_add_tail(&new->siblings_list, &new->proc->parent->children_list);
mcs_rwlock_writer_unlock_noirq(&new->proc->parent->children_lock, &lock);
/* trace and SIGSTOP */
new->proc->exit_status = SIGSTOP;
new->proc->pstatus = 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;
@@ -1876,6 +1855,7 @@ unsigned long do_fork(int clone_flags, unsigned long newsp,
/* In a single threaded process TID equals to PID */
settid(new, 0, cpuid, -1);
new->vm->address_space->pids[0] = new->proc->pid;
dkprintf("fork(): new pid: %d\n", new->proc->pid);
/* clear user space PTEs and set new rpgtable so that consequent