|
@@ -463,6 +463,28 @@ static struct cgroup_subsys_state *cgroup_css(struct cgroup *cgrp,
|
|
|
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
|
|
|
* @cgrp: the cgroup of interest
|
|
@@ -3311,11 +3333,40 @@ static int cgroup_stat_show(struct seq_file *seq, void *v)
|
|
|
seq_printf(seq, "nr_dying_descendants %d\n",
|
|
|
cgroup->nr_dying_descendants);
|
|
|
|
|
|
- cgroup_stat_show_cputime(seq, "cpu.");
|
|
|
-
|
|
|
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)
|
|
|
{
|
|
|
struct cftype *cft = of->kn->priv;
|
|
@@ -4423,6 +4474,11 @@ static struct cftype cgroup_base_files[] = {
|
|
|
.name = "cgroup.stat",
|
|
|
.seq_show = cgroup_stat_show,
|
|
|
},
|
|
|
+ {
|
|
|
+ .name = "cpu.stat",
|
|
|
+ .flags = CFTYPE_NOT_ON_ROOT,
|
|
|
+ .seq_show = cpu_stat_show,
|
|
|
+ },
|
|
|
{ } /* terminate */
|
|
|
};
|
|
|
|