clone(): support for handling CLONE_SIGHAND and CLONE_VM flags separately
This commit is contained in:
committed by
Balazs Gerofi bgerofi@riken.jp
parent
86f2a9067b
commit
8909597499
@ -245,14 +245,10 @@ struct process *clone_process(struct process *org, unsigned long pc,
|
||||
|
||||
proc->ftn->termsig = termsig;
|
||||
|
||||
init_fork_tree_node(proc->ftn, (clone_flags & CLONE_VM) ? NULL : org->ftn,
|
||||
proc);
|
||||
|
||||
/* clone() */
|
||||
if (clone_flags & CLONE_VM) {
|
||||
ihk_atomic_inc(&org->vm->refcount);
|
||||
proc->vm = org->vm;
|
||||
init_fork_tree_node(proc->ftn, org->ftn, proc);
|
||||
|
||||
/* clone signal handlers */
|
||||
if (clone_flags & CLONE_SIGHAND) {
|
||||
proc->sigstack.ss_sp = NULL;
|
||||
proc->sigstack.ss_flags = SS_DISABLE;
|
||||
proc->sigstack.ss_size = 0;
|
||||
@ -266,7 +262,7 @@ struct process *clone_process(struct process *org, unsigned long pc,
|
||||
ihk_mc_spinlock_init(&proc->sigpendinglock);
|
||||
INIT_LIST_HEAD(&proc->sigpending);
|
||||
}
|
||||
/* fork() */
|
||||
/* copy signal handlers (i.e., fork()) */
|
||||
else {
|
||||
dkprintf("fork(): sighandler\n");
|
||||
proc->sighandler = kmalloc(sizeof(struct sig_handler),
|
||||
@ -291,7 +287,15 @@ struct process *clone_process(struct process *org, unsigned long pc,
|
||||
INIT_LIST_HEAD(&proc->sigshared->sigpending);
|
||||
ihk_mc_spinlock_init(&proc->sigpendinglock);
|
||||
INIT_LIST_HEAD(&proc->sigpending);
|
||||
}
|
||||
|
||||
/* clone VM */
|
||||
if (clone_flags & CLONE_VM) {
|
||||
ihk_atomic_inc(&org->vm->refcount);
|
||||
proc->vm = org->vm;
|
||||
}
|
||||
/* fork() */
|
||||
else {
|
||||
proc->vm = (struct process_vm *)(proc + 1);
|
||||
|
||||
dkprintf("fork(): init_process_vm()\n");
|
||||
@ -309,8 +313,9 @@ struct process *clone_process(struct process *org, unsigned long pc,
|
||||
}
|
||||
|
||||
dkprintf("fork(): copy_user_ranges() OK\n");
|
||||
}
|
||||
|
||||
/* Add proc's fork_tree_node to parent's children list */
|
||||
/* Add thread/proc's fork_tree_node to parent's children list */
|
||||
ihk_mc_spinlock_lock_noirq(&org->ftn->lock);
|
||||
list_add_tail(&proc->ftn->siblings_list, &org->ftn->children);
|
||||
ihk_mc_spinlock_unlock_noirq(&org->ftn->lock);
|
||||
@ -320,7 +325,6 @@ struct process *clone_process(struct process *org, unsigned long pc,
|
||||
|
||||
/* Parent holds a reference to us */
|
||||
hold_fork_tree_node(proc->ftn);
|
||||
}
|
||||
|
||||
ihk_mc_spinlock_init(&proc->spin_sleep_lock);
|
||||
proc->spin_sleep = 0;
|
||||
|
||||
Reference in New Issue
Block a user