cpuset: rcu_read_lock() to protect task_cs()
authorLai Jiangshan <[email protected]>
Thu, 8 Jan 2009 02:08:39 +0000 (18:08 -0800)
committerLinus Torvalds <[email protected]>
Thu, 8 Jan 2009 16:31:11 +0000 (08:31 -0800)
task_cs() calls task_subsys_state().

We must use rcu_read_lock() to protect cgroup_subsys_state().

It's correct that top_cpuset is never freed, but cgroup_subsys_state()
accesses css_set, this css_set maybe freed when task_cs() called.

We use use rcu_read_lock() to protect it.

Signed-off-by: Lai Jiangshan <[email protected]>
Acked-by: Paul Menage <[email protected]>
Cc: KAMEZAWA Hiroyuki <[email protected]>
Cc: Pavel Emelyanov <[email protected]>
Cc: Balbir Singh <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
kernel/cpuset.c

index 345ace5117de9ebfdd886e1a959e4b01eefb2374..a841b5c01ef9488c12215252085cd1c94c0948d5 100644 (file)
@@ -375,14 +375,9 @@ void cpuset_update_task_memory_state(void)
        struct task_struct *tsk = current;
        struct cpuset *cs;
 
-       if (task_cs(tsk) == &top_cpuset) {
-               /* Don't need rcu for top_cpuset.  It's never freed. */
-               my_cpusets_mem_gen = top_cpuset.mems_generation;
-       } else {
-               rcu_read_lock();
-               my_cpusets_mem_gen = task_cs(tsk)->mems_generation;
-               rcu_read_unlock();
-       }
+       rcu_read_lock();
+       my_cpusets_mem_gen = task_cs(tsk)->mems_generation;
+       rcu_read_unlock();
 
        if (my_cpusets_mem_gen != tsk->cpuset_mems_generation) {
                mutex_lock(&callback_mutex);