On Thu 15-08-13 12:02:29, Tejun Heo wrote: > cgroup_event is only available in memcg now. Let's brand it that way. > While at it, add a comment encouraging deprecation of the feature and > remove the respective section from cgroup documentation. > > This patch is cosmetic. > > v2: Index in cgroups.txt updated accordingly as suggested by Li Zefan. OK, Documentation/cgroups/memory.txt contains a documentation for all interfaces so this can go. > > Signed-off-by: Tejun Heo <tj@xxxxxxxxxx> > Cc: Li Zefan <lizefan@xxxxxxxxxx> Acked-by: Michal Hocko <mhocko@xxxxxxx> > --- > Documentation/cgroups/cgroups.txt | 20 -------------- > mm/memcontrol.c | 57 +++++++++++++++++++++++++-------------- > 2 files changed, 37 insertions(+), 40 deletions(-) > > diff --git a/Documentation/cgroups/cgroups.txt b/Documentation/cgroups/cgroups.txt > index 638bf17..821de56 100644 > --- a/Documentation/cgroups/cgroups.txt > +++ b/Documentation/cgroups/cgroups.txt > @@ -24,7 +24,6 @@ CONTENTS: > 2.1 Basic Usage > 2.2 Attaching processes > 2.3 Mounting hierarchies by name > - 2.4 Notification API > 3. Kernel API > 3.1 Overview > 3.2 Synchronization > @@ -472,25 +471,6 @@ you give a subsystem a name. > The name of the subsystem appears as part of the hierarchy description > in /proc/mounts and /proc/<pid>/cgroups. > > -2.4 Notification API > --------------------- > - > -There is mechanism which allows to get notifications about changing > -status of a cgroup. > - > -To register a new notification handler you need to: > - - create a file descriptor for event notification using eventfd(2); > - - open a control file to be monitored (e.g. memory.usage_in_bytes); > - - write "<event_fd> <control_fd> <args>" to cgroup.event_control. > - Interpretation of args is defined by control file implementation; > - > -eventfd will be woken up by control file implementation or when the > -cgroup is removed. > - > -To unregister a notification handler just close eventfd. > - > -NOTE: Support of notifications should be implemented for the control > -file. See documentation for the subsystem. > > 3. Kernel API > ============= > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > index 8663d6c..2f0a8e1 100644 > --- a/mm/memcontrol.c > +++ b/mm/memcontrol.c > @@ -243,7 +243,7 @@ struct mem_cgroup_eventfd_list { > /* > * cgroup_event represents events which userspace want to receive. > */ > -struct cgroup_event { > +struct mem_cgroup_event { > /* > * memcg which the event belongs to. > */ > @@ -5973,14 +5973,27 @@ static void kmem_cgroup_css_offline(struct mem_cgroup *memcg) > #endif > > /* > + * DO NOT USE IN NEW FILES. > + * > + * "cgroup.event_control" implementation. > + * > + * This is way over-engineered. It tries to support fully configureable > + * events for each user. Such level of flexibility is completely > + * unnecessary especially in the light of the planned unified hierarchy. > + * > + * Please deprecate this and replace with something simpler if at all > + * possible. > + */ > + > +/* > * Unregister event and free resources. > * > * Gets called from workqueue. > */ > -static void cgroup_event_remove(struct work_struct *work) > +static void memcg_event_remove(struct work_struct *work) > { > - struct cgroup_event *event = container_of(work, struct cgroup_event, > - remove); > + struct mem_cgroup_event *event = > + container_of(work, struct mem_cgroup_event, remove); > struct mem_cgroup *memcg = event->memcg; > > remove_wait_queue(event->wqh, &event->wait); > @@ -6000,11 +6013,11 @@ static void cgroup_event_remove(struct work_struct *work) > * > * Called with wqh->lock held and interrupts disabled. > */ > -static int cgroup_event_wake(wait_queue_t *wait, unsigned mode, > - int sync, void *key) > +static int memcg_event_wake(wait_queue_t *wait, unsigned mode, > + int sync, void *key) > { > - struct cgroup_event *event = container_of(wait, > - struct cgroup_event, wait); > + struct mem_cgroup_event *event = > + container_of(wait, struct mem_cgroup_event, wait); > struct mem_cgroup *memcg = event->memcg; > unsigned long flags = (unsigned long)key; > > @@ -6033,27 +6046,29 @@ static int cgroup_event_wake(wait_queue_t *wait, unsigned mode, > return 0; > } > > -static void cgroup_event_ptable_queue_proc(struct file *file, > +static void memcg_event_ptable_queue_proc(struct file *file, > wait_queue_head_t *wqh, poll_table *pt) > { > - struct cgroup_event *event = container_of(pt, > - struct cgroup_event, pt); > + struct mem_cgroup_event *event = > + container_of(pt, struct mem_cgroup_event, pt); > > event->wqh = wqh; > add_wait_queue(wqh, &event->wait); > } > > /* > + * DO NOT USE IN NEW FILES. > + * > * Parse input and register new cgroup event handler. > * > * Input must be in format '<event_fd> <control_fd> <args>'. > * Interpretation of args is defined by control file implementation. > */ > -static int cgroup_write_event_control(struct cgroup_subsys_state *css, > - struct cftype *cft, const char *buffer) > +static int memcg_write_event_control(struct cgroup_subsys_state *css, > + struct cftype *cft, const char *buffer) > { > struct mem_cgroup *memcg = mem_cgroup_from_css(css); > - struct cgroup_event *event; > + struct mem_cgroup_event *event; > struct cgroup_subsys_state *cfile_css; > unsigned int efd, cfd; > struct file *efile; > @@ -6078,9 +6093,9 @@ static int cgroup_write_event_control(struct cgroup_subsys_state *css, > > event->memcg = memcg; > INIT_LIST_HEAD(&event->list); > - init_poll_funcptr(&event->pt, cgroup_event_ptable_queue_proc); > - init_waitqueue_func_entry(&event->wait, cgroup_event_wake); > - INIT_WORK(&event->remove, cgroup_event_remove); > + init_poll_funcptr(&event->pt, memcg_event_ptable_queue_proc); > + init_waitqueue_func_entry(&event->wait, memcg_event_wake); > + INIT_WORK(&event->remove, memcg_event_remove); > > efile = eventfd_fget(efd); > if (IS_ERR(efile)) { > @@ -6111,6 +6126,8 @@ static int cgroup_write_event_control(struct cgroup_subsys_state *css, > * to be done via struct cftype but cgroup core no longer knows > * about these events. The following is crude but the whole thing > * is for compatibility anyway. > + * > + * DO NOT ADD NEW FILES. > */ > name = cfile->f_dentry->d_name.name; > > @@ -6221,8 +6238,8 @@ static struct cftype mem_cgroup_files[] = { > .read_u64 = mem_cgroup_hierarchy_read, > }, > { > - .name = "cgroup.event_control", > - .write_string = cgroup_write_event_control, > + .name = "cgroup.event_control", /* XXX: for compat */ > + .write_string = memcg_write_event_control, > .flags = CFTYPE_NO_PREFIX, > .mode = S_IWUGO, > }, > @@ -6555,7 +6572,7 @@ static void mem_cgroup_invalidate_reclaim_iterators(struct mem_cgroup *memcg) > static void mem_cgroup_css_offline(struct cgroup_subsys_state *css) > { > struct mem_cgroup *memcg = mem_cgroup_from_css(css); > - struct cgroup_event *event, *tmp; > + struct mem_cgroup_event *event, *tmp; > > /* > * Unregister events and notify userspace. > -- > 1.8.3.1 > > -- > To unsubscribe from this list: send the line "unsubscribe cgroups" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Michal Hocko SUSE Labs _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/containers