aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/fork.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/fork.c')
-rw-r--r--kernel/fork.c20
1 files changed, 5 insertions, 15 deletions
diff --git a/kernel/fork.c b/kernel/fork.c
index 043b5d88049b..aab8579c6093 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -814,11 +814,8 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk)
814{ 814{
815 struct signal_struct *sig; 815 struct signal_struct *sig;
816 816
817 if (clone_flags & CLONE_THREAD) { 817 if (clone_flags & CLONE_THREAD)
818 atomic_inc(&current->signal->count);
819 atomic_inc(&current->signal->live);
820 return 0; 818 return 0;
821 }
822 819
823 sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL); 820 sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL);
824 tsk->signal = sig; 821 tsk->signal = sig;
@@ -876,16 +873,6 @@ void __cleanup_signal(struct signal_struct *sig)
876 kmem_cache_free(signal_cachep, sig); 873 kmem_cache_free(signal_cachep, sig);
877} 874}
878 875
879static void cleanup_signal(struct task_struct *tsk)
880{
881 struct signal_struct *sig = tsk->signal;
882
883 atomic_dec(&sig->live);
884
885 if (atomic_dec_and_test(&sig->count))
886 __cleanup_signal(sig);
887}
888
889static void copy_flags(unsigned long clone_flags, struct task_struct *p) 876static void copy_flags(unsigned long clone_flags, struct task_struct *p)
890{ 877{
891 unsigned long new_flags = p->flags; 878 unsigned long new_flags = p->flags;
@@ -1238,6 +1225,8 @@ static struct task_struct *copy_process(unsigned long clone_flags,
1238 } 1225 }
1239 1226
1240 if (clone_flags & CLONE_THREAD) { 1227 if (clone_flags & CLONE_THREAD) {
1228 atomic_inc(&current->signal->count);
1229 atomic_inc(&current->signal->live);
1241 p->group_leader = current->group_leader; 1230 p->group_leader = current->group_leader;
1242 list_add_tail_rcu(&p->thread_group, &p->group_leader->thread_group); 1231 list_add_tail_rcu(&p->thread_group, &p->group_leader->thread_group);
1243 } 1232 }
@@ -1281,7 +1270,8 @@ bad_fork_cleanup_mm:
1281 if (p->mm) 1270 if (p->mm)
1282 mmput(p->mm); 1271 mmput(p->mm);
1283bad_fork_cleanup_signal: 1272bad_fork_cleanup_signal:
1284 cleanup_signal(p); 1273 if (!(clone_flags & CLONE_THREAD))
1274 __cleanup_signal(p->signal);
1285bad_fork_cleanup_sighand: 1275bad_fork_cleanup_sighand:
1286 __cleanup_sighand(p->sighand); 1276 __cleanup_sighand(p->sighand);
1287bad_fork_cleanup_fs: 1277bad_fork_cleanup_fs: