|
@@ -4843,45 +4843,20 @@ void cgroup_fork(struct task_struct *child)
|
|
|
INIT_LIST_HEAD(&child->cg_list);
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * cgroup_fork_callbacks - run fork callbacks
|
|
|
- * @child: the new task
|
|
|
- *
|
|
|
- * Called on a new task very soon before adding it to the
|
|
|
- * tasklist. No need to take any locks since no-one can
|
|
|
- * be operating on this task.
|
|
|
- */
|
|
|
-void cgroup_fork_callbacks(struct task_struct *child)
|
|
|
-{
|
|
|
- if (need_forkexit_callback) {
|
|
|
- int i;
|
|
|
- for (i = 0; i < CGROUP_SUBSYS_COUNT; i++) {
|
|
|
- struct cgroup_subsys *ss = subsys[i];
|
|
|
-
|
|
|
- /*
|
|
|
- * forkexit callbacks are only supported for
|
|
|
- * builtin subsystems.
|
|
|
- */
|
|
|
- if (!ss || ss->module)
|
|
|
- continue;
|
|
|
-
|
|
|
- if (ss->fork)
|
|
|
- ss->fork(child);
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* cgroup_post_fork - called on a new task after adding it to the task list
|
|
|
* @child: the task in question
|
|
|
*
|
|
|
- * Adds the task to the list running through its css_set if necessary.
|
|
|
- * Has to be after the task is visible on the task list in case we race
|
|
|
- * with the first call to cgroup_iter_start() - to guarantee that the
|
|
|
- * new task ends up on its list.
|
|
|
+ * Adds the task to the list running through its css_set if necessary and
|
|
|
+ * call the subsystem fork() callbacks. Has to be after the task is
|
|
|
+ * visible on the task list in case we race with the first call to
|
|
|
+ * cgroup_iter_start() - to guarantee that the new task ends up on its
|
|
|
+ * list.
|
|
|
*/
|
|
|
void cgroup_post_fork(struct task_struct *child)
|
|
|
{
|
|
|
+ int i;
|
|
|
+
|
|
|
/*
|
|
|
* use_task_css_set_links is set to 1 before we walk the tasklist
|
|
|
* under the tasklist_lock and we read it here after we added the child
|
|
@@ -4910,7 +4885,30 @@ void cgroup_post_fork(struct task_struct *child)
|
|
|
}
|
|
|
write_unlock(&css_set_lock);
|
|
|
}
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Call ss->fork(). This must happen after @child is linked on
|
|
|
+ * css_set; otherwise, @child might change state between ->fork()
|
|
|
+ * and addition to css_set.
|
|
|
+ */
|
|
|
+ if (need_forkexit_callback) {
|
|
|
+ for (i = 0; i < CGROUP_SUBSYS_COUNT; i++) {
|
|
|
+ struct cgroup_subsys *ss = subsys[i];
|
|
|
+
|
|
|
+ /*
|
|
|
+ * fork/exit callbacks are supported only for
|
|
|
+ * builtin subsystems and we don't need further
|
|
|
+ * synchronization as they never go away.
|
|
|
+ */
|
|
|
+ if (!ss || ss->module)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (ss->fork)
|
|
|
+ ss->fork(child);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
/**
|
|
|
* cgroup_exit - detach cgroup from exiting task
|
|
|
* @tsk: pointer to task_struct of exiting process
|