[Devel] [PATCH RH9 4/6] cgroup: split cgroup_get_ve_root1 into css and cgroup version

Pavel Tikhomirov ptikhomirov at virtuozzo.com
Tue Oct 12 19:22:07 MSK 2021


In vz8 we had css_local_root, cgroup_get_local_root and
cgroup_get_ve_root1 all doing the same thing, let's reuse code.

There is no more implicit ve0 fallback here, caller shoudl handle NULL
retcode now.

Rename cgroup_get_ve_root1 to cgroup_ve_root1.

https://jira.sw.ru/browse/PSBM-134002
Signed-off-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
---
 include/linux/ve.h     | 12 ++++++++++--
 kernel/cgroup/cgroup.c | 35 ++++++++++++++++++++++++-----------
 kernel/sched/cpuacct.c |  6 +++---
 3 files changed, 37 insertions(+), 16 deletions(-)

diff --git a/include/linux/ve.h b/include/linux/ve.h
index e8514c5a0afb..d3499853e6dd 100644
--- a/include/linux/ve.h
+++ b/include/linux/ve.h
@@ -180,7 +180,9 @@ extern void vtty_release(struct tty_struct *tty, struct tty_struct *o_tty,
 extern bool vtty_is_master(struct tty_struct *tty);
 #endif /* CONFIG_TTY */
 
-extern struct cgroup *cgroup_get_ve_root1(struct cgroup *cgrp);
+extern struct cgroup *cgroup_ve_root1(struct cgroup *cgrp);
+extern struct cgroup_subsys_state *css_ve_root1(
+		struct cgroup_subsys_state *css);
 
 #define ve_uevent_seqnum       (get_exec_env()->_uevent_seqnum)
 
@@ -210,10 +212,16 @@ static inline struct user_namespace *ve_init_user_ns(void)
 	return &init_user_ns;
 }
 
-static inline struct cgroup *cgroup_get_ve_root1(struct cgroup *cgrp)
+static inline struct cgroup *cgroup_ve_root1(struct cgroup *cgrp)
 {
 	return NULL;
 }
+static inline struct cgroup_subsys_state *css_ve_root1(
+		struct cgroup_subsys_state *css)
+{
+	return NULL;
+}
+
 #define ve_uevent_seqnum uevent_seqnum
 
 static inline int vz_security_family_check(struct net *net, int family, int type) { return 0; }
diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
index 06f0906a5ea5..c7435500a352 100644
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -315,7 +315,7 @@ struct ve_struct *cgroup_ve_owner(struct cgroup *cgrp)
 	struct ve_struct *ve = NULL;
 	struct cgroup *ve_root;
 
-	ve_root = cgroup_get_ve_root1(cgrp);
+	ve_root = cgroup_ve_root1(cgrp);
 	if (ve_root)
 		ve = rcu_dereference(ve_root->ve_owner);
 	return ve;
@@ -2020,7 +2020,7 @@ static inline bool ve_check_root_cgroups(struct css_set *cset)
 			return true;
 
 		/* Nested CGRP_VE_ROOT not allowed */
-		if (cgroup_get_ve_root1(link->cgrp))
+		if (cgroup_ve_root1(link->cgrp))
 			return true;
 	}
 	return false;
@@ -2094,27 +2094,40 @@ void cgroup_unmark_ve_roots(struct ve_struct *ve)
 	synchronize_rcu();
 }
 
-struct cgroup *cgroup_get_ve_root1(struct cgroup *cgrp)
+struct cgroup_subsys_state *css_ve_root1(struct cgroup_subsys_state *css)
 {
-	struct cgroup *ve_root = NULL;
-
-	do {
-		if (test_bit(CGRP_VE_ROOT, &cgrp->flags)) {
-			ve_root = cgrp;
+	struct cgroup_subsys_state *ve_root = NULL;
+	/*
+	 * Find css for nearest ancestor cgroup marked with CGRP_VE_ROOT
+	 */
+	while (css) {
+		if (test_bit(CGRP_VE_ROOT, &css->cgroup->flags)) {
+			ve_root = css;
 			break;
 		}
-		cgrp = cgroup_parent(cgrp);
-	} while (cgrp);
+		css = css->parent;
+	}
 
 	return ve_root;
 }
 
+struct cgroup *cgroup_ve_root1(struct cgroup *cgrp)
+{
+	struct cgroup_subsys_state *css = &cgrp->self;
+
+	css = css_ve_root1(css);
+	if (!css)
+		return NULL;
+
+	return container_of(css, struct cgroup, self);
+}
+
 static bool subgroup_limit_reached(struct cgroup *cgroup)
 {
 	struct cgroup *ve_root;
 	bool ret = false;
 
-	ve_root = cgroup_get_ve_root1(cgroup);
+	ve_root = cgroup_ve_root1(cgroup);
 	if (ve_root && ve_root->subgroups_limit > 0 &&
 	    ve_root->nr_descendants >= ve_root->subgroups_limit)
 		ret = true;
diff --git a/kernel/sched/cpuacct.c b/kernel/sched/cpuacct.c
index 489211d78f84..021a0e9cdafa 100644
--- a/kernel/sched/cpuacct.c
+++ b/kernel/sched/cpuacct.c
@@ -380,13 +380,13 @@ struct cgroup_subsys cpuacct_cgrp_subsys = {
 extern struct task_group *css_tg(struct cgroup_subsys_state *css);
 
 static struct task_group *ve_root_tg(struct task_group *tg) {
-	struct cgroup *cg;
+	struct cgroup_subsys_state *css;
 
 	if (!tg)
 		return NULL;
 
-	cg = cgroup_get_ve_root1(tg->css.cgroup);
-	return cg ? css_tg(&cg->self) : NULL;
+	css = css_ve_root1(&tg->css);
+	return css ? css_tg(css) : NULL;
 }
 
 unsigned int tg_cpu_rate(struct task_group *tg)
-- 
2.31.1



More information about the Devel mailing list