Commit 3bc942f3 authored by Tejun Heo's avatar Tejun Heo

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: default avatarTejun Heo <tj@kernel.org>
Acked-by: default avatarLi Zefan <lizefan@huawei.com>
Acked-by: default avatarKirill A. Shutemov <kirill.shutemov@linux.intel.com>
Acked-by: default avatarMichal Hocko <mhocko@suse.cz>
parent 59b6f873
...@@ -24,7 +24,6 @@ CONTENTS: ...@@ -24,7 +24,6 @@ CONTENTS:
2.1 Basic Usage 2.1 Basic Usage
2.2 Attaching processes 2.2 Attaching processes
2.3 Mounting hierarchies by name 2.3 Mounting hierarchies by name
2.4 Notification API
3. Kernel API 3. Kernel API
3.1 Overview 3.1 Overview
3.2 Synchronization 3.2 Synchronization
...@@ -472,25 +471,6 @@ you give a subsystem a name. ...@@ -472,25 +471,6 @@ you give a subsystem a name.
The name of the subsystem appears as part of the hierarchy description The name of the subsystem appears as part of the hierarchy description
in /proc/mounts and /proc/<pid>/cgroups. 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 3. Kernel API
============= =============
......
...@@ -231,7 +231,7 @@ struct mem_cgroup_eventfd_list { ...@@ -231,7 +231,7 @@ struct mem_cgroup_eventfd_list {
/* /*
* cgroup_event represents events which userspace want to receive. * cgroup_event represents events which userspace want to receive.
*/ */
struct cgroup_event { struct mem_cgroup_event {
/* /*
* memcg which the event belongs to. * memcg which the event belongs to.
*/ */
...@@ -6001,15 +6001,28 @@ static void kmem_cgroup_css_offline(struct mem_cgroup *memcg) ...@@ -6001,15 +6001,28 @@ static void kmem_cgroup_css_offline(struct mem_cgroup *memcg)
} }
#endif #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. * Unregister event and free resources.
* *
* Gets called from workqueue. * 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, struct mem_cgroup_event *event =
remove); container_of(work, struct mem_cgroup_event, remove);
struct mem_cgroup *memcg = event->memcg; struct mem_cgroup *memcg = event->memcg;
remove_wait_queue(event->wqh, &event->wait); remove_wait_queue(event->wqh, &event->wait);
...@@ -6029,11 +6042,11 @@ static void cgroup_event_remove(struct work_struct *work) ...@@ -6029,11 +6042,11 @@ static void cgroup_event_remove(struct work_struct *work)
* *
* Called with wqh->lock held and interrupts disabled. * Called with wqh->lock held and interrupts disabled.
*/ */
static int cgroup_event_wake(wait_queue_t *wait, unsigned mode, static int memcg_event_wake(wait_queue_t *wait, unsigned mode,
int sync, void *key) int sync, void *key)
{ {
struct cgroup_event *event = container_of(wait, struct mem_cgroup_event *event =
struct cgroup_event, wait); container_of(wait, struct mem_cgroup_event, wait);
struct mem_cgroup *memcg = event->memcg; struct mem_cgroup *memcg = event->memcg;
unsigned long flags = (unsigned long)key; unsigned long flags = (unsigned long)key;
...@@ -6062,27 +6075,29 @@ static int cgroup_event_wake(wait_queue_t *wait, unsigned mode, ...@@ -6062,27 +6075,29 @@ static int cgroup_event_wake(wait_queue_t *wait, unsigned mode,
return 0; 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) wait_queue_head_t *wqh, poll_table *pt)
{ {
struct cgroup_event *event = container_of(pt, struct mem_cgroup_event *event =
struct cgroup_event, pt); container_of(pt, struct mem_cgroup_event, pt);
event->wqh = wqh; event->wqh = wqh;
add_wait_queue(wqh, &event->wait); add_wait_queue(wqh, &event->wait);
} }
/* /*
* DO NOT USE IN NEW FILES.
*
* Parse input and register new cgroup event handler. * Parse input and register new cgroup event handler.
* *
* Input must be in format '<event_fd> <control_fd> <args>'. * Input must be in format '<event_fd> <control_fd> <args>'.
* Interpretation of args is defined by control file implementation. * Interpretation of args is defined by control file implementation.
*/ */
static int cgroup_write_event_control(struct cgroup_subsys_state *css, static int memcg_write_event_control(struct cgroup_subsys_state *css,
struct cftype *cft, const char *buffer) struct cftype *cft, const char *buffer)
{ {
struct mem_cgroup *memcg = mem_cgroup_from_css(css); struct mem_cgroup *memcg = mem_cgroup_from_css(css);
struct cgroup_event *event; struct mem_cgroup_event *event;
struct cgroup_subsys_state *cfile_css; struct cgroup_subsys_state *cfile_css;
unsigned int efd, cfd; unsigned int efd, cfd;
struct fd efile; struct fd efile;
...@@ -6107,9 +6122,9 @@ static int cgroup_write_event_control(struct cgroup_subsys_state *css, ...@@ -6107,9 +6122,9 @@ static int cgroup_write_event_control(struct cgroup_subsys_state *css,
event->memcg = memcg; event->memcg = memcg;
INIT_LIST_HEAD(&event->list); INIT_LIST_HEAD(&event->list);
init_poll_funcptr(&event->pt, cgroup_event_ptable_queue_proc); init_poll_funcptr(&event->pt, memcg_event_ptable_queue_proc);
init_waitqueue_func_entry(&event->wait, cgroup_event_wake); init_waitqueue_func_entry(&event->wait, memcg_event_wake);
INIT_WORK(&event->remove, cgroup_event_remove); INIT_WORK(&event->remove, memcg_event_remove);
efile = fdget(efd); efile = fdget(efd);
if (!efile.file) { if (!efile.file) {
...@@ -6140,6 +6155,8 @@ static int cgroup_write_event_control(struct cgroup_subsys_state *css, ...@@ -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 * to be done via struct cftype but cgroup core no longer knows
* about these events. The following is crude but the whole thing * about these events. The following is crude but the whole thing
* is for compatibility anyway. * is for compatibility anyway.
*
* DO NOT ADD NEW FILES.
*/ */
name = cfile.file->f_dentry->d_name.name; name = cfile.file->f_dentry->d_name.name;
...@@ -6251,8 +6268,8 @@ static struct cftype mem_cgroup_files[] = { ...@@ -6251,8 +6268,8 @@ static struct cftype mem_cgroup_files[] = {
.read_u64 = mem_cgroup_hierarchy_read, .read_u64 = mem_cgroup_hierarchy_read,
}, },
{ {
.name = "cgroup.event_control", .name = "cgroup.event_control", /* XXX: for compat */
.write_string = cgroup_write_event_control, .write_string = memcg_write_event_control,
.flags = CFTYPE_NO_PREFIX, .flags = CFTYPE_NO_PREFIX,
.mode = S_IWUGO, .mode = S_IWUGO,
}, },
...@@ -6585,7 +6602,7 @@ static void mem_cgroup_invalidate_reclaim_iterators(struct mem_cgroup *memcg) ...@@ -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) static void mem_cgroup_css_offline(struct cgroup_subsys_state *css)
{ {
struct mem_cgroup *memcg = mem_cgroup_from_css(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. * Unregister events and notify userspace.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment