Commit d41bf8c9 authored by Tejun Heo's avatar Tejun Heo

cgroup, sched: Move basic cpu stats from cgroup.stat to cpu.stat

The basic cpu stat is currently shown with "cpu." prefix in
cgroup.stat, and the same information is duplicated in cpu.stat when
cpu controller is enabled.  This is ugly and not very scalable as we
want to expand the coverage of stat information which is always
available.

This patch makes cgroup core always create "cpu.stat" file and show
the basic cpu stat there and calls the cpu controller to show the
extra stats when enabled.  This ensures that the same information
isn't presented in multiple places and makes future expansion of basic
stats easier.
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
parent 0d593634
...@@ -886,15 +886,6 @@ All cgroup core files are prefixed with "cgroup." ...@@ -886,15 +886,6 @@ All cgroup core files are prefixed with "cgroup."
A dying cgroup can consume system resources not exceeding A dying cgroup can consume system resources not exceeding
limits, which were active at the moment of cgroup deletion. limits, which were active at the moment of cgroup deletion.
cpu.usage_usec
CPU time consumed in the subtree.
cpu.user_usec
User CPU time consumed in the subtree.
cpu.system_usec
System CPU time consumed in the subtree.
Controllers Controllers
=========== ===========
...@@ -915,12 +906,16 @@ All time durations are in microseconds. ...@@ -915,12 +906,16 @@ All time durations are in microseconds.
cpu.stat cpu.stat
A read-only flat-keyed file which exists on non-root cgroups. A read-only flat-keyed file which exists on non-root cgroups.
This file exists whether the controller is enabled or not.
It reports the following six stats: It always reports the following three stats:
- usage_usec - usage_usec
- user_usec - user_usec
- system_usec - system_usec
and the following three when the controller is enabled:
- nr_periods - nr_periods
- nr_throttled - nr_throttled
- throttled_usec - throttled_usec
......
...@@ -569,6 +569,8 @@ struct cgroup_subsys { ...@@ -569,6 +569,8 @@ struct cgroup_subsys {
void (*css_released)(struct cgroup_subsys_state *css); void (*css_released)(struct cgroup_subsys_state *css);
void (*css_free)(struct cgroup_subsys_state *css); void (*css_free)(struct cgroup_subsys_state *css);
void (*css_reset)(struct cgroup_subsys_state *css); void (*css_reset)(struct cgroup_subsys_state *css);
int (*css_extra_stat_show)(struct seq_file *seq,
struct cgroup_subsys_state *css);
int (*can_attach)(struct cgroup_taskset *tset); int (*can_attach)(struct cgroup_taskset *tset);
void (*cancel_attach)(struct cgroup_taskset *tset); void (*cancel_attach)(struct cgroup_taskset *tset);
......
...@@ -703,8 +703,6 @@ static inline void cpuacct_account_field(struct task_struct *tsk, int index, ...@@ -703,8 +703,6 @@ static inline void cpuacct_account_field(struct task_struct *tsk, int index,
u64 val) {} u64 val) {}
#endif #endif
void cgroup_stat_show_cputime(struct seq_file *seq, const char *prefix);
void __cgroup_account_cputime(struct cgroup *cgrp, u64 delta_exec); void __cgroup_account_cputime(struct cgroup *cgrp, u64 delta_exec);
void __cgroup_account_cputime_field(struct cgroup *cgrp, void __cgroup_account_cputime_field(struct cgroup *cgrp,
enum cpu_usage_stat index, u64 delta_exec); enum cpu_usage_stat index, u64 delta_exec);
......
...@@ -205,6 +205,7 @@ int cgroup_task_count(const struct cgroup *cgrp); ...@@ -205,6 +205,7 @@ int cgroup_task_count(const struct cgroup *cgrp);
void cgroup_stat_flush(struct cgroup *cgrp); void cgroup_stat_flush(struct cgroup *cgrp);
int cgroup_stat_init(struct cgroup *cgrp); int cgroup_stat_init(struct cgroup *cgrp);
void cgroup_stat_exit(struct cgroup *cgrp); void cgroup_stat_exit(struct cgroup *cgrp);
void cgroup_stat_show_cputime(struct seq_file *seq);
void cgroup_stat_boot(void); void cgroup_stat_boot(void);
/* /*
......
...@@ -463,6 +463,28 @@ static struct cgroup_subsys_state *cgroup_css(struct cgroup *cgrp, ...@@ -463,6 +463,28 @@ static struct cgroup_subsys_state *cgroup_css(struct cgroup *cgrp,
return &cgrp->self; return &cgrp->self;
} }
/**
* cgroup_tryget_css - try to get a cgroup's css for the specified subsystem
* @cgrp: the cgroup of interest
* @ss: the subsystem of interest
*
* Find and get @cgrp's css assocaited with @ss. If the css doesn't exist
* or is offline, %NULL is returned.
*/
static struct cgroup_subsys_state *cgroup_tryget_css(struct cgroup *cgrp,
struct cgroup_subsys *ss)
{
struct cgroup_subsys_state *css;
rcu_read_lock();
css = cgroup_css(cgrp, ss);
if (!css || !css_tryget_online(css))
css = NULL;
rcu_read_unlock();
return css;
}
/** /**
* cgroup_e_css - obtain a cgroup's effective css for the specified subsystem * cgroup_e_css - obtain a cgroup's effective css for the specified subsystem
* @cgrp: the cgroup of interest * @cgrp: the cgroup of interest
...@@ -3311,11 +3333,40 @@ static int cgroup_stat_show(struct seq_file *seq, void *v) ...@@ -3311,11 +3333,40 @@ static int cgroup_stat_show(struct seq_file *seq, void *v)
seq_printf(seq, "nr_dying_descendants %d\n", seq_printf(seq, "nr_dying_descendants %d\n",
cgroup->nr_dying_descendants); cgroup->nr_dying_descendants);
cgroup_stat_show_cputime(seq, "cpu.");
return 0; return 0;
} }
static int __maybe_unused cgroup_extra_stat_show(struct seq_file *seq,
struct cgroup *cgrp, int ssid)
{
struct cgroup_subsys *ss = cgroup_subsys[ssid];
struct cgroup_subsys_state *css;
int ret;
if (!ss->css_extra_stat_show)
return 0;
css = cgroup_tryget_css(cgrp, ss);
if (!css)
return 0;
ret = ss->css_extra_stat_show(seq, css);
css_put(css);
return ret;
}
static int cpu_stat_show(struct seq_file *seq, void *v)
{
struct cgroup *cgrp = seq_css(seq)->cgroup;
int ret = 0;
cgroup_stat_show_cputime(seq);
#ifdef CONFIG_CGROUP_SCHED
ret = cgroup_extra_stat_show(seq, cgrp, cpu_cgrp_id);
#endif
return ret;
}
static int cgroup_file_open(struct kernfs_open_file *of) static int cgroup_file_open(struct kernfs_open_file *of)
{ {
struct cftype *cft = of->kn->priv; struct cftype *cft = of->kn->priv;
...@@ -4423,6 +4474,11 @@ static struct cftype cgroup_base_files[] = { ...@@ -4423,6 +4474,11 @@ static struct cftype cgroup_base_files[] = {
.name = "cgroup.stat", .name = "cgroup.stat",
.seq_show = cgroup_stat_show, .seq_show = cgroup_stat_show,
}, },
{
.name = "cpu.stat",
.flags = CFTYPE_NOT_ON_ROOT,
.seq_show = cpu_stat_show,
},
{ } /* terminate */ { } /* terminate */
}; };
......
...@@ -256,7 +256,7 @@ void __cgroup_account_cputime_field(struct cgroup *cgrp, ...@@ -256,7 +256,7 @@ void __cgroup_account_cputime_field(struct cgroup *cgrp,
cgroup_cpu_stat_account_end(cgrp, cstat); cgroup_cpu_stat_account_end(cgrp, cstat);
} }
void cgroup_stat_show_cputime(struct seq_file *seq, const char *prefix) void cgroup_stat_show_cputime(struct seq_file *seq)
{ {
struct cgroup *cgrp = seq_css(seq)->cgroup; struct cgroup *cgrp = seq_css(seq)->cgroup;
u64 usage, utime, stime; u64 usage, utime, stime;
...@@ -278,10 +278,10 @@ void cgroup_stat_show_cputime(struct seq_file *seq, const char *prefix) ...@@ -278,10 +278,10 @@ void cgroup_stat_show_cputime(struct seq_file *seq, const char *prefix)
do_div(utime, NSEC_PER_USEC); do_div(utime, NSEC_PER_USEC);
do_div(stime, NSEC_PER_USEC); do_div(stime, NSEC_PER_USEC);
seq_printf(seq, "%susage_usec %llu\n" seq_printf(seq, "usage_usec %llu\n"
"%suser_usec %llu\n" "user_usec %llu\n"
"%ssystem_usec %llu\n", "system_usec %llu\n",
prefix, usage, prefix, utime, prefix, stime); usage, utime, stime);
} }
int cgroup_stat_init(struct cgroup *cgrp) int cgroup_stat_init(struct cgroup *cgrp)
......
...@@ -6678,13 +6678,12 @@ static struct cftype cpu_legacy_files[] = { ...@@ -6678,13 +6678,12 @@ static struct cftype cpu_legacy_files[] = {
{ } /* Terminate */ { } /* Terminate */
}; };
static int cpu_stat_show(struct seq_file *sf, void *v) static int cpu_extra_stat_show(struct seq_file *sf,
struct cgroup_subsys_state *css)
{ {
cgroup_stat_show_cputime(sf, "");
#ifdef CONFIG_CFS_BANDWIDTH #ifdef CONFIG_CFS_BANDWIDTH
{ {
struct task_group *tg = css_tg(seq_css(sf)); struct task_group *tg = css_tg(css);
struct cfs_bandwidth *cfs_b = &tg->cfs_bandwidth; struct cfs_bandwidth *cfs_b = &tg->cfs_bandwidth;
u64 throttled_usec; u64 throttled_usec;
...@@ -6817,11 +6816,6 @@ static ssize_t cpu_max_write(struct kernfs_open_file *of, ...@@ -6817,11 +6816,6 @@ static ssize_t cpu_max_write(struct kernfs_open_file *of,
#endif #endif
static struct cftype cpu_files[] = { static struct cftype cpu_files[] = {
{
.name = "stat",
.flags = CFTYPE_NOT_ON_ROOT,
.seq_show = cpu_stat_show,
},
#ifdef CONFIG_FAIR_GROUP_SCHED #ifdef CONFIG_FAIR_GROUP_SCHED
{ {
.name = "weight", .name = "weight",
...@@ -6852,6 +6846,7 @@ struct cgroup_subsys cpu_cgrp_subsys = { ...@@ -6852,6 +6846,7 @@ struct cgroup_subsys cpu_cgrp_subsys = {
.css_online = cpu_cgroup_css_online, .css_online = cpu_cgroup_css_online,
.css_released = cpu_cgroup_css_released, .css_released = cpu_cgroup_css_released,
.css_free = cpu_cgroup_css_free, .css_free = cpu_cgroup_css_free,
.css_extra_stat_show = cpu_extra_stat_show,
.fork = cpu_cgroup_fork, .fork = cpu_cgroup_fork,
.can_attach = cpu_cgroup_can_attach, .can_attach = cpu_cgroup_can_attach,
.attach = cpu_cgroup_attach, .attach = cpu_cgroup_attach,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment