[Devel] [PATCH VZ8 v1 14/14] cgroup: relaxed lockdep assertion for cset_cgroup_from_root

Valeriy Vdovin valeriy.vdovin at virtuozzo.com
Wed Jan 20 12:56:30 MSK 2021


Signed-off-by: Valeriy Vdovin <valeriy.vdovin at virtuozzo.com>
---
 kernel/cgroup/cgroup-internal.h |  3 ++-
 kernel/cgroup/cgroup-v1.c       |  3 ++-
 kernel/cgroup/cgroup.c          | 15 +++++++++------
 3 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/kernel/cgroup/cgroup-internal.h b/kernel/cgroup/cgroup-internal.h
index 112bd917e99d..e1ce16e77bb4 100644
--- a/kernel/cgroup/cgroup-internal.h
+++ b/kernel/cgroup/cgroup-internal.h
@@ -161,7 +161,8 @@ static inline bool notify_on_release(const struct cgroup *cgrp)
 }
 
 struct cgroup *cset_cgroup_from_root(struct css_set *cset,
-					    struct cgroup_root *root);
+					    struct cgroup_root *root,
+					    bool assert_locks_strict);
 
 bool cgroup_ssid_enabled(int ssid);
 bool cgroup_on_dfl(const struct cgroup *cgrp);
diff --git a/kernel/cgroup/cgroup-v1.c b/kernel/cgroup/cgroup-v1.c
index 46be2f688503..57d36cf69aea 100644
--- a/kernel/cgroup/cgroup-v1.c
+++ b/kernel/cgroup/cgroup-v1.c
@@ -1022,7 +1022,8 @@ static int cgroup1_show_options(struct seq_file *seq, struct kernfs_root *kf_roo
 				spin_lock_irq(&css_set_lock);
 				cset = ve_ns->cgroup_ns->root_cset;
 				BUG_ON(!cset);
-				root_cgrp = cset_cgroup_from_root(cset, root);
+				root_cgrp = cset_cgroup_from_root(cset, root,
+					false);
 				spin_unlock_irq(&css_set_lock);
 			}
 		}
diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
index 34e049361611..aac04a729535 100644
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -1437,11 +1437,13 @@ current_cgns_cgroup_from_root(struct cgroup_root *root)
 
 /* look up cgroup associated with given css_set on the specified hierarchy */
 struct cgroup *cset_cgroup_from_root(struct css_set *cset,
-					    struct cgroup_root *root)
+					    struct cgroup_root *root,
+					    bool assert_locks_strict)
 {
 	struct cgroup *res = NULL;
 
-	lockdep_assert_held(&cgroup_mutex);
+	if (assert_locks_strict)
+		lockdep_assert_held(&cgroup_mutex);
 	lockdep_assert_held(&css_set_lock);
 
 	if (cset == &init_css_set) {
@@ -1476,7 +1478,7 @@ struct cgroup *task_cgroup_from_root(struct task_struct *task,
 	 * No need to lock the task - since we hold css_set_lock the
 	 * task can't change groups.
 	 */
-	return cset_cgroup_from_root(task_css_set(task), root);
+	return cset_cgroup_from_root(task_css_set(task), root, true);
 }
 
 /*
@@ -2284,7 +2286,7 @@ struct dentry *cgroup_do_mount(struct file_system_type *fs_type, int flags,
 		mutex_lock(&cgroup_mutex);
 		spin_lock_irq(&css_set_lock);
 
-		cgrp = cset_cgroup_from_root(ns->root_cset, root);
+		cgrp = cset_cgroup_from_root(ns->root_cset, root, true);
 
 		spin_unlock_irq(&css_set_lock);
 		mutex_unlock(&cgroup_mutex);
@@ -2380,7 +2382,8 @@ static struct file_system_type cgroup2_fs_type = {
 int cgroup_path_ns_locked(struct cgroup *cgrp, char *buf, size_t buflen,
 			  struct cgroup_namespace *ns)
 {
-	struct cgroup *root = cset_cgroup_from_root(ns->root_cset, cgrp->root);
+	struct cgroup *root = cset_cgroup_from_root(ns->root_cset, cgrp->root,
+		true);
 
 	return kernfs_path_from_node(cgrp->kn, root->kn, buf, buflen);
 }
@@ -2749,7 +2752,7 @@ void cgroup_migrate_add_src(struct css_set *src_cset,
 	if (src_cset->dead)
 		return;
 
-	src_cgrp = cset_cgroup_from_root(src_cset, dst_cgrp->root);
+	src_cgrp = cset_cgroup_from_root(src_cset, dst_cgrp->root, true);
 
 	if (!list_empty(&src_cset->mg_preload_node))
 		return;
-- 
2.27.0



More information about the Devel mailing list