cgroups: add an owner to the mm_struct
Remove the mem_cgroup member from mm_struct and instead adds an owner. This approach was suggested by Paul Menage. The advantage of this approach is that, once the mm->owner is known, using the subsystem id, the cgroup can be determined. It also allows several control groups that are virtually grouped by mm_struct, to exist independent of the memory controller i.e., without adding mem_cgroup's for each controller, to mm_struct. A new config option CONFIG_MM_OWNER is added and the memory resource controller selects this config option. This patch also adds cgroup callbacks to notify subsystems when mm->owner changes. The mm_cgroup_changed callback is called with the task_lock() of the new task held and is called just prior to changing the mm->owner. I am indebted to Paul Menage for the several reviews of this patchset and helping me make it lighter and simpler. This patch was tested on a powerpc box, it was compiled with both the MM_OWNER config turned on and off. After the thread group leader exits, it's moved to init_css_state by cgroup_exit(), thus all future charges from runnings threads would be redirected to the init_css_set's subsystem. Signed-off-by: Balbir Singh <balbir@linux.vnet.ibm.com> Cc: Pavel Emelianov <xemul@openvz.org> Cc: Hugh Dickins <hugh@veritas.com> Cc: Sudhir Kumar <skumar@linux.vnet.ibm.com> Cc: YAMAMOTO Takashi <yamamoto@valinux.co.jp> Cc: Hirokazu Takahashi <taka@valinux.co.jp> Cc: David Rientjes <rientjes@google.com>, Cc: Balbir Singh <balbir@linux.vnet.ibm.com> Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Acked-by: Pekka Enberg <penberg@cs.helsinki.fi> Reviewed-by: Paul Menage <menage@google.com> Cc: Oleg Nesterov <oleg@tv-sign.ru> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
29486df325
commit
cf475ad28a
@@ -236,26 +236,12 @@ static struct mem_cgroup *mem_cgroup_from_cont(struct cgroup *cont)
|
||||
css);
|
||||
}
|
||||
|
||||
static struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p)
|
||||
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);
|
||||
}
|
||||
|
||||
static inline int page_cgroup_locked(struct page *page)
|
||||
{
|
||||
return bit_spin_is_locked(PAGE_CGROUP_LOCK_BIT, &page->page_cgroup);
|
||||
@@ -476,6 +462,7 @@ unsigned long mem_cgroup_isolate_pages(unsigned long nr_to_scan,
|
||||
int zid = zone_idx(z);
|
||||
struct mem_cgroup_per_zone *mz;
|
||||
|
||||
BUG_ON(!mem_cont);
|
||||
mz = mem_cgroup_zoneinfo(mem_cont, nid, zid);
|
||||
if (active)
|
||||
src = &mz->active_list;
|
||||
@@ -574,7 +561,7 @@ retry:
|
||||
mm = &init_mm;
|
||||
|
||||
rcu_read_lock();
|
||||
mem = rcu_dereference(mm->mem_cgroup);
|
||||
mem = mem_cgroup_from_task(rcu_dereference(mm->owner));
|
||||
/*
|
||||
* For every charge from the cgroup, increment reference count
|
||||
*/
|
||||
@@ -985,10 +972,9 @@ mem_cgroup_create(struct cgroup_subsys *ss, struct cgroup *cont)
|
||||
struct mem_cgroup *mem;
|
||||
int node;
|
||||
|
||||
if (unlikely((cont->parent) == NULL)) {
|
||||
if (unlikely((cont->parent) == NULL))
|
||||
mem = &init_mem_cgroup;
|
||||
init_mm.mem_cgroup = mem;
|
||||
} else
|
||||
else
|
||||
mem = kzalloc(sizeof(struct mem_cgroup), GFP_KERNEL);
|
||||
|
||||
if (mem == NULL)
|
||||
@@ -1067,10 +1053,6 @@ static void mem_cgroup_move_task(struct cgroup_subsys *ss,
|
||||
if (!thread_group_leader(p))
|
||||
goto out;
|
||||
|
||||
css_get(&mem->css);
|
||||
rcu_assign_pointer(mm->mem_cgroup, mem);
|
||||
css_put(&old_mem->css);
|
||||
|
||||
out:
|
||||
mmput(mm);
|
||||
}
|
||||
|
Reference in New Issue
Block a user