diff options
Diffstat (limited to 'kernel/fork.c')
-rw-r--r-- | kernel/fork.c | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index 29b532e718f7..021e1138556e 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -568,18 +568,18 @@ void mm_release(struct task_struct *tsk, struct mm_struct *mm) | |||
568 | * the value intact in a core dump, and to save the unnecessary | 568 | * the value intact in a core dump, and to save the unnecessary |
569 | * trouble otherwise. Userland only wants this done for a sys_exit. | 569 | * trouble otherwise. Userland only wants this done for a sys_exit. |
570 | */ | 570 | */ |
571 | if (tsk->clear_child_tid | 571 | if (tsk->clear_child_tid) { |
572 | && !(tsk->flags & PF_SIGNALED) | 572 | if (!(tsk->flags & PF_SIGNALED) && |
573 | && atomic_read(&mm->mm_users) > 1) { | 573 | atomic_read(&mm->mm_users) > 1) { |
574 | u32 __user * tidptr = tsk->clear_child_tid; | 574 | /* |
575 | * We don't check the error code - if userspace has | ||
576 | * not set up a proper pointer then tough luck. | ||
577 | */ | ||
578 | put_user(0, tsk->clear_child_tid); | ||
579 | sys_futex(tsk->clear_child_tid, FUTEX_WAKE, | ||
580 | 1, NULL, NULL, 0); | ||
581 | } | ||
575 | tsk->clear_child_tid = NULL; | 582 | tsk->clear_child_tid = NULL; |
576 | |||
577 | /* | ||
578 | * We don't check the error code - if userspace has | ||
579 | * not set up a proper pointer then tough luck. | ||
580 | */ | ||
581 | put_user(0, tidptr); | ||
582 | sys_futex(tidptr, FUTEX_WAKE, 1, NULL, NULL, 0); | ||
583 | } | 583 | } |
584 | } | 584 | } |
585 | 585 | ||
@@ -1269,6 +1269,7 @@ static struct task_struct *copy_process(unsigned long clone_flags, | |||
1269 | write_unlock_irq(&tasklist_lock); | 1269 | write_unlock_irq(&tasklist_lock); |
1270 | proc_fork_connector(p); | 1270 | proc_fork_connector(p); |
1271 | cgroup_post_fork(p); | 1271 | cgroup_post_fork(p); |
1272 | perf_counter_fork(p); | ||
1272 | return p; | 1273 | return p; |
1273 | 1274 | ||
1274 | bad_fork_free_pid: | 1275 | bad_fork_free_pid: |
@@ -1410,9 +1411,6 @@ long do_fork(unsigned long clone_flags, | |||
1410 | init_completion(&vfork); | 1411 | init_completion(&vfork); |
1411 | } | 1412 | } |
1412 | 1413 | ||
1413 | if (!(clone_flags & CLONE_THREAD)) | ||
1414 | perf_counter_fork(p); | ||
1415 | |||
1416 | audit_finish_fork(p); | 1414 | audit_finish_fork(p); |
1417 | tracehook_report_clone(regs, clone_flags, nr, p); | 1415 | tracehook_report_clone(regs, clone_flags, nr, p); |
1418 | 1416 | ||