aboutsummaryrefslogtreecommitdiffstats
path: root/mm/memcontrol.c
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2013-11-22 18:20:43 -0500
committerTejun Heo <tj@kernel.org>2013-11-22 18:20:43 -0500
commit59b6f87344ab5eb3057e5844b8cd8a39e668f477 (patch)
tree889411e1dd5023e63dfbd723e770669824c5072d /mm/memcontrol.c
parent347c4a8747104a945ecced358944e42879176ca5 (diff)
memcg: make cgroup_event deal with mem_cgroup instead of cgroup_subsys_state
cgroup_event is now memcg specific. Replace cgroup_event->css with ->memcg and convert [un]register_event() callbacks to take mem_cgroup pointer instead of cgroup_subsys_state one. This simplifies the code slightly and makes css_to_vmpressure() unnecessary which is removed. 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>
Diffstat (limited to 'mm/memcontrol.c')
-rw-r--r--mm/memcontrol.c53
1 files changed, 22 insertions, 31 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 3c93dcfd26da..42f2843af1a7 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -233,9 +233,9 @@ struct mem_cgroup_eventfd_list {
233 */ 233 */
234struct cgroup_event { 234struct cgroup_event {
235 /* 235 /*
236 * css which the event belongs to. 236 * memcg which the event belongs to.
237 */ 237 */
238 struct cgroup_subsys_state *css; 238 struct mem_cgroup *memcg;
239 /* 239 /*
240 * eventfd to signal userspace about the event. 240 * eventfd to signal userspace about the event.
241 */ 241 */
@@ -249,14 +249,14 @@ struct cgroup_event {
249 * waiter for changes related to this event. Use eventfd_signal() 249 * waiter for changes related to this event. Use eventfd_signal()
250 * on eventfd to send notification to userspace. 250 * on eventfd to send notification to userspace.
251 */ 251 */
252 int (*register_event)(struct cgroup_subsys_state *css, 252 int (*register_event)(struct mem_cgroup *memcg,
253 struct eventfd_ctx *eventfd, const char *args); 253 struct eventfd_ctx *eventfd, const char *args);
254 /* 254 /*
255 * unregister_event() callback will be called when userspace closes 255 * unregister_event() callback will be called when userspace closes
256 * the eventfd or on cgroup removing. This callback must be set, 256 * the eventfd or on cgroup removing. This callback must be set,
257 * if you want provide notification functionality. 257 * if you want provide notification functionality.
258 */ 258 */
259 void (*unregister_event)(struct cgroup_subsys_state *css, 259 void (*unregister_event)(struct mem_cgroup *memcg,
260 struct eventfd_ctx *eventfd); 260 struct eventfd_ctx *eventfd);
261 /* 261 /*
262 * All fields below needed to unregister event when 262 * All fields below needed to unregister event when
@@ -535,11 +535,6 @@ struct cgroup_subsys_state *vmpressure_to_css(struct vmpressure *vmpr)
535 return &container_of(vmpr, struct mem_cgroup, vmpressure)->css; 535 return &container_of(vmpr, struct mem_cgroup, vmpressure)->css;
536} 536}
537 537
538struct vmpressure *css_to_vmpressure(struct cgroup_subsys_state *css)
539{
540 return &mem_cgroup_from_css(css)->vmpressure;
541}
542
543static inline bool mem_cgroup_is_root(struct mem_cgroup *memcg) 538static inline bool mem_cgroup_is_root(struct mem_cgroup *memcg)
544{ 539{
545 return (memcg == root_mem_cgroup); 540 return (memcg == root_mem_cgroup);
@@ -5682,10 +5677,9 @@ static void mem_cgroup_oom_notify(struct mem_cgroup *memcg)
5682 mem_cgroup_oom_notify_cb(iter); 5677 mem_cgroup_oom_notify_cb(iter);
5683} 5678}
5684 5679
5685static int __mem_cgroup_usage_register_event(struct cgroup_subsys_state *css, 5680static int __mem_cgroup_usage_register_event(struct mem_cgroup *memcg,
5686 struct eventfd_ctx *eventfd, const char *args, enum res_type type) 5681 struct eventfd_ctx *eventfd, const char *args, enum res_type type)
5687{ 5682{
5688 struct mem_cgroup *memcg = mem_cgroup_from_css(css);
5689 struct mem_cgroup_thresholds *thresholds; 5683 struct mem_cgroup_thresholds *thresholds;
5690 struct mem_cgroup_threshold_ary *new; 5684 struct mem_cgroup_threshold_ary *new;
5691 u64 threshold, usage; 5685 u64 threshold, usage;
@@ -5764,22 +5758,21 @@ unlock:
5764 return ret; 5758 return ret;
5765} 5759}
5766 5760
5767static int mem_cgroup_usage_register_event(struct cgroup_subsys_state *css, 5761static int mem_cgroup_usage_register_event(struct mem_cgroup *memcg,
5768 struct eventfd_ctx *eventfd, const char *args) 5762 struct eventfd_ctx *eventfd, const char *args)
5769{ 5763{
5770 return __mem_cgroup_usage_register_event(css, eventfd, args, _MEM); 5764 return __mem_cgroup_usage_register_event(memcg, eventfd, args, _MEM);
5771} 5765}
5772 5766
5773static int memsw_cgroup_usage_register_event(struct cgroup_subsys_state *css, 5767static int memsw_cgroup_usage_register_event(struct mem_cgroup *memcg,
5774 struct eventfd_ctx *eventfd, const char *args) 5768 struct eventfd_ctx *eventfd, const char *args)
5775{ 5769{
5776 return __mem_cgroup_usage_register_event(css, eventfd, args, _MEMSWAP); 5770 return __mem_cgroup_usage_register_event(memcg, eventfd, args, _MEMSWAP);
5777} 5771}
5778 5772
5779static void __mem_cgroup_usage_unregister_event(struct cgroup_subsys_state *css, 5773static void __mem_cgroup_usage_unregister_event(struct mem_cgroup *memcg,
5780 struct eventfd_ctx *eventfd, enum res_type type) 5774 struct eventfd_ctx *eventfd, enum res_type type)
5781{ 5775{
5782 struct mem_cgroup *memcg = mem_cgroup_from_css(css);
5783 struct mem_cgroup_thresholds *thresholds; 5776 struct mem_cgroup_thresholds *thresholds;
5784 struct mem_cgroup_threshold_ary *new; 5777 struct mem_cgroup_threshold_ary *new;
5785 u64 usage; 5778 u64 usage;
@@ -5854,22 +5847,21 @@ unlock:
5854 mutex_unlock(&memcg->thresholds_lock); 5847 mutex_unlock(&memcg->thresholds_lock);
5855} 5848}
5856 5849
5857static void mem_cgroup_usage_unregister_event(struct cgroup_subsys_state *css, 5850static void mem_cgroup_usage_unregister_event(struct mem_cgroup *memcg,
5858 struct eventfd_ctx *eventfd) 5851 struct eventfd_ctx *eventfd)
5859{ 5852{
5860 return __mem_cgroup_usage_unregister_event(css, eventfd, _MEM); 5853 return __mem_cgroup_usage_unregister_event(memcg, eventfd, _MEM);
5861} 5854}
5862 5855
5863static void memsw_cgroup_usage_unregister_event(struct cgroup_subsys_state *css, 5856static void memsw_cgroup_usage_unregister_event(struct mem_cgroup *memcg,
5864 struct eventfd_ctx *eventfd) 5857 struct eventfd_ctx *eventfd)
5865{ 5858{
5866 return __mem_cgroup_usage_unregister_event(css, eventfd, _MEMSWAP); 5859 return __mem_cgroup_usage_unregister_event(memcg, eventfd, _MEMSWAP);
5867} 5860}
5868 5861
5869static int mem_cgroup_oom_register_event(struct cgroup_subsys_state *css, 5862static int mem_cgroup_oom_register_event(struct mem_cgroup *memcg,
5870 struct eventfd_ctx *eventfd, const char *args) 5863 struct eventfd_ctx *eventfd, const char *args)
5871{ 5864{
5872 struct mem_cgroup *memcg = mem_cgroup_from_css(css);
5873 struct mem_cgroup_eventfd_list *event; 5865 struct mem_cgroup_eventfd_list *event;
5874 5866
5875 event = kmalloc(sizeof(*event), GFP_KERNEL); 5867 event = kmalloc(sizeof(*event), GFP_KERNEL);
@@ -5889,10 +5881,9 @@ static int mem_cgroup_oom_register_event(struct cgroup_subsys_state *css,
5889 return 0; 5881 return 0;
5890} 5882}
5891 5883
5892static void mem_cgroup_oom_unregister_event(struct cgroup_subsys_state *css, 5884static void mem_cgroup_oom_unregister_event(struct mem_cgroup *memcg,
5893 struct eventfd_ctx *eventfd) 5885 struct eventfd_ctx *eventfd)
5894{ 5886{
5895 struct mem_cgroup *memcg = mem_cgroup_from_css(css);
5896 struct mem_cgroup_eventfd_list *ev, *tmp; 5887 struct mem_cgroup_eventfd_list *ev, *tmp;
5897 5888
5898 spin_lock(&memcg_oom_lock); 5889 spin_lock(&memcg_oom_lock);
@@ -6019,18 +6010,18 @@ static void cgroup_event_remove(struct work_struct *work)
6019{ 6010{
6020 struct cgroup_event *event = container_of(work, struct cgroup_event, 6011 struct cgroup_event *event = container_of(work, struct cgroup_event,
6021 remove); 6012 remove);
6022 struct cgroup_subsys_state *css = event->css; 6013 struct mem_cgroup *memcg = event->memcg;
6023 6014
6024 remove_wait_queue(event->wqh, &event->wait); 6015 remove_wait_queue(event->wqh, &event->wait);
6025 6016
6026 event->unregister_event(css, event->eventfd); 6017 event->unregister_event(memcg, event->eventfd);
6027 6018
6028 /* Notify userspace the event is going away. */ 6019 /* Notify userspace the event is going away. */
6029 eventfd_signal(event->eventfd, 1); 6020 eventfd_signal(event->eventfd, 1);
6030 6021
6031 eventfd_ctx_put(event->eventfd); 6022 eventfd_ctx_put(event->eventfd);
6032 kfree(event); 6023 kfree(event);
6033 css_put(css); 6024 css_put(&memcg->css);
6034} 6025}
6035 6026
6036/* 6027/*
@@ -6043,7 +6034,7 @@ static int cgroup_event_wake(wait_queue_t *wait, unsigned mode,
6043{ 6034{
6044 struct cgroup_event *event = container_of(wait, 6035 struct cgroup_event *event = container_of(wait,
6045 struct cgroup_event, wait); 6036 struct cgroup_event, wait);
6046 struct mem_cgroup *memcg = mem_cgroup_from_css(event->css); 6037 struct mem_cgroup *memcg = event->memcg;
6047 unsigned long flags = (unsigned long)key; 6038 unsigned long flags = (unsigned long)key;
6048 6039
6049 if (flags & POLLHUP) { 6040 if (flags & POLLHUP) {
@@ -6114,7 +6105,7 @@ static int cgroup_write_event_control(struct cgroup_subsys_state *css,
6114 if (!event) 6105 if (!event)
6115 return -ENOMEM; 6106 return -ENOMEM;
6116 6107
6117 event->css = css; 6108 event->memcg = memcg;
6118 INIT_LIST_HEAD(&event->list); 6109 INIT_LIST_HEAD(&event->list);
6119 init_poll_funcptr(&event->pt, cgroup_event_ptable_queue_proc); 6110 init_poll_funcptr(&event->pt, cgroup_event_ptable_queue_proc);
6120 init_waitqueue_func_entry(&event->wait, cgroup_event_wake); 6111 init_waitqueue_func_entry(&event->wait, cgroup_event_wake);
@@ -6186,7 +6177,7 @@ static int cgroup_write_event_control(struct cgroup_subsys_state *css,
6186 if (ret) 6177 if (ret)
6187 goto out_put_cfile; 6178 goto out_put_cfile;
6188 6179
6189 ret = event->register_event(css, event->eventfd, buffer); 6180 ret = event->register_event(memcg, event->eventfd, buffer);
6190 if (ret) 6181 if (ret)
6191 goto out_put_css; 6182 goto out_put_css;
6192 6183