From: Chunguang Xu <brookxu@xxxxxxxxxxx> introduce misc.failcnt for cgroup v1 to make it easier for us to understand the pressure of resources. Signed-off-by: Chunguang Xu <brookxu@xxxxxxxxxxx> --- include/linux/misc_cgroup.h | 3 +++ kernel/cgroup/misc.c | 54 +++++++++++++++++++++++++++++++++++-- 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/include/linux/misc_cgroup.h b/include/linux/misc_cgroup.h index d29f1743fae9..4d630cd3e4bd 100644 --- a/include/linux/misc_cgroup.h +++ b/include/linux/misc_cgroup.h @@ -55,6 +55,9 @@ struct misc_cg { atomic_long_t events_local[MISC_CG_RES_TYPES]; struct cgroup_file events_local_file; + /* misc.failcnt for v1 only */ + atomic_long_t nr_failed[MISC_CG_RES_TYPES]; + struct misc_res res[MISC_CG_RES_TYPES]; }; diff --git a/kernel/cgroup/misc.c b/kernel/cgroup/misc.c index 2a3d14be21e5..d8f99fd58981 100644 --- a/kernel/cgroup/misc.c +++ b/kernel/cgroup/misc.c @@ -179,7 +179,8 @@ int misc_cg_try_charge(enum misc_res_type type, struct misc_cg *cg, atomic_long_inc(&k->events[type]); cgroup_file_notify(&k->events_file); } - } + } else + atomic_long_inc(&i->nr_failed[type]); for (j = cg; j != i; j = parent_misc(j)) misc_cg_cancel_charge(type, j, amount); @@ -371,6 +372,29 @@ static int misc_events_local_show(struct seq_file *sf, void *v) return 0; } +/** + * misc_cg_failcnt_show() - Show the fail count of the misc cgroup. + * @sf: Interface file + * @v: Arguments passed + * + * Context: Any context. + * Return: 0 to denote successful print. + */ +static int misc_cg_failcnt_show(struct seq_file *sf, void *v) +{ + int i; + unsigned long failcnt; + struct misc_cg *cg = css_misc(seq_css(sf)); + + for (i = 0; i < MISC_CG_RES_TYPES; i++) { + failcnt = atomic_long_read(&cg->nr_failed[i]); + if (READ_ONCE(misc_res_capacity[i]) || failcnt) + seq_printf(sf, "%s %lu\n", misc_res_name[i], failcnt); + } + + return 0; +} + /* Misc cgroup interface files */ static struct cftype misc_cg_files[] = { { @@ -404,6 +428,32 @@ static struct cftype misc_cg_files[] = { {} }; +/* Misc cgroup interface files for v1*/ +static struct cftype misc_cg_legacy_files[] = { + { + .name = "max", + .write = misc_cg_max_write, + .seq_show = misc_cg_max_show, + .flags = CFTYPE_NOT_ON_ROOT, + }, + { + .name = "current", + .seq_show = misc_cg_current_show, + .flags = CFTYPE_NOT_ON_ROOT, + }, + { + .name = "capacity", + .seq_show = misc_cg_capacity_show, + .flags = CFTYPE_ONLY_ON_ROOT, + }, + { + .name = "failcnt", + .seq_show = misc_cg_failcnt_show, + .flags = CFTYPE_NOT_ON_ROOT, + }, + {} +}; + /** * misc_cg_alloc() - Allocate misc cgroup. * @parent_css: Parent cgroup. @@ -450,6 +500,6 @@ static void misc_cg_free(struct cgroup_subsys_state *css) struct cgroup_subsys misc_cgrp_subsys = { .css_alloc = misc_cg_alloc, .css_free = misc_cg_free, - .legacy_cftypes = misc_cg_files, + .legacy_cftypes = misc_cg_legacy_files, .dfl_cftypes = misc_cg_files, }; -- 2.30.0