Newer
Older
static void mem_cgroup_free(struct mem_cgroup *mem)
{
if (sizeof(*mem) < PAGE_SIZE)
kfree(mem);
else
vfree(mem);
}
static struct cgroup_subsys_state *
mem_cgroup_create(struct cgroup_subsys *ss, struct cgroup *cont)
{
struct mem_cgroup *mem;

KAMEZAWA Hiroyuki
committed
int node;
if (unlikely((cont->parent) == NULL)) {
page_cgroup_cache = KMEM_CACHE(page_cgroup, SLAB_PANIC);
} else {
mem = mem_cgroup_alloc();
if (!mem)
return ERR_PTR(-ENOMEM);

KAMEZAWA Hiroyuki
committed

KAMEZAWA Hiroyuki
committed
for_each_node_state(node, N_POSSIBLE)
if (alloc_mem_cgroup_per_zone_info(mem, node))
goto free_out;

KAMEZAWA Hiroyuki
committed
free_out:
for_each_node_state(node, N_POSSIBLE)

KAMEZAWA Hiroyuki
committed
free_mem_cgroup_per_zone_info(mem, node);

KAMEZAWA Hiroyuki
committed
if (cont->parent != NULL)
mem_cgroup_free(mem);
return ERR_PTR(-ENOMEM);
static void mem_cgroup_pre_destroy(struct cgroup_subsys *ss,
struct cgroup *cont)
{
struct mem_cgroup *mem = mem_cgroup_from_cont(cont);
mem_cgroup_force_empty(mem);
}
static void mem_cgroup_destroy(struct cgroup_subsys *ss,
struct cgroup *cont)
{

KAMEZAWA Hiroyuki
committed
int node;
struct mem_cgroup *mem = mem_cgroup_from_cont(cont);
for_each_node_state(node, N_POSSIBLE)

KAMEZAWA Hiroyuki
committed
free_mem_cgroup_per_zone_info(mem, node);

KAMEZAWA Hiroyuki
committed
mem_cgroup_free(mem_cgroup_from_cont(cont));
}
static int mem_cgroup_populate(struct cgroup_subsys *ss,
struct cgroup *cont)
{
if (mem_cgroup_subsys.disabled)
return 0;
return cgroup_add_files(cont, ss, mem_cgroup_files,
ARRAY_SIZE(mem_cgroup_files));
}
static void mem_cgroup_move_task(struct cgroup_subsys *ss,
struct cgroup *cont,
struct cgroup *old_cont,
struct task_struct *p)
{
struct mm_struct *mm;
struct mem_cgroup *mem, *old_mem;
if (mem_cgroup_subsys.disabled)
return;
mm = get_task_mm(p);
if (mm == NULL)
return;
mem = mem_cgroup_from_cont(cont);
old_mem = mem_cgroup_from_cont(old_cont);
if (mem == old_mem)
goto out;
/*
* Only thread group leaders are allowed to migrate, the mm_struct is
* in effect owned by the leader
*/
if (!thread_group_leader(p))
goto out;
out:
mmput(mm);
}
struct cgroup_subsys mem_cgroup_subsys = {
.name = "memory",
.subsys_id = mem_cgroup_subsys_id,
.create = mem_cgroup_create,
.pre_destroy = mem_cgroup_pre_destroy,
.destroy = mem_cgroup_destroy,
.populate = mem_cgroup_populate,

KAMEZAWA Hiroyuki
committed
.early_init = 0,