forked from luck/tmp_suning_uos_patched
Merge branch 'for-5.8' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup
Pull cgroup updates from Tejun Heo: "Just two patches: one to add system-level cpu.stat to the root cgroup for convenience and a trivial comment update" * 'for-5.8' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup: cgroup: add cpu.stat file to root cgroup cgroup: Remove stale comments
This commit is contained in:
commit
4a7e89c5ec
|
@ -714,9 +714,7 @@ Conventions
|
||||||
- Settings for a single feature should be contained in a single file.
|
- Settings for a single feature should be contained in a single file.
|
||||||
|
|
||||||
- The root cgroup should be exempt from resource control and thus
|
- The root cgroup should be exempt from resource control and thus
|
||||||
shouldn't have resource control interface files. Also,
|
shouldn't have resource control interface files.
|
||||||
informational files on the root cgroup which end up showing global
|
|
||||||
information available elsewhere shouldn't exist.
|
|
||||||
|
|
||||||
- The default time unit is microseconds. If a different unit is ever
|
- The default time unit is microseconds. If a different unit is ever
|
||||||
used, an explicit unit suffix must be present.
|
used, an explicit unit suffix must be present.
|
||||||
|
@ -985,7 +983,7 @@ CPU Interface Files
|
||||||
All time durations are in microseconds.
|
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.
|
||||||
This file exists whether the controller is enabled or not.
|
This file exists whether the controller is enabled or not.
|
||||||
|
|
||||||
It always reports the following three stats:
|
It always reports the following three stats:
|
||||||
|
|
|
@ -153,11 +153,7 @@ static struct static_key_true *cgroup_subsys_on_dfl_key[] = {
|
||||||
|
|
||||||
static DEFINE_PER_CPU(struct cgroup_rstat_cpu, cgrp_dfl_root_rstat_cpu);
|
static DEFINE_PER_CPU(struct cgroup_rstat_cpu, cgrp_dfl_root_rstat_cpu);
|
||||||
|
|
||||||
/*
|
/* the default hierarchy */
|
||||||
* The default hierarchy, reserved for the subsystems that are otherwise
|
|
||||||
* unattached - it never has more than a single cgroup, and all tasks are
|
|
||||||
* part of that cgroup.
|
|
||||||
*/
|
|
||||||
struct cgroup_root cgrp_dfl_root = { .cgrp.rstat_cpu = &cgrp_dfl_root_rstat_cpu };
|
struct cgroup_root cgrp_dfl_root = { .cgrp.rstat_cpu = &cgrp_dfl_root_rstat_cpu };
|
||||||
EXPORT_SYMBOL_GPL(cgrp_dfl_root);
|
EXPORT_SYMBOL_GPL(cgrp_dfl_root);
|
||||||
|
|
||||||
|
@ -251,9 +247,6 @@ bool cgroup_ssid_enabled(int ssid)
|
||||||
* cases where a subsystem should behave differnetly depending on the
|
* cases where a subsystem should behave differnetly depending on the
|
||||||
* interface version.
|
* interface version.
|
||||||
*
|
*
|
||||||
* The set of behaviors which change on the default hierarchy are still
|
|
||||||
* being determined and the mount option is prefixed with __DEVEL__.
|
|
||||||
*
|
|
||||||
* List of changed behaviors:
|
* List of changed behaviors:
|
||||||
*
|
*
|
||||||
* - Mount options "noprefix", "xattr", "clone_children", "release_agent"
|
* - Mount options "noprefix", "xattr", "clone_children", "release_agent"
|
||||||
|
@ -4881,7 +4874,6 @@ static struct cftype cgroup_base_files[] = {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "cpu.stat",
|
.name = "cpu.stat",
|
||||||
.flags = CFTYPE_NOT_ON_ROOT,
|
|
||||||
.seq_show = cpu_stat_show,
|
.seq_show = cpu_stat_show,
|
||||||
},
|
},
|
||||||
#ifdef CONFIG_PSI
|
#ifdef CONFIG_PSI
|
||||||
|
|
|
@ -389,18 +389,62 @@ void __cgroup_account_cputime_field(struct cgroup *cgrp,
|
||||||
cgroup_base_stat_cputime_account_end(cgrp, rstatc);
|
cgroup_base_stat_cputime_account_end(cgrp, rstatc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* compute the cputime for the root cgroup by getting the per cpu data
|
||||||
|
* at a global level, then categorizing the fields in a manner consistent
|
||||||
|
* with how it is done by __cgroup_account_cputime_field for each bit of
|
||||||
|
* cpu time attributed to a cgroup.
|
||||||
|
*/
|
||||||
|
static void root_cgroup_cputime(struct task_cputime *cputime)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
cputime->stime = 0;
|
||||||
|
cputime->utime = 0;
|
||||||
|
cputime->sum_exec_runtime = 0;
|
||||||
|
for_each_possible_cpu(i) {
|
||||||
|
struct kernel_cpustat kcpustat;
|
||||||
|
u64 *cpustat = kcpustat.cpustat;
|
||||||
|
u64 user = 0;
|
||||||
|
u64 sys = 0;
|
||||||
|
|
||||||
|
kcpustat_cpu_fetch(&kcpustat, i);
|
||||||
|
|
||||||
|
user += cpustat[CPUTIME_USER];
|
||||||
|
user += cpustat[CPUTIME_NICE];
|
||||||
|
cputime->utime += user;
|
||||||
|
|
||||||
|
sys += cpustat[CPUTIME_SYSTEM];
|
||||||
|
sys += cpustat[CPUTIME_IRQ];
|
||||||
|
sys += cpustat[CPUTIME_SOFTIRQ];
|
||||||
|
cputime->stime += sys;
|
||||||
|
|
||||||
|
cputime->sum_exec_runtime += user;
|
||||||
|
cputime->sum_exec_runtime += sys;
|
||||||
|
cputime->sum_exec_runtime += cpustat[CPUTIME_STEAL];
|
||||||
|
cputime->sum_exec_runtime += cpustat[CPUTIME_GUEST];
|
||||||
|
cputime->sum_exec_runtime += cpustat[CPUTIME_GUEST_NICE];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void cgroup_base_stat_cputime_show(struct seq_file *seq)
|
void cgroup_base_stat_cputime_show(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;
|
||||||
|
struct task_cputime cputime;
|
||||||
|
|
||||||
if (!cgroup_parent(cgrp))
|
if (cgroup_parent(cgrp)) {
|
||||||
return;
|
cgroup_rstat_flush_hold(cgrp);
|
||||||
|
usage = cgrp->bstat.cputime.sum_exec_runtime;
|
||||||
cgroup_rstat_flush_hold(cgrp);
|
cputime_adjust(&cgrp->bstat.cputime, &cgrp->prev_cputime,
|
||||||
usage = cgrp->bstat.cputime.sum_exec_runtime;
|
&utime, &stime);
|
||||||
cputime_adjust(&cgrp->bstat.cputime, &cgrp->prev_cputime, &utime, &stime);
|
cgroup_rstat_flush_release();
|
||||||
cgroup_rstat_flush_release();
|
} else {
|
||||||
|
root_cgroup_cputime(&cputime);
|
||||||
|
usage = cputime.sum_exec_runtime;
|
||||||
|
utime = cputime.utime;
|
||||||
|
stime = cputime.stime;
|
||||||
|
}
|
||||||
|
|
||||||
do_div(usage, NSEC_PER_USEC);
|
do_div(usage, NSEC_PER_USEC);
|
||||||
do_div(utime, NSEC_PER_USEC);
|
do_div(utime, NSEC_PER_USEC);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user