Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 308920
b: refs/heads/master
c: cc926f7
h: refs/heads/master
v: v3
  • Loading branch information
KAMEZAWA Hiroyuki authored and Linus Torvalds committed May 29, 2012
1 parent d01eb31 commit 08766a6
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 29 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: d01dd17f1067ca50dbb9d1d3400d33221ce339e7
refs/heads/master: cc926f78420705817b807dbec0c5d3643827eba3
13 changes: 8 additions & 5 deletions trunk/Documentation/cgroups/memory.txt
Original file line number Diff line number Diff line change
Expand Up @@ -376,14 +376,15 @@ cgroup might have some charge associated with it, even though all
tasks have migrated away from it. (because we charge against pages, not
against tasks.)

Such charges are freed or moved to their parent. At moving, both of RSS
and CACHES are moved to parent.
rmdir() may return -EBUSY if freeing/moving fails. See 5.1 also.
We move the stats to root (if use_hierarchy==0) or parent (if
use_hierarchy==1), and no change on the charge except uncharging
from the child.

Charges recorded in swap information is not updated at removal of cgroup.
Recorded information is discarded and a cgroup which uses swap (swapcache)
will be charged as a new owner of it.

About use_hierarchy, see Section 6.

5. Misc. interfaces.

Expand All @@ -396,13 +397,15 @@ will be charged as a new owner of it.

Almost all pages tracked by this memory cgroup will be unmapped and freed.
Some pages cannot be freed because they are locked or in-use. Such pages are
moved to parent and this cgroup will be empty. This may return -EBUSY if
VM is too busy to free/move all pages immediately.
moved to parent(if use_hierarchy==1) or root (if use_hierarchy==0) and this
cgroup will be empty.

Typical use case of this interface is that calling this before rmdir().
Because rmdir() moves all pages to parent, some out-of-use page caches can be
moved to the parent. If you want to avoid that, force_empty will be useful.

About use_hierarchy, see Section 6.

5.2 stat file

memory.stat file includes following statistics
Expand Down
34 changes: 11 additions & 23 deletions trunk/mm/memcontrol.c
Original file line number Diff line number Diff line change
Expand Up @@ -2678,15 +2678,13 @@ static int mem_cgroup_move_parent(struct page *page,
struct mem_cgroup *child,
gfp_t gfp_mask)
{
struct cgroup *cg = child->css.cgroup;
struct cgroup *pcg = cg->parent;
struct mem_cgroup *parent;
unsigned int nr_pages;
unsigned long uninitialized_var(flags);
int ret;

/* Is ROOT ? */
if (!pcg)
if (mem_cgroup_is_root(child))
return -EINVAL;

ret = -EBUSY;
Expand All @@ -2697,33 +2695,23 @@ static int mem_cgroup_move_parent(struct page *page,

nr_pages = hpage_nr_pages(page);

parent = mem_cgroup_from_cont(pcg);
if (!parent->use_hierarchy) {
ret = __mem_cgroup_try_charge(NULL,
gfp_mask, nr_pages, &parent, false);
if (ret)
goto put_back;
}
parent = parent_mem_cgroup(child);
/*
* If no parent, move charges to root cgroup.
*/
if (!parent)
parent = root_mem_cgroup;

if (nr_pages > 1)
flags = compound_lock_irqsave(page);

if (parent->use_hierarchy) {
ret = mem_cgroup_move_account(page, nr_pages,
pc, child, parent, false);
if (!ret)
__mem_cgroup_cancel_local_charge(child, nr_pages);
} else {
ret = mem_cgroup_move_account(page, nr_pages,
pc, child, parent, true);

if (ret)
__mem_cgroup_cancel_charge(parent, nr_pages);
}
ret = mem_cgroup_move_account(page, nr_pages,
pc, child, parent, false);
if (!ret)
__mem_cgroup_cancel_local_charge(child, nr_pages);

if (nr_pages > 1)
compound_unlock_irqrestore(page, flags);
put_back:
putback_lru_page(page);
put:
put_page(page);
Expand Down

0 comments on commit 08766a6

Please sign in to comment.