diff options
author | Tejun Heo <tj@kernel.org> | 2018-04-26 23:29:05 +0200 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2018-04-26 23:29:05 +0200 |
commit | 8f53470bab04229e93ff9e4c20338cc08b42b344 (patch) | |
tree | 8ab616e9b6ee8b2affcbe88278961d5e8bdc7eb3 /kernel/cgroup/rstat.c | |
parent | cgroup: Replace cgroup_rstat_mutex with a spinlock (diff) | |
download | linux-8f53470bab04229e93ff9e4c20338cc08b42b344.tar.xz linux-8f53470bab04229e93ff9e4c20338cc08b42b344.zip |
cgroup: Add cgroup_subsys->css_rstat_flush()
This patch adds cgroup_subsys->css_rstat_flush(). If a subsystem has
this callback, its csses are linked on cgrp->css_rstat_list and rstat
will call the function whenever the associated cgroup is flushed.
Flush is also performed when such csses are released so that residual
counts aren't lost.
Combined with the rstat API previous patches factored out, this allows
controllers to plug into rstat to manage their statistics in a
scalable way.
Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'kernel/cgroup/rstat.c')
-rw-r--r-- | kernel/cgroup/rstat.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/kernel/cgroup/rstat.c b/kernel/cgroup/rstat.c index 3386fb251a9e..339366e257d4 100644 --- a/kernel/cgroup/rstat.c +++ b/kernel/cgroup/rstat.c @@ -145,8 +145,17 @@ static void cgroup_rstat_flush_locked(struct cgroup *cgrp, bool may_sleep) struct cgroup *pos = NULL; raw_spin_lock(cpu_lock); - while ((pos = cgroup_rstat_cpu_pop_updated(pos, cgrp, cpu))) + while ((pos = cgroup_rstat_cpu_pop_updated(pos, cgrp, cpu))) { + struct cgroup_subsys_state *css; + cgroup_base_stat_flush(pos, cpu); + + rcu_read_lock(); + list_for_each_entry_rcu(css, &pos->rstat_css_list, + rstat_css_node) + css->ss->css_rstat_flush(css, cpu); + rcu_read_unlock(); + } raw_spin_unlock(cpu_lock); /* if @may_sleep, play nice and yield if necessary */ |