|
@@ -1553,6 +1553,18 @@ static __latent_entropy struct task_struct *copy_process(
|
|
|
if (!p)
|
|
|
goto fork_out;
|
|
|
|
|
|
+ /*
|
|
|
+ * This _must_ happen before we call free_task(), i.e. before we jump
|
|
|
+ * to any of the bad_fork_* labels. This is to avoid freeing
|
|
|
+ * p->set_child_tid which is (ab)used as a kthread's data pointer for
|
|
|
+ * kernel threads (PF_KTHREAD).
|
|
|
+ */
|
|
|
+ p->set_child_tid = (clone_flags & CLONE_CHILD_SETTID) ? child_tidptr : NULL;
|
|
|
+ /*
|
|
|
+ * Clear TID on mm_release()?
|
|
|
+ */
|
|
|
+ p->clear_child_tid = (clone_flags & CLONE_CHILD_CLEARTID) ? child_tidptr : NULL;
|
|
|
+
|
|
|
ftrace_graph_init_task(p);
|
|
|
|
|
|
rt_mutex_init_task(p);
|
|
@@ -1716,11 +1728,6 @@ static __latent_entropy struct task_struct *copy_process(
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- p->set_child_tid = (clone_flags & CLONE_CHILD_SETTID) ? child_tidptr : NULL;
|
|
|
- /*
|
|
|
- * Clear TID on mm_release()?
|
|
|
- */
|
|
|
- p->clear_child_tid = (clone_flags & CLONE_CHILD_CLEARTID) ? child_tidptr : NULL;
|
|
|
#ifdef CONFIG_BLOCK
|
|
|
p->plug = NULL;
|
|
|
#endif
|