fork: call complete_vfork_done() after clearing child_tid and flushing rss-counters
Child should wake up the parent from vfork() only after finishing all operations with shared mm. There is no sense in using CLONE_CHILD_CLEARTID together with CLONE_VFORK, but it looks more accurate now. Signed-off-by: Konstantin Khlebnikov <khlebnikov@openvz.org> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Hugh Dickins <hughd@google.com> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Konstantin Khlebnikov <khlebnikov@openvz.org> Cc: Markus Trippelsdorf <markus@trippelsdorf.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
bca1554373
commit
f7505d64f2
1 changed files with 7 additions and 3 deletions
|
@ -787,9 +787,6 @@ void mm_release(struct task_struct *tsk, struct mm_struct *mm)
|
|||
/* Get rid of any cached register state */
|
||||
deactivate_mm(tsk, mm);
|
||||
|
||||
if (tsk->vfork_done)
|
||||
complete_vfork_done(tsk);
|
||||
|
||||
/*
|
||||
* If we're exiting normally, clear a user-space tid field if
|
||||
* requested. We leave this alone when dying by signal, to leave
|
||||
|
@ -810,6 +807,13 @@ void mm_release(struct task_struct *tsk, struct mm_struct *mm)
|
|||
}
|
||||
tsk->clear_child_tid = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* All done, finally we can wake up parent and return this mm to him.
|
||||
* Also kthread_stop() uses this completion for synchronization.
|
||||
*/
|
||||
if (tsk->vfork_done)
|
||||
complete_vfork_done(tsk);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in a new issue