On Tue, Sep 14, 2021 at 7:18 PM brookxu <brookxu.cn@xxxxxxxxx> wrote: > > From: Chunguang Xu <brookxu@xxxxxxxxxxx> > > Introduce misc.events to make it easier for us to understand > the pressure of resources. Currently only the 'max' event is > implemented, which indicates the times the resource is about > to exceeds the max limit. > > Signed-off-by: Chunguang Xu <brookxu@xxxxxxxxxxx> > --- > > v3: remove misc.events.local. > v2: remove cgroup v1 files. > > include/linux/misc_cgroup.h | 5 +++++ > kernel/cgroup/misc.c | 24 ++++++++++++++++++++++++ > 2 files changed, 29 insertions(+) > > diff --git a/include/linux/misc_cgroup.h b/include/linux/misc_cgroup.h > index da2367e..091f2d2 100644 > --- a/include/linux/misc_cgroup.h > +++ b/include/linux/misc_cgroup.h > @@ -36,6 +36,7 @@ enum misc_res_type { > struct misc_res { > unsigned long max; > atomic_long_t usage; > + atomic_long_t events; > bool failed; > }; > > @@ -46,6 +47,10 @@ struct misc_res { > */ > struct misc_cg { > struct cgroup_subsys_state css; > + > + /* misc.events */ > + struct cgroup_file events_file; > + > struct misc_res res[MISC_CG_RES_TYPES]; > }; > > diff --git a/kernel/cgroup/misc.c b/kernel/cgroup/misc.c > index ec02d96..4b2b492 100644 > --- a/kernel/cgroup/misc.c > +++ b/kernel/cgroup/misc.c > @@ -171,6 +171,11 @@ int misc_cg_try_charge(enum misc_res_type type, struct misc_cg *cg, > return 0; > > err_charge: > + for (j = i; j; j = parent_misc(j)) { > + atomic_long_inc(&j->res[type].events); > + cgroup_file_notify(&j->events_file); > + } > + > for (j = cg; j != i; j = parent_misc(j)) > misc_cg_cancel_charge(type, j, amount); > misc_cg_cancel_charge(type, i, amount); > @@ -335,6 +340,19 @@ static int misc_cg_capacity_show(struct seq_file *sf, void *v) > return 0; > } > > +static int misc_events_show(struct seq_file *sf, void *v) > +{ > + struct misc_cg *cg = css_misc(seq_css(sf)); > + unsigned long events, i; > + > + for (i = 0; i < MISC_CG_RES_TYPES; i++) { > + events = atomic_long_read(&cg->res[i].events); > + if (READ_ONCE(misc_res_capacity[i]) || events) > + seq_printf(sf, "%s.max %lu\n", misc_res_name[i], events); > + } > + return 0; > +} > + > /* Misc cgroup interface files */ > static struct cftype misc_cg_files[] = { > { > @@ -353,6 +371,12 @@ static int misc_cg_capacity_show(struct seq_file *sf, void *v) > .seq_show = misc_cg_capacity_show, > .flags = CFTYPE_ONLY_ON_ROOT, > }, > + { > + .name = "events", > + .flags = CFTYPE_NOT_ON_ROOT, > + .file_offset = offsetof(struct misc_cg, events_file), > + .seq_show = misc_events_show, > + }, > {} > }; > > -- > 1.8.3.1 > Reviewed-by: Vipin Sharma <vipinsh@xxxxxxxxxx>