rcu: Fix RCU lockdep splat on freezer_fork path
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Wed, 21 Apr 2010 20:02:08 +0000 (13:02 -0700)
committerIngo Molnar <mingo@elte.hu>
Fri, 30 Apr 2010 10:03:17 +0000 (12:03 +0200)
Add an RCU read-side critical section to suppress this false

Located-by: Eric Paris <eparis@parisplace.org>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Acked-by: Li Zefan <lizf@cn.fujitsu.com>
Cc: laijs@cn.fujitsu.com
Cc: dipankar@in.ibm.com
Cc: mathieu.desnoyers@polymtl.ca
Cc: josh@joshtriplett.org
Cc: dvhltc@us.ibm.com
Cc: niv@us.ibm.com
Cc: peterz@infradead.org
Cc: rostedt@goodmis.org
Cc: Valdis.Kletnieks@vt.edu
Cc: dhowells@redhat.com
Cc: eric.dumazet@gmail.com
LKML-Reference: <1271880131-3951-2-git-send-email-paulmck@linux.vnet.ibm.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>

index da5e139..e5c0244 100644 (file)
@@ -205,9 +205,12 @@ static void freezer_fork(struct cgroup_subsys *ss, struct task_struct *task)
         * No lock is needed, since the task isn't on tasklist yet,
         * so it can't be moved to another cgroup, which means the
         * freezer won't be removed and will be valid during this
-        * function call.
+        * function call.  Nevertheless, apply RCU read-side critical
+        * section to suppress RCU lockdep false positives.
+       rcu_read_lock();
        freezer = task_freezer(task);
+       rcu_read_unlock();
         * The root cgroup is non-freezable, so we can skip the