Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 127571
b: refs/heads/master
c: 18f59ea
h: refs/heads/master
i:
  127569: 7e31513
  127567: 3fc64e6
v: v3
  • Loading branch information
Balbir Singh authored and Linus Torvalds committed Jan 8, 2009
1 parent 15d4464 commit dda3ef6
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 5 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 6d61ef409d6ba168972f7c2f8c35baaade636a58
refs/heads/master: 18f59ea7de08db2449ba99185e8d8cc30e7acac5
61 changes: 57 additions & 4 deletions trunk/mm/memcontrol.c
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,10 @@ struct mem_cgroup {
* reclaimed from. Protected by cgroup_lock()
*/
struct mem_cgroup *last_scanned_child;
/*
* Should the accounting and control be hierarchical, per subtree?
*/
bool use_hierarchy;

int obsolete;
atomic_t refcnt;
Expand Down Expand Up @@ -1543,6 +1547,44 @@ int mem_cgroup_force_empty_write(struct cgroup *cont, unsigned int event)
}


static u64 mem_cgroup_hierarchy_read(struct cgroup *cont, struct cftype *cft)
{
return mem_cgroup_from_cont(cont)->use_hierarchy;
}

static int mem_cgroup_hierarchy_write(struct cgroup *cont, struct cftype *cft,
u64 val)
{
int retval = 0;
struct mem_cgroup *mem = mem_cgroup_from_cont(cont);
struct cgroup *parent = cont->parent;
struct mem_cgroup *parent_mem = NULL;

if (parent)
parent_mem = mem_cgroup_from_cont(parent);

cgroup_lock();
/*
* If parent's use_hiearchy is set, we can't make any modifications
* in the child subtrees. If it is unset, then the change can
* occur, provided the current cgroup has no children.
*
* For the root cgroup, parent_mem is NULL, we allow value to be
* set if there are no children.
*/
if ((!parent_mem || !parent_mem->use_hierarchy) &&
(val == 1 || val == 0)) {
if (list_empty(&cont->children))
mem->use_hierarchy = val;
else
retval = -EBUSY;
} else
retval = -EINVAL;
cgroup_unlock();

return retval;
}

static u64 mem_cgroup_read(struct cgroup *cont, struct cftype *cft)
{
struct mem_cgroup *mem = mem_cgroup_from_cont(cont);
Expand Down Expand Up @@ -1706,6 +1748,11 @@ static struct cftype mem_cgroup_files[] = {
.name = "force_empty",
.trigger = mem_cgroup_force_empty_write,
},
{
.name = "use_hierarchy",
.write_u64 = mem_cgroup_hierarchy_write,
.read_u64 = mem_cgroup_hierarchy_read,
},
};

#ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP
Expand Down Expand Up @@ -1881,12 +1928,18 @@ mem_cgroup_create(struct cgroup_subsys *ss, struct cgroup *cont)
if (cont->parent == NULL) {
enable_swap_cgroup();
parent = NULL;
} else
} else {
parent = mem_cgroup_from_cont(cont->parent);
mem->use_hierarchy = parent->use_hierarchy;
}

res_counter_init(&mem->res, parent ? &parent->res : NULL);
res_counter_init(&mem->memsw, parent ? &parent->memsw : NULL);

if (parent && parent->use_hierarchy) {
res_counter_init(&mem->res, &parent->res);
res_counter_init(&mem->memsw, &parent->memsw);
} else {
res_counter_init(&mem->res, NULL);
res_counter_init(&mem->memsw, NULL);
}

mem->last_scanned_child = NULL;

Expand Down

0 comments on commit dda3ef6

Please sign in to comment.