Skip to content

Commit 7bd8830

Browse files
ebiedermhtejun
authored andcommitted
cgroupns: Fix the locking in copy_cgroup_ns
If "clone(CLONE_NEWCGROUP...)" is called it results in a nice lockdep valid splat. In __cgroup_proc_write the lock ordering is: cgroup_mutex -- through cgroup_kn_lock_live cgroup_threadgroup_rwsem In copy_process the guts of clone the lock ordering is: cgroup_threadgroup_rwsem -- through threadgroup_change_begin cgroup_mutex -- through copy_namespaces -- copy_cgroup_ns lockdep reports some a different call chains for the first ordering of cgroup_mutex and cgroup_threadgroup_rwsem but it is harder to trace. This is most definitely deadlock potential under the right circumstances. Fix this by by skipping the cgroup_mutex and making the locking in copy_cgroup_ns mirror the locking in cgroup_post_fork which also runs during fork under the cgroup_threadgroup_rwsem. Cc: stable@vger.kernel.org Fixes: a79a908 ("cgroup: introduce cgroup namespaces") Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com> Signed-off-by: Tejun Heo <tj@kernel.org>
1 parent 82d6489 commit 7bd8830

File tree

1 file changed

+1
-4
lines changed

1 file changed

+1
-4
lines changed

kernel/cgroup.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6309,14 +6309,11 @@ struct cgroup_namespace *copy_cgroup_ns(unsigned long flags,
63096309
if (!ns_capable(user_ns, CAP_SYS_ADMIN))
63106310
return ERR_PTR(-EPERM);
63116311

6312-
mutex_lock(&cgroup_mutex);
6312+
/* It is not safe to take cgroup_mutex here */
63136313
spin_lock_irq(&css_set_lock);
6314-
63156314
cset = task_css_set(current);
63166315
get_css_set(cset);
6317-
63186316
spin_unlock_irq(&css_set_lock);
6319-
mutex_unlock(&cgroup_mutex);
63206317

63216318
new_ns = alloc_cgroup_ns();
63226319
if (IS_ERR(new_ns)) {

0 commit comments

Comments
 (0)