memcg: rename cgroup_event to mem_cgroup_event
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. v3: Typo update as per Li Zefan. v2: Index in cgroups.txt updated accordingly as suggested by Li Zefan. Signed-off-by: Tejun Heo <tj@kernel.org> Acked-by: Li Zefan <lizefan@huawei.com> Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Acked-by: Michal Hocko <mhocko@suse.cz>
This commit is contained in:
		
							parent
							
								
									59b6f87344
								
							
						
					
					
						commit
						3bc942f372
					
				| @ -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 | ||||
| ============= | ||||
|  | ||||
| @ -231,7 +231,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. | ||||
| 	 */ | ||||
| @ -6001,15 +6001,28 @@ 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 configurable | ||||
|  * 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); | ||||
| @ -6029,11 +6042,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; | ||||
| 
 | ||||
| @ -6062,27 +6075,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 fd efile; | ||||
| @ -6107,9 +6122,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 = fdget(efd); | ||||
| 	if (!efile.file) { | ||||
| @ -6140,6 +6155,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.file->f_dentry->d_name.name; | ||||
| 
 | ||||
| @ -6251,8 +6268,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, | ||||
| 	}, | ||||
| @ -6585,7 +6602,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. | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user