aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/fork.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/fork.c')
-rw-r--r--kernel/fork.c32
1 files changed, 8 insertions, 24 deletions
diff --git a/kernel/fork.c b/kernel/fork.c
index 021e1138556e..bfee931ee3fb 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -152,8 +152,7 @@ void __put_task_struct(struct task_struct *tsk)
152 WARN_ON(atomic_read(&tsk->usage)); 152 WARN_ON(atomic_read(&tsk->usage));
153 WARN_ON(tsk == current); 153 WARN_ON(tsk == current);
154 154
155 put_cred(tsk->real_cred); 155 exit_creds(tsk);
156 put_cred(tsk->cred);
157 delayacct_tsk_free(tsk); 156 delayacct_tsk_free(tsk);
158 157
159 if (!profile_handoff_task(tsk)) 158 if (!profile_handoff_task(tsk))
@@ -426,7 +425,6 @@ static struct mm_struct * mm_init(struct mm_struct * mm, struct task_struct *p)
426 init_rwsem(&mm->mmap_sem); 425 init_rwsem(&mm->mmap_sem);
427 INIT_LIST_HEAD(&mm->mmlist); 426 INIT_LIST_HEAD(&mm->mmlist);
428 mm->flags = (current->mm) ? current->mm->flags : default_dump_filter; 427 mm->flags = (current->mm) ? current->mm->flags : default_dump_filter;
429 mm->oom_adj = (current->mm) ? current->mm->oom_adj : 0;
430 mm->core_state = NULL; 428 mm->core_state = NULL;
431 mm->nr_ptes = 0; 429 mm->nr_ptes = 0;
432 set_mm_counter(mm, file_rss, 0); 430 set_mm_counter(mm, file_rss, 0);
@@ -816,11 +814,8 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk)
816{ 814{
817 struct signal_struct *sig; 815 struct signal_struct *sig;
818 816
819 if (clone_flags & CLONE_THREAD) { 817 if (clone_flags & CLONE_THREAD)
820 atomic_inc(&current->signal->count);
821 atomic_inc(&current->signal->live);
822 return 0; 818 return 0;
823 }
824 819
825 sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL); 820 sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL);
826 tsk->signal = sig; 821 tsk->signal = sig;
@@ -878,16 +873,6 @@ void __cleanup_signal(struct signal_struct *sig)
878 kmem_cache_free(signal_cachep, sig); 873 kmem_cache_free(signal_cachep, sig);
879} 874}
880 875
881static void cleanup_signal(struct task_struct *tsk)
882{
883 struct signal_struct *sig = tsk->signal;
884
885 atomic_dec(&sig->live);
886
887 if (atomic_dec_and_test(&sig->count))
888 __cleanup_signal(sig);
889}
890
891static void copy_flags(unsigned long clone_flags, struct task_struct *p) 876static void copy_flags(unsigned long clone_flags, struct task_struct *p)
892{ 877{
893 unsigned long new_flags = p->flags; 878 unsigned long new_flags = p->flags;
@@ -1022,10 +1007,7 @@ static struct task_struct *copy_process(unsigned long clone_flags,
1022 copy_flags(clone_flags, p); 1007 copy_flags(clone_flags, p);
1023 INIT_LIST_HEAD(&p->children); 1008 INIT_LIST_HEAD(&p->children);
1024 INIT_LIST_HEAD(&p->sibling); 1009 INIT_LIST_HEAD(&p->sibling);
1025#ifdef CONFIG_PREEMPT_RCU 1010 rcu_copy_process(p);
1026 p->rcu_read_lock_nesting = 0;
1027 p->rcu_flipctr_idx = 0;
1028#endif /* #ifdef CONFIG_PREEMPT_RCU */
1029 p->vfork_done = NULL; 1011 p->vfork_done = NULL;
1030 spin_lock_init(&p->alloc_lock); 1012 spin_lock_init(&p->alloc_lock);
1031 1013
@@ -1240,6 +1222,8 @@ static struct task_struct *copy_process(unsigned long clone_flags,
1240 } 1222 }
1241 1223
1242 if (clone_flags & CLONE_THREAD) { 1224 if (clone_flags & CLONE_THREAD) {
1225 atomic_inc(&current->signal->count);
1226 atomic_inc(&current->signal->live);
1243 p->group_leader = current->group_leader; 1227 p->group_leader = current->group_leader;
1244 list_add_tail_rcu(&p->thread_group, &p->group_leader->thread_group); 1228 list_add_tail_rcu(&p->thread_group, &p->group_leader->thread_group);
1245 } 1229 }
@@ -1283,7 +1267,8 @@ bad_fork_cleanup_mm:
1283 if (p->mm) 1267 if (p->mm)
1284 mmput(p->mm); 1268 mmput(p->mm);
1285bad_fork_cleanup_signal: 1269bad_fork_cleanup_signal:
1286 cleanup_signal(p); 1270 if (!(clone_flags & CLONE_THREAD))
1271 __cleanup_signal(p->signal);
1287bad_fork_cleanup_sighand: 1272bad_fork_cleanup_sighand:
1288 __cleanup_sighand(p->sighand); 1273 __cleanup_sighand(p->sighand);
1289bad_fork_cleanup_fs: 1274bad_fork_cleanup_fs:
@@ -1308,8 +1293,7 @@ bad_fork_cleanup_put_domain:
1308 module_put(task_thread_info(p)->exec_domain->module); 1293 module_put(task_thread_info(p)->exec_domain->module);
1309bad_fork_cleanup_count: 1294bad_fork_cleanup_count:
1310 atomic_dec(&p->cred->user->processes); 1295 atomic_dec(&p->cred->user->processes);
1311 put_cred(p->real_cred); 1296 exit_creds(p);
1312 put_cred(p->cred);
1313bad_fork_free: 1297bad_fork_free:
1314 free_task(p); 1298 free_task(p);
1315fork_out: 1299fork_out: