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 | ||
