[PATCH 2/4] cgroup: Introduce cgroup_level() helper
From: Michal Koutný <mkoutny@suse.com>
Date: 2025-12-17 16:28:05
Also in:
bpf, cgroups, linux-block, lkml, netdev, netfilter-devel
Subsystem:
bfq i/o scheduler, block layer, bpf [general] (safe dynamic programs and tools), control group (cgroup), control group - block io controller (blkio), netfilter, networking [general], the rest, tracing · Maintainers:
Yu Kuai, Jens Axboe, Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko, Eduard Zingerman, Kumar Kartikeya Dwivedi, Tejun Heo, Johannes Weiner, Michal Koutný, Josef Bacik, Pablo Neira Ayuso, Florian Westphal, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds, Steven Rostedt, Masami Hiramatsu
This is a no functional change to hide physical storage of cgroup's level and it allows subesequent conversion of the storage. Signed-off-by: Michal Koutný <mkoutny@suse.com> --- block/bfq-iosched.c | 2 +- block/blk-iocost.c | 4 ++-- include/linux/cgroup.h | 18 +++++++++++++++--- include/trace/events/cgroup.h | 8 ++++---- kernel/bpf/helpers.c | 2 +- kernel/cgroup/cgroup.c | 4 ++-- net/netfilter/nft_socket.c | 2 +- 7 files changed, 26 insertions(+), 14 deletions(-)
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
index 4a8d3d96bfe49..f293bab068274 100644
--- a/block/bfq-iosched.c
+++ b/block/bfq-iosched.c@@ -601,7 +601,7 @@ static bool bfqq_request_over_limit(struct bfq_data *bfqd, goto out; /* +1 for bfqq entity, root cgroup not included */ - depth = bfqg_to_blkg(bfqq_group(bfqq))->blkcg->css.cgroup->level + 1; + depth = cgroup_level(bfqg_to_blkg(bfqq_group(bfqq))->blkcg->css.cgroup) + 1; if (depth > alloc_depth) { spin_unlock_irq(&bfqd->lock); if (entities != inline_entities)
diff --git a/block/blk-iocost.c b/block/blk-iocost.c
index a0416927d33dc..b4eebe61dca7f 100644
--- a/block/blk-iocost.c
+++ b/block/blk-iocost.c@@ -2962,7 +2962,7 @@ static void ioc_cpd_free(struct blkcg_policy_data *cpd) static struct blkg_policy_data *ioc_pd_alloc(struct gendisk *disk, struct blkcg *blkcg, gfp_t gfp) { - int levels = blkcg->css.cgroup->level + 1; + int levels = cgroup_level(blkcg->css.cgroup) + 1; struct ioc_gq *iocg; iocg = kzalloc_node(struct_size(iocg, ancestors, levels), gfp,
@@ -3003,7 +3003,7 @@ static void ioc_pd_init(struct blkg_policy_data *pd) init_waitqueue_head(&iocg->waitq); hrtimer_setup(&iocg->waitq_timer, iocg_waitq_timer_fn, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); - iocg->level = blkg->blkcg->css.cgroup->level; + iocg->level = cgroup_level(blkg->blkcg->css.cgroup) for (tblkg = blkg; tblkg; tblkg = tblkg->parent) { struct ioc_gq *tiocg = blkg_to_iocg(tblkg);
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
index bc892e3b37eea..0290878ebad26 100644
--- a/include/linux/cgroup.h
+++ b/include/linux/cgroup.h@@ -525,6 +525,18 @@ static inline struct cgroup *cgroup_parent(struct cgroup *cgrp) return NULL; } +/** + * cgroup_level - cgroup depth + * @cgrp: cgroup + * + * The depth this cgroup is at. The root is at depth zero and each step down + * the hierarchy increments the level. + */ +static inline int cgroup_level(struct cgroup *cgrp) +{ + return cgrp->level; +} + /** * cgroup_is_descendant - test ancestry * @cgrp: the cgroup to be tested
@@ -537,9 +549,9 @@ static inline struct cgroup *cgroup_parent(struct cgroup *cgrp) static inline bool cgroup_is_descendant(struct cgroup *cgrp, struct cgroup *ancestor) { - if (cgrp->root != ancestor->root || cgrp->level < ancestor->level) + if (cgrp->root != ancestor->root || cgroup_level(cgrp) < cgroup_level(ancestor)) return false; - return cgrp->ancestors[ancestor->level] == ancestor; + return cgrp->ancestors[cgroup_level(ancestor)] == ancestor; } /**
@@ -556,7 +568,7 @@ static inline bool cgroup_is_descendant(struct cgroup *cgrp, static inline struct cgroup *cgroup_ancestor(struct cgroup *cgrp, int ancestor_level) { - if (ancestor_level < 0 || ancestor_level > cgrp->level) + if (ancestor_level < 0 || ancestor_level > cgroup_level(cgrp)) return NULL; return cgrp->ancestors[ancestor_level]; }
diff --git a/include/trace/events/cgroup.h b/include/trace/events/cgroup.h
index ba9229af9a343..0a1bc91754b5e 100644
--- a/include/trace/events/cgroup.h
+++ b/include/trace/events/cgroup.h@@ -67,7 +67,7 @@ DECLARE_EVENT_CLASS(cgroup, TP_fast_assign( __entry->root = cgrp->root->hierarchy_id; __entry->id = cgroup_id(cgrp); - __entry->level = cgrp->level; + __entry->level = cgroup_level(cgrp); __assign_str(path); ),
@@ -136,7 +136,7 @@ DECLARE_EVENT_CLASS(cgroup_migrate, TP_fast_assign( __entry->dst_root = dst_cgrp->root->hierarchy_id; __entry->dst_id = cgroup_id(dst_cgrp); - __entry->dst_level = dst_cgrp->level; + __entry->dst_level = cgroup_level(dst_cgrp); __assign_str(dst_path); __entry->pid = task->pid; __assign_str(comm);
@@ -180,7 +180,7 @@ DECLARE_EVENT_CLASS(cgroup_event, TP_fast_assign( __entry->root = cgrp->root->hierarchy_id; __entry->id = cgroup_id(cgrp); - __entry->level = cgrp->level; + __entry->level = cgroup_level(cgrp); __assign_str(path); __entry->val = val; ),
@@ -221,7 +221,7 @@ DECLARE_EVENT_CLASS(cgroup_rstat, TP_fast_assign( __entry->root = cgrp->root->hierarchy_id; __entry->id = cgroup_id(cgrp); - __entry->level = cgrp->level; + __entry->level = cgroup_level(cgrp); __entry->cpu = cpu; __entry->contended = contended; ),
diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c
index db72b96f9c8c8..b825f6e0a1c29 100644
--- a/kernel/bpf/helpers.c
+++ b/kernel/bpf/helpers.c@@ -2577,7 +2577,7 @@ __bpf_kfunc struct cgroup *bpf_cgroup_ancestor(struct cgroup *cgrp, int level) { struct cgroup *ancestor; - if (level > cgrp->level || level < 0) + if (level > cgroup_level(cgrp) || level < 0) return NULL; /* cgrp's refcnt could be 0 here, but ancestors can still be accessed */
diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
index 554a02ee298ba..e011f1dd6d87f 100644
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c@@ -5843,7 +5843,7 @@ static struct cgroup *cgroup_create(struct cgroup *parent, const char *name, struct cgroup_root *root = parent->root; struct cgroup *cgrp, *tcgrp; struct kernfs_node *kn; - int i, level = parent->level + 1; + int i, level = cgroup_level(parent) + 1; int ret; /* allocate the cgroup and its ID, 0 is reserved for the root */
@@ -5884,7 +5884,7 @@ static struct cgroup *cgroup_create(struct cgroup *parent, const char *name, goto out_stat_exit; for (tcgrp = cgrp; tcgrp; tcgrp = cgroup_parent(tcgrp)) - cgrp->ancestors[tcgrp->level] = tcgrp; + cgrp->ancestors[cgroup_level(tcgrp)] = tcgrp; /* * New cgroup inherits effective freeze counter, and
diff --git a/net/netfilter/nft_socket.c b/net/netfilter/nft_socket.c
index 36affbb697c2f..a5b0340924efb 100644
--- a/net/netfilter/nft_socket.c
+++ b/net/netfilter/nft_socket.c@@ -64,7 +64,7 @@ static noinline int nft_socket_cgroup_subtree_level(void) if (IS_ERR(cgrp)) return PTR_ERR(cgrp); - level = cgrp->level; + level = cgroup_level(cgrp); cgroup_put(cgrp);
--
2.52.0