On Thu 15-08-13 12:02:27, Tejun Heo wrote: > The only use of cgroup_event->cft is distinguishing "usage_in_bytes" > and "memsw.usgae_in_bytes" for mem_cgroup_usage_[un]register_event(), > which can be done by adding an explicit argument to the function and > implementing two wrappers so that the two cases can be distinguished > from the function alone. > > Remove cgroup_event->cft and the related code including > [un]register_events() methods. > > Signed-off-by: Tejun Heo <tj@xxxxxxxxxx> Acked-by: Michal Hocko <mhocko@xxxxxxx> > --- > include/linux/vmpressure.h | 2 -- > mm/memcontrol.c | 65 +++++++++++++++++++++++++--------------------- > mm/vmpressure.c | 14 +++------- > 3 files changed, 38 insertions(+), 43 deletions(-) > > diff --git a/include/linux/vmpressure.h b/include/linux/vmpressure.h > index 324ea7a..dd0b025 100644 > --- a/include/linux/vmpressure.h > +++ b/include/linux/vmpressure.h > @@ -35,11 +35,9 @@ extern struct vmpressure *memcg_to_vmpressure(struct mem_cgroup *memcg); > extern struct cgroup_subsys_state *vmpressure_to_css(struct vmpressure *vmpr); > extern struct vmpressure *css_to_vmpressure(struct cgroup_subsys_state *css); > extern int vmpressure_register_event(struct cgroup_subsys_state *css, > - struct cftype *cft, > struct eventfd_ctx *eventfd, > const char *args); > extern void vmpressure_unregister_event(struct cgroup_subsys_state *css, > - struct cftype *cft, > struct eventfd_ctx *eventfd); > #else > static inline void vmpressure(gfp_t gfp, struct mem_cgroup *memcg, > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > index 9b833e1..18e98ae 100644 > --- a/mm/memcontrol.c > +++ b/mm/memcontrol.c > @@ -249,10 +249,6 @@ struct cgroup_event { > */ > struct cgroup_subsys_state *css; > /* > - * Control file which the event associated. > - */ > - struct cftype *cft; > - /* > * eventfd to signal userspace about the event. > */ > struct eventfd_ctx *eventfd; > @@ -266,15 +262,13 @@ struct cgroup_event { > * on eventfd to send notification to userspace. > */ > int (*register_event)(struct cgroup_subsys_state *css, > - struct cftype *cft, struct eventfd_ctx *eventfd, > - const char *args); > + struct eventfd_ctx *eventfd, const char *args); > /* > * unregister_event() callback will be called when userspace closes > * the eventfd or on cgroup removing. This callback must be set, > * if you want provide notification functionality. > */ > void (*unregister_event)(struct cgroup_subsys_state *css, > - struct cftype *cft, > struct eventfd_ctx *eventfd); > /* > * All fields below needed to unregister event when > @@ -5659,13 +5653,12 @@ static void mem_cgroup_oom_notify(struct mem_cgroup *memcg) > mem_cgroup_oom_notify_cb(iter); > } > > -static int mem_cgroup_usage_register_event(struct cgroup_subsys_state *css, > - struct cftype *cft, struct eventfd_ctx *eventfd, const char *args) > +static int __mem_cgroup_usage_register_event(struct cgroup_subsys_state *css, > + struct eventfd_ctx *eventfd, const char *args, enum res_type type) > { > struct mem_cgroup *memcg = mem_cgroup_from_css(css); > struct mem_cgroup_thresholds *thresholds; > struct mem_cgroup_threshold_ary *new; > - enum res_type type = MEMFILE_TYPE(cft->private); > u64 threshold, usage; > int i, size, ret; > > @@ -5742,13 +5735,24 @@ unlock: > return ret; > } > > -static void mem_cgroup_usage_unregister_event(struct cgroup_subsys_state *css, > - struct cftype *cft, struct eventfd_ctx *eventfd) > +static int mem_cgroup_usage_register_event(struct cgroup_subsys_state *css, > + struct eventfd_ctx *eventfd, const char *args) > +{ > + return __mem_cgroup_usage_register_event(css, eventfd, args, _MEM); > +} > + > +static int memsw_cgroup_usage_register_event(struct cgroup_subsys_state *css, > + struct eventfd_ctx *eventfd, const char *args) > +{ > + return __mem_cgroup_usage_register_event(css, eventfd, args, _MEMSWAP); > +} > + > +static void __mem_cgroup_usage_unregister_event(struct cgroup_subsys_state *css, > + struct eventfd_ctx *eventfd, enum res_type type) > { > struct mem_cgroup *memcg = mem_cgroup_from_css(css); > struct mem_cgroup_thresholds *thresholds; > struct mem_cgroup_threshold_ary *new; > - enum res_type type = MEMFILE_TYPE(cft->private); > u64 usage; > int i, j, size; > > @@ -5821,14 +5825,24 @@ unlock: > mutex_unlock(&memcg->thresholds_lock); > } > > +static void mem_cgroup_usage_unregister_event(struct cgroup_subsys_state *css, > + struct eventfd_ctx *eventfd) > +{ > + return __mem_cgroup_usage_unregister_event(css, eventfd, _MEM); > +} > + > +static void memsw_cgroup_usage_unregister_event(struct cgroup_subsys_state *css, > + struct eventfd_ctx *eventfd) > +{ > + return __mem_cgroup_usage_unregister_event(css, eventfd, _MEMSWAP); > +} > + > static int mem_cgroup_oom_register_event(struct cgroup_subsys_state *css, > - struct cftype *cft, struct eventfd_ctx *eventfd, const char *args) > + struct eventfd_ctx *eventfd, const char *args) > { > struct mem_cgroup *memcg = mem_cgroup_from_css(css); > struct mem_cgroup_eventfd_list *event; > - enum res_type type = MEMFILE_TYPE(cft->private); > > - BUG_ON(type != _OOM_TYPE); > event = kmalloc(sizeof(*event), GFP_KERNEL); > if (!event) > return -ENOMEM; > @@ -5847,13 +5861,10 @@ static int mem_cgroup_oom_register_event(struct cgroup_subsys_state *css, > } > > static void mem_cgroup_oom_unregister_event(struct cgroup_subsys_state *css, > - struct cftype *cft, struct eventfd_ctx *eventfd) > + struct eventfd_ctx *eventfd) > { > struct mem_cgroup *memcg = mem_cgroup_from_css(css); > struct mem_cgroup_eventfd_list *ev, *tmp; > - enum res_type type = MEMFILE_TYPE(cft->private); > - > - BUG_ON(type != _OOM_TYPE); > > spin_lock(&memcg_oom_lock); > > @@ -5983,7 +5994,7 @@ static void cgroup_event_remove(struct work_struct *work) > > remove_wait_queue(event->wqh, &event->wait); > > - event->unregister_event(css, event->cft, event->eventfd); > + event->unregister_event(css, event->eventfd); > > /* Notify userspace the event is going away. */ > eventfd_signal(event->eventfd, 1); > @@ -6104,12 +6115,6 @@ static int cgroup_write_event_control(struct cgroup_subsys_state *css, > if (ret < 0) > goto out_put_cfile; > > - event->cft = __file_cft(cfile); > - if (IS_ERR(event->cft)) { > - ret = PTR_ERR(event->cft); > - goto out_put_cfile; > - } > - > /* > * Determine the event callbacks and set them in @event. This used > * to be done via struct cftype but cgroup core no longer knows > @@ -6128,8 +6133,8 @@ static int cgroup_write_event_control(struct cgroup_subsys_state *css, > event->register_event = vmpressure_register_event; > event->unregister_event = vmpressure_unregister_event; > } else if (!strcmp(name, "memory.memsw.usage_in_bytes")) { > - event->register_event = mem_cgroup_usage_register_event; > - event->unregister_event = mem_cgroup_usage_unregister_event; > + event->register_event = memsw_cgroup_usage_register_event; > + event->unregister_event = memsw_cgroup_usage_unregister_event; > } else { > ret = -EINVAL; > goto out_put_cfile; > @@ -6151,7 +6156,7 @@ static int cgroup_write_event_control(struct cgroup_subsys_state *css, > if (ret) > goto out_put_cfile; > > - ret = event->register_event(css, event->cft, event->eventfd, buffer); > + ret = event->register_event(css, event->eventfd, buffer); > if (ret) > goto out_put_css; > > diff --git a/mm/vmpressure.c b/mm/vmpressure.c > index 13489b1..40ed6e8 100644 > --- a/mm/vmpressure.c > +++ b/mm/vmpressure.c > @@ -279,7 +279,6 @@ void vmpressure_prio(gfp_t gfp, struct mem_cgroup *memcg, int prio) > /** > * vmpressure_register_event() - Bind vmpressure notifications to an eventfd > * @css: css that is interested in vmpressure notifications > - * @cft: cgroup control files handle > * @eventfd: eventfd context to link notifications with > * @args: event arguments (used to set up a pressure level threshold) > * > @@ -289,13 +288,10 @@ void vmpressure_prio(gfp_t gfp, struct mem_cgroup *memcg, int prio) > * threshold (one of vmpressure_str_levels, i.e. "low", "medium", or > * "critical"). > * > - * This function should not be used directly, just pass it to (struct > - * cftype).register_event, and then cgroup core will handle everything by > - * itself. > + * To be used as memcg event method. > */ > int vmpressure_register_event(struct cgroup_subsys_state *css, > - struct cftype *cft, struct eventfd_ctx *eventfd, > - const char *args) > + struct eventfd_ctx *eventfd, const char *args) > { > struct vmpressure *vmpr = css_to_vmpressure(css); > struct vmpressure_event *ev; > @@ -326,19 +322,15 @@ int vmpressure_register_event(struct cgroup_subsys_state *css, > /** > * vmpressure_unregister_event() - Unbind eventfd from vmpressure > * @css: css handle > - * @cft: cgroup control files handle > * @eventfd: eventfd context that was used to link vmpressure with the @cg > * > * This function does internal manipulations to detach the @eventfd from > * the vmpressure notifications, and then frees internal resources > * associated with the @eventfd (but the @eventfd itself is not freed). > * > - * This function should not be used directly, just pass it to (struct > - * cftype).unregister_event, and then cgroup core will handle everything > - * by itself. > + * To be used as memcg event method. > */ > void vmpressure_unregister_event(struct cgroup_subsys_state *css, > - struct cftype *cft, > struct eventfd_ctx *eventfd) > { > struct vmpressure *vmpr = css_to_vmpressure(css); > -- > 1.8.3.1 > -- Michal Hocko SUSE Labs _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/containers