[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250722014030.297537-3-inwardvessel@gmail.com>
Date: Mon, 21 Jul 2025 18:40:27 -0700
From: JP Kobryn <inwardvessel@...il.com>
To: tj@...nel.org,
shakeel.butt@...ux.dev,
mkoutny@...e.com,
yosryahmed@...gle.com,
hannes@...xchg.org,
akpm@...ux-foundation.org
Cc: linux-kernel@...r.kernel.org,
cgroups@...r.kernel.org,
kernel-team@...a.com
Subject: [PATCH 2/5 cgroup/for-6.16-fixes] cgroup: check for rstat flush callback at css rstat init/exit call sites
The css rstat init/exit functions have a dependency on the associated
subsystem which is inspected to see if the flush callback exists. Move this
logic out of these functions and instead let callers perform this check in
advance. This decoupling allows greater flexibility in where
css_rstat_init() may be called.
Signed-off-by: JP Kobryn <inwardvessel@...il.com>
---
kernel/cgroup/cgroup.c | 18 ++++++++++++------
kernel/cgroup/rstat.c | 6 +-----
2 files changed, 13 insertions(+), 11 deletions(-)
diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
index d684d33236b8..b034f47580f6 100644
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -5452,7 +5452,9 @@ static void css_free_rwork_fn(struct work_struct *work)
struct cgroup_subsys_state *parent = css->parent;
int id = css->id;
- css_rstat_exit(css);
+ if (ss->css_rstat_flush)
+ css_rstat_exit(css);
+
ss->css_free(css);
cgroup_idr_remove(&ss->css_idr, id);
cgroup_put(cgrp);
@@ -5679,9 +5681,11 @@ static struct cgroup_subsys_state *css_create(struct cgroup *cgrp,
goto err_free_css;
css->id = err;
- err = css_rstat_init(css);
- if (err)
- goto err_free_css;
+ if (ss->css_rstat_flush) {
+ err = css_rstat_init(css);
+ if (err)
+ goto err_free_css;
+ }
/* @css is ready to be brought online now, make it visible */
list_add_tail_rcu(&css->sibling, &parent_css->children);
@@ -6141,8 +6145,10 @@ static void __init cgroup_init_subsys(struct cgroup_subsys *ss, bool early)
css->id = cgroup_idr_alloc(&ss->css_idr, css, 1, 2, GFP_KERNEL);
BUG_ON(css->id < 0);
- BUG_ON(ss_rstat_init(ss));
- BUG_ON(css_rstat_init(css));
+ if (ss->css_rstat_flush) {
+ BUG_ON(ss_rstat_init(ss));
+ BUG_ON(css_rstat_init(css));
+ }
}
/* Update the init_css_set to contain a subsys
diff --git a/kernel/cgroup/rstat.c b/kernel/cgroup/rstat.c
index 8c3cb4a989ad..ba656a53136a 100644
--- a/kernel/cgroup/rstat.c
+++ b/kernel/cgroup/rstat.c
@@ -449,8 +449,7 @@ static int __css_rstat_init(struct cgroup_subsys_state *css, bool is_self)
if (!cgrp->rstat_base_cpu)
return -ENOMEM;
}
- } else if (css->ss->css_rstat_flush == NULL)
- return 0;
+ }
/* the root cgrp's self css has rstat_cpu preallocated */
if (!css->rstat_cpu) {
@@ -484,9 +483,6 @@ static void __css_rstat_exit(struct cgroup_subsys_state *css, bool is_self)
{
int cpu;
- if (!css_uses_rstat(css))
- return;
-
css_rstat_flush(css);
/* sanity check */
--
2.47.1
Powered by blists - more mailing lists