|
@@ -1798,13 +1798,6 @@ static void cgroup_enable_task_cg_lists(void)
|
|
|
{
|
|
|
struct task_struct *p, *g;
|
|
|
|
|
|
- spin_lock_irq(&css_set_lock);
|
|
|
-
|
|
|
- if (use_task_css_set_links)
|
|
|
- goto out_unlock;
|
|
|
-
|
|
|
- use_task_css_set_links = true;
|
|
|
-
|
|
|
/*
|
|
|
* We need tasklist_lock because RCU is not safe against
|
|
|
* while_each_thread(). Besides, a forking task that has passed
|
|
@@ -1813,6 +1806,13 @@ static void cgroup_enable_task_cg_lists(void)
|
|
|
* tasklist if we walk through it with RCU.
|
|
|
*/
|
|
|
read_lock(&tasklist_lock);
|
|
|
+ spin_lock_irq(&css_set_lock);
|
|
|
+
|
|
|
+ if (use_task_css_set_links)
|
|
|
+ goto out_unlock;
|
|
|
+
|
|
|
+ use_task_css_set_links = true;
|
|
|
+
|
|
|
do_each_thread(g, p) {
|
|
|
WARN_ON_ONCE(!list_empty(&p->cg_list) ||
|
|
|
task_css_set(p) != &init_css_set);
|
|
@@ -1840,9 +1840,9 @@ static void cgroup_enable_task_cg_lists(void)
|
|
|
}
|
|
|
spin_unlock(&p->sighand->siglock);
|
|
|
} while_each_thread(g, p);
|
|
|
- read_unlock(&tasklist_lock);
|
|
|
out_unlock:
|
|
|
spin_unlock_irq(&css_set_lock);
|
|
|
+ read_unlock(&tasklist_lock);
|
|
|
}
|
|
|
|
|
|
static void init_cgroup_housekeeping(struct cgroup *cgrp)
|