[RFC PATCH v2 2/3] misc_cgroup: add failcnt counter
From: brookxu <hidden>
Date: 2021-07-22 15:21:43
Also in:
linux-fsdevel, lkml
Subsystem:
control group (cgroup), the rest · Maintainers:
Tejun Heo, Johannes Weiner, Michal Koutný, Linus Torvalds
From: Chunguang Xu <redacted> Instead of printing logs, we should probably track failures through a failcnt counter, similar to mem_cgroup. Signed-off-by: Chunguang Xu <redacted> --- include/linux/misc_cgroup.h | 1 + kernel/cgroup/misc.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+)
diff --git a/include/linux/misc_cgroup.h b/include/linux/misc_cgroup.h
index 8450a5e66de0..dd1a786f39b8 100644
--- a/include/linux/misc_cgroup.h
+++ b/include/linux/misc_cgroup.h@@ -37,6 +37,7 @@ struct misc_cg; struct misc_res { unsigned long max; atomic_long_t usage; + atomic_long_t failcnt; bool failed; };
diff --git a/kernel/cgroup/misc.c b/kernel/cgroup/misc.c
index 5d51b8eeece6..7c568b619f82 100644
--- a/kernel/cgroup/misc.c
+++ b/kernel/cgroup/misc.c@@ -165,6 +165,7 @@ int misc_cg_try_charge(enum misc_res_type type, struct misc_cg *cg, pr_cont("\n"); res->failed = true; } + atomic_long_inc(&res->failcnt); ret = -EBUSY; goto err_charge; }
@@ -312,6 +313,29 @@ static int misc_cg_current_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->res[i].failcnt); + if (READ_ONCE(misc_res_capacity[i]) || failcnt) + seq_printf(sf, "%s %lu\n", misc_res_name[i], failcnt); + } + + return 0; +} + /** * misc_cg_capacity_show() - Show the total capacity of misc res on the host. * @sf: Interface file
@@ -349,6 +373,11 @@ static struct cftype misc_cg_files[] = { .seq_show = misc_cg_current_show, .flags = CFTYPE_NOT_ON_ROOT, }, + { + .name = "failcnt", + .seq_show = misc_cg_failcnt_show, + .flags = CFTYPE_NOT_ON_ROOT, + }, { .name = "capacity", .seq_show = misc_cg_capacity_show,
@@ -383,6 +412,7 @@ misc_cg_alloc(struct cgroup_subsys_state *parent_css) for (i = 0; i < MISC_CG_RES_TYPES; i++) { WRITE_ONCE(cg->res[i].max, MAX_NUM); atomic_long_set(&cg->res[i].usage, 0); + atomic_long_set(&cg->res[i].failcnt, 0); } return &cg->css;
--
2.30.0