aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2013-11-22 18:20:44 -0500
committerTejun Heo <tj@kernel.org>2013-11-22 18:20:44 -0500
commit3bc942f372af383f49d56aab599469561a5e39ec (patch)
tree91c92e037eea3f556913a8a2f5699d58fdca5f95
parent59b6f87344ab5eb3057e5844b8cd8a39e668f477 (diff)
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>
-rw-r--r--Documentation/cgroups/cgroups.txt20
-rw-r--r--mm/memcontrol.c57
2 files changed, 37 insertions, 40 deletions
diff --git a/Documentation/cgroups/cgroups.txt b/Documentation/cgroups/cgroups.txt
index 638bf17ff869..821de56d1580 100644
--- a/Documentation/cgroups/cgroups.txt
+++ b/Documentation/cgroups/cgroups.txt
@@ -24,7 +24,6 @@ CONTENTS:
24 2.1 Basic Usage 24 2.1 Basic Usage
25 2.2 Attaching processes 25 2.2 Attaching processes
26 2.3 Mounting hierarchies by name 26 2.3 Mounting hierarchies by name
27 2.4 Notification API
283. Kernel API 273. Kernel API
29 3.1 Overview 28 3.1 Overview
30 3.2 Synchronization 29 3.2 Synchronization
@@ -472,25 +471,6 @@ you give a subsystem a name.
472The name of the subsystem appears as part of the hierarchy description 471The name of the subsystem appears as part of the hierarchy description
473in /proc/mounts and /proc/<pid>/cgroups. 472in /proc/mounts and /proc/<pid>/cgroups.
474 473
4752.4 Notification API
476--------------------
477
478There is mechanism which allows to get notifications about changing
479status of a cgroup.
480
481To register a new notification handler you need to:
482 - create a file descriptor for event notification using eventfd(2);
483 - open a control file to be monitored (e.g. memory.usage_in_bytes);
484 - write "<event_fd> <control_fd> <args>" to cgroup.event_control.
485 Interpretation of args is defined by control file implementation;
486
487eventfd will be woken up by control file implementation or when the
488cgroup is removed.
489
490To unregister a notification handler just close eventfd.
491
492NOTE: Support of notifications should be implemented for the control
493file. See documentation for the subsystem.
494 474
4953. Kernel API 4753. Kernel API
496============= 476=============
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 42f2843af1a7..ec8582b3a232 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -231,7 +231,7 @@ struct mem_cgroup_eventfd_list {
231/* 231/*
232 * cgroup_event represents events which userspace want to receive. 232 * cgroup_event represents events which userspace want to receive.
233 */ 233 */
234struct cgroup_event { 234struct mem_cgroup_event {
235 /* 235 /*
236 * memcg which the event belongs to. 236 * memcg which the event belongs to.
237 */ 237 */
@@ -6002,14 +6002,27 @@ static void kmem_cgroup_css_offline(struct mem_cgroup *memcg)
6002#endif 6002#endif
6003 6003
6004/* 6004/*
6005 * DO NOT USE IN NEW FILES.
6006 *
6007 * "cgroup.event_control" implementation.
6008 *
6009 * This is way over-engineered. It tries to support fully configurable
6010 * events for each user. Such level of flexibility is completely
6011 * unnecessary especially in the light of the planned unified hierarchy.
6012 *
6013 * Please deprecate this and replace with something simpler if at all
6014 * possible.
6015 */
6016
6017/*
6005 * Unregister event and free resources. 6018 * Unregister event and free resources.
6006 * 6019 *
6007 * Gets called from workqueue. 6020 * Gets called from workqueue.
6008 */ 6021 */
6009static void cgroup_event_remove(struct work_struct *work) 6022static void memcg_event_remove(struct work_struct *work)
6010{ 6023{
6011 struct cgroup_event *event = container_of(work, struct cgroup_event, 6024 struct mem_cgroup_event *event =
6012 remove); 6025 container_of(work, struct mem_cgroup_event, remove);
6013 struct mem_cgroup *memcg = event->memcg; 6026 struct mem_cgroup *memcg = event->memcg;
6014 6027
6015 remove_wait_queue(event->wqh, &event->wait); 6028 remove_wait_queue(event->wqh, &event->wait);
@@ -6029,11 +6042,11 @@ static void cgroup_event_remove(struct work_struct *work)
6029 * 6042 *
6030 * Called with wqh->lock held and interrupts disabled. 6043 * Called with wqh->lock held and interrupts disabled.
6031 */ 6044 */
6032static int cgroup_event_wake(wait_queue_t *wait, unsigned mode, 6045static int memcg_event_wake(wait_queue_t *wait, unsigned mode,
6033 int sync, void *key) 6046 int sync, void *key)
6034{ 6047{
6035 struct cgroup_event *event = container_of(wait, 6048 struct mem_cgroup_event *event =
6036 struct cgroup_event, wait); 6049 container_of(wait, struct mem_cgroup_event, wait);
6037 struct mem_cgroup *memcg = event->memcg; 6050 struct mem_cgroup *memcg = event->memcg;
6038 unsigned long flags = (unsigned long)key; 6051 unsigned long flags = (unsigned long)key;
6039 6052
@@ -6062,27 +6075,29 @@ static int cgroup_event_wake(wait_queue_t *wait, unsigned mode,
6062 return 0; 6075 return 0;
6063} 6076}
6064 6077
6065static void cgroup_event_ptable_queue_proc(struct file *file, 6078static void memcg_event_ptable_queue_proc(struct file *file,
6066 wait_queue_head_t *wqh, poll_table *pt) 6079 wait_queue_head_t *wqh, poll_table *pt)
6067{ 6080{
6068 struct cgroup_event *event = container_of(pt, 6081 struct mem_cgroup_event *event =
6069 struct cgroup_event, pt); 6082 container_of(pt, struct mem_cgroup_event, pt);
6070 6083
6071 event->wqh = wqh; 6084 event->wqh = wqh;
6072 add_wait_queue(wqh, &event->wait); 6085 add_wait_queue(wqh, &event->wait);
6073} 6086}
6074 6087
6075/* 6088/*
6089 * DO NOT USE IN NEW FILES.
6090 *
6076 * Parse input and register new cgroup event handler. 6091 * Parse input and register new cgroup event handler.
6077 * 6092 *
6078 * Input must be in format '<event_fd> <control_fd> <args>'. 6093 * Input must be in format '<event_fd> <control_fd> <args>'.
6079 * Interpretation of args is defined by control file implementation. 6094 * Interpretation of args is defined by control file implementation.
6080 */ 6095 */
6081static int cgroup_write_event_control(struct cgroup_subsys_state *css, 6096static int memcg_write_event_control(struct cgroup_subsys_state *css,
6082 struct cftype *cft, const char *buffer) 6097 struct cftype *cft, const char *buffer)
6083{ 6098{
6084 struct mem_cgroup *memcg = mem_cgroup_from_css(css); 6099 struct mem_cgroup *memcg = mem_cgroup_from_css(css);
6085 struct cgroup_event *event; 6100 struct mem_cgroup_event *event;
6086 struct cgroup_subsys_state *cfile_css; 6101 struct cgroup_subsys_state *cfile_css;
6087 unsigned int efd, cfd; 6102 unsigned int efd, cfd;
6088 struct fd efile; 6103 struct fd efile;
@@ -6107,9 +6122,9 @@ static int cgroup_write_event_control(struct cgroup_subsys_state *css,
6107 6122
6108 event->memcg = memcg; 6123 event->memcg = memcg;
6109 INIT_LIST_HEAD(&event->list); 6124 INIT_LIST_HEAD(&event->list);
6110 init_poll_funcptr(&event->pt, cgroup_event_ptable_queue_proc); 6125 init_poll_funcptr(&event->pt, memcg_event_ptable_queue_proc);
6111 init_waitqueue_func_entry(&event->wait, cgroup_event_wake); 6126 init_waitqueue_func_entry(&event->wait, memcg_event_wake);
6112 INIT_WORK(&event->remove, cgroup_event_remove); 6127 INIT_WORK(&event->remove, memcg_event_remove);
6113 6128
6114 efile = fdget(efd); 6129 efile = fdget(efd);
6115 if (!efile.file) { 6130 if (!efile.file) {
@@ -6140,6 +6155,8 @@ static int cgroup_write_event_control(struct cgroup_subsys_state *css,
6140 * to be done via struct cftype but cgroup core no longer knows 6155 * to be done via struct cftype but cgroup core no longer knows
6141 * about these events. The following is crude but the whole thing 6156 * about these events. The following is crude but the whole thing
6142 * is for compatibility anyway. 6157 * is for compatibility anyway.
6158 *
6159 * DO NOT ADD NEW FILES.
6143 */ 6160 */
6144 name = cfile.file->f_dentry->d_name.name; 6161 name = cfile.file->f_dentry->d_name.name;
6145 6162
@@ -6251,8 +6268,8 @@ static struct cftype mem_cgroup_files[] = {
6251 .read_u64 = mem_cgroup_hierarchy_read, 6268 .read_u64 = mem_cgroup_hierarchy_read,
6252 }, 6269 },
6253 { 6270 {
6254 .name = "cgroup.event_control", 6271 .name = "cgroup.event_control", /* XXX: for compat */
6255 .write_string = cgroup_write_event_control, 6272 .write_string = memcg_write_event_control,
6256 .flags = CFTYPE_NO_PREFIX, 6273 .flags = CFTYPE_NO_PREFIX,
6257 .mode = S_IWUGO, 6274 .mode = S_IWUGO,
6258 }, 6275 },
@@ -6585,7 +6602,7 @@ static void mem_cgroup_invalidate_reclaim_iterators(struct mem_cgroup *memcg)
6585static void mem_cgroup_css_offline(struct cgroup_subsys_state *css) 6602static void mem_cgroup_css_offline(struct cgroup_subsys_state *css)
6586{ 6603{
6587 struct mem_cgroup *memcg = mem_cgroup_from_css(css); 6604 struct mem_cgroup *memcg = mem_cgroup_from_css(css);
6588 struct cgroup_event *event, *tmp; 6605 struct mem_cgroup_event *event, *tmp;
6589 6606
6590 /* 6607 /*
6591 * Unregister events and notify userspace. 6608 * Unregister events and notify userspace.