From: Peng Yu <yupeng0921@gmail.com>
To: Christoph Hellwig <hch@lst.de>, Sagi Grimberg <sagi@grimberg.me>,
Chaitanya Kulkarni <kch@nvidia.com>
Cc: "Tejun Heo" <tj@kernel.org>,
"Johannes Weiner" <hannes@cmpxchg.org>,
"Michal Koutný" <mkoutny@suse.com>,
"Josef Bacik" <josef@toxicpanda.com>,
"Jens Axboe" <axboe@kernel.dk>,
"Maurizio Lombardi" <mlombard@arkamax.eu>,
cgroups@vger.kernel.org, linux-block@vger.kernel.org,
linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org,
"Peng Yu" <yupeng0921@gmail.com>
Subject: [PATCH v6 1/3] cgroup: track the effective css in each cgroup
Date: Sun, 27 Sep 2026 23:14:15 -0700 [thread overview]
Message-ID: <20260928061417.1574676-2-yupeng0921@gmail.com> (raw)
In-Reply-To: <20260928061417.1574676-1-yupeng0921@gmail.com>
Track the effective css in each cgroup and make cgroup_e_css() and
cgroup_get_e_css() use it. When a css is brought online or offline,
update the effective css of its cgroup and of all descendants.
Signed-off-by: Peng Yu <yupeng0921@gmail.com>
Assisted-by: Claude:claude-fable-5 [Claude Code]
Assisted-by: Claude:claude-opus-5-5 [Claude Code]
---
include/linux/cgroup-defs.h | 2 ++
kernel/cgroup/cgroup.c | 53 ++++++++++++++++++++++---------------
2 files changed, 34 insertions(+), 21 deletions(-)
diff --git a/include/linux/cgroup-defs.h b/include/linux/cgroup-defs.h
index 3754d697854b..5bbe6025fc77 100644
--- a/include/linux/cgroup-defs.h
+++ b/include/linux/cgroup-defs.h
@@ -555,6 +555,8 @@ struct cgroup {
/* Private pointers for each registered subsystem */
struct cgroup_subsys_state __rcu *subsys[CGROUP_SUBSYS_COUNT];
+ struct cgroup_subsys_state __rcu *e_css[CGROUP_SUBSYS_COUNT];
+
/*
* Keep track of total number of dying CSSes at and below this cgroup.
* Protected by cgroup_mutex.
diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
index 2d532bf2c0c7..69b0f0cf2f3e 100644
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -548,20 +548,11 @@ static struct cgroup_subsys_state *cgroup_e_css_by_mask(struct cgroup *cgrp,
struct cgroup_subsys_state *cgroup_e_css(struct cgroup *cgrp,
struct cgroup_subsys *ss)
{
- struct cgroup_subsys_state *css;
-
if (!CGROUP_HAS_SUBSYS_CONFIG)
return NULL;
- do {
- css = cgroup_css(cgrp, ss);
-
- if (css)
- return css;
- cgrp = cgroup_parent(cgrp);
- } while (cgrp);
-
- return init_css_set.subsys[ss->id];
+ return rcu_dereference_check(cgrp->e_css[ss->id],
+ lockdep_is_held(&cgroup_mutex));
}
/**
@@ -585,17 +576,10 @@ struct cgroup_subsys_state *cgroup_get_e_css(struct cgroup *cgrp,
rcu_read_lock();
- do {
- css = cgroup_css(cgrp, ss);
-
- if (css && css_tryget_online(css))
- goto out_unlock;
- cgrp = cgroup_parent(cgrp);
- } while (cgrp);
+ css = cgroup_e_css(cgrp, ss);
+ while (!css_tryget_online(css))
+ css = cgroup_e_css(cgroup_parent(css->cgroup), ss);
- css = init_css_set.subsys[ss->id];
- css_get(css);
-out_unlock:
rcu_read_unlock();
return css;
}
@@ -2131,12 +2115,17 @@ void init_cgroup_root(struct cgroup_fs_context *ctx)
{
struct cgroup_root *root = ctx->root;
struct cgroup *cgrp = &root->cgrp;
+ struct cgroup_subsys *ss;
+ int ssid;
INIT_LIST_HEAD_RCU(&root->root_list);
atomic_set(&root->nr_cgrps, 1);
cgrp->root = root;
init_cgroup_housekeeping(cgrp);
+ for_each_subsys(ss, ssid)
+ RCU_INIT_POINTER(cgrp->e_css[ssid], init_css_set.subsys[ssid]);
+
/* DYNMODS must be modified through cgroup_favor_dynmods() */
root->flags = ctx->flags & ~CGRP_ROOT_FAVOR_DYNMODS;
if (ctx->release_agent)
@@ -5856,6 +5845,22 @@ static void init_and_link_css(struct cgroup_subsys_state *css,
BUG_ON(cgroup_css(cgrp, ss));
}
+static void cgroup_update_e_css(struct cgroup *cgrp, struct cgroup_subsys *ss)
+{
+ struct cgroup_subsys_state *d_css;
+
+ lockdep_assert_held(&cgroup_mutex);
+
+ css_for_each_descendant_pre(d_css, &cgrp->self) {
+ struct cgroup *dsct = d_css->cgroup;
+ struct cgroup_subsys_state *css = cgroup_css(dsct, ss);
+
+ if (!css)
+ css = cgroup_e_css(cgroup_parent(dsct), ss);
+ rcu_assign_pointer(dsct->e_css[ss->id], css);
+ }
+}
+
/* invoke ->css_online() on a new CSS and mark it online if successful */
static int online_css(struct cgroup_subsys_state *css)
{
@@ -5869,6 +5874,7 @@ static int online_css(struct cgroup_subsys_state *css)
if (!ret) {
css->flags |= CSS_ONLINE;
rcu_assign_pointer(css->cgroup->subsys[ss->id], css);
+ cgroup_update_e_css(css->cgroup, ss);
atomic_inc(&css->online_cnt);
if (css->parent) {
@@ -5895,6 +5901,7 @@ static void offline_css(struct cgroup_subsys_state *css)
css->flags &= ~CSS_ONLINE;
RCU_INIT_POINTER(css->cgroup->subsys[ss->id], NULL);
+ cgroup_update_e_css(css->cgroup, ss);
wake_up_all(&css->cgroup->offline_waitq);
}
@@ -5966,6 +5973,7 @@ static struct cgroup *cgroup_create(struct cgroup *parent, const char *name,
{
struct cgroup_root *root = parent->root;
struct cgroup *cgrp, *tcgrp;
+ struct cgroup_subsys *ss;
struct kernfs_node *kn;
int i, level = parent->level + 1;
int ret;
@@ -6010,6 +6018,9 @@ static struct cgroup *cgroup_create(struct cgroup *parent, const char *name,
for (tcgrp = cgrp; tcgrp; tcgrp = cgroup_parent(tcgrp))
cgrp->ancestors[tcgrp->level] = tcgrp;
+ for_each_subsys(ss, i)
+ RCU_INIT_POINTER(cgrp->e_css[i], cgroup_e_css(parent, ss));
+
/*
* New cgroup inherits effective freeze counter, and
* if the parent has to be frozen, the child has too.
--
2.53.0
next prev parent reply other threads:[~2026-09-28 6:14 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-28 6:14 [PATCH v6 0/3] nvmet: add cgroup_id to charge namespace I/O to a cgroup Peng Yu
2026-09-28 6:14 ` Peng Yu [this message]
2026-09-28 6:14 ` [PATCH v6 2/3] cgroup: export cgroup_e_css() Peng Yu
2026-09-28 6:14 ` [PATCH v6 3/3] nvmet: add cgroup_id to charge namespace I/O to a cgroup Peng Yu
2026-09-28 18:24 ` [PATCH v6 0/3] " Tejun Heo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260928061417.1574676-2-yupeng0921@gmail.com \
--to=yupeng0921@gmail.com \
--cc=axboe@kernel.dk \
--cc=cgroups@vger.kernel.org \
--cc=hannes@cmpxchg.org \
--cc=hch@lst.de \
--cc=josef@toxicpanda.com \
--cc=kch@nvidia.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nvme@lists.infradead.org \
--cc=mkoutny@suse.com \
--cc=mlombard@arkamax.eu \
--cc=sagi@grimberg.me \
--cc=tj@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®