From 78fb74669e80883323391090e4d26d17fe29488f Mon Sep 17 00:00:00 2001 From: Pavel Emelianov Date: Thu, 7 Feb 2008 00:13:51 -0800 Subject: Memory controller: accounting setup Basic setup routines, the mm_struct has a pointer to the cgroup that it belongs to and the the page has a page_cgroup associated with it. Signed-off-by: Pavel Emelianov Signed-off-by: Balbir Singh Cc: Paul Menage Cc: Peter Zijlstra Cc: "Eric W. Biederman" Cc: Nick Piggin Cc: Kirill Korotaev Cc: Herbert Poetzl Cc: David Rientjes Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- mm/memcontrol.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 4 deletions(-) (limited to 'mm/memcontrol.c') diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 80e48cd9d0c..4d4805eb37c 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -3,6 +3,9 @@ * Copyright IBM Corporation, 2007 * Author Balbir Singh * + * Copyright 2007 OpenVZ SWsoft Inc + * Author: Pavel Emelianov + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -17,6 +20,7 @@ #include #include #include +#include struct cgroup_subsys mem_cgroup_subsys; @@ -35,6 +39,13 @@ struct mem_cgroup { * the counter to account for memory usage */ struct res_counter res; + /* + * Per cgroup active and inactive list, similar to the + * per zone LRU lists. + * TODO: Consider making these lists per zone + */ + struct list_head active_list; + struct list_head inactive_list; }; /* @@ -56,6 +67,37 @@ struct mem_cgroup *mem_cgroup_from_cont(struct cgroup *cont) css); } +static inline +struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p) +{ + return container_of(task_subsys_state(p, mem_cgroup_subsys_id), + struct mem_cgroup, css); +} + +void mm_init_cgroup(struct mm_struct *mm, struct task_struct *p) +{ + struct mem_cgroup *mem; + + mem = mem_cgroup_from_task(p); + css_get(&mem->css); + mm->mem_cgroup = mem; +} + +void mm_free_cgroup(struct mm_struct *mm) +{ + css_put(&mm->mem_cgroup->css); +} + +void page_assign_page_cgroup(struct page *page, struct page_cgroup *pc) +{ + page->page_cgroup = (unsigned long)pc; +} + +struct page_cgroup *page_get_page_cgroup(struct page *page) +{ + return page->page_cgroup; +} + static ssize_t mem_cgroup_read(struct cgroup *cont, struct cftype *cft, struct file *file, char __user *userbuf, size_t nbytes, loff_t *ppos) @@ -91,14 +133,21 @@ static struct cftype mem_cgroup_files[] = { }, }; +static struct mem_cgroup init_mem_cgroup; + static struct cgroup_subsys_state * mem_cgroup_create(struct cgroup_subsys *ss, struct cgroup *cont) { struct mem_cgroup *mem; - mem = kzalloc(sizeof(struct mem_cgroup), GFP_KERNEL); - if (!mem) - return -ENOMEM; + if (unlikely((cont->parent) == NULL)) { + mem = &init_mem_cgroup; + init_mm.mem_cgroup = mem; + } else + mem = kzalloc(sizeof(struct mem_cgroup), GFP_KERNEL); + + if (mem == NULL) + return NULL; res_counter_init(&mem->res); return &mem->css; @@ -123,5 +172,5 @@ struct cgroup_subsys mem_cgroup_subsys = { .create = mem_cgroup_create, .destroy = mem_cgroup_destroy, .populate = mem_cgroup_populate, - .early_init = 0, + .early_init = 1, }; -- cgit v1.2.3