mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 11:41:38 -04:00
memcg: move charges to root cgroup if use_hierarchy=0
Presently, at removal of cgroup, ->pre_destroy() is called and moves charges to the parent cgroup. A major reason for returning -EBUSY from ->pre_destroy() is that the 'moving' hits the parent's resource limitation. It happens only when use_hierarchy=0. Considering use_hierarchy=0, all cgroups should be flat. So, no one cannot justify moving charges to parent...parent and children are in flat configuration, not hierarchical. This patch modifes the code to move charges to the root cgroup at rmdir/force_empty if use_hierarchy==0. This will much simplify rmdir() and reduce error in ->pre_destroy. Signed-off-by: KAMEZAWA Hiroyuki <[email protected]> Cc: Aneesh Kumar K.V <[email protected]> Cc: Michal Hocko <[email protected]> Cc: Johannes Weiner <[email protected]> Cc: Frederic Weisbecker <[email protected]> Cc: Ying Han <[email protected]> Cc: Glauber Costa <[email protected]> Reviewed-by: Tejun Heo <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
d01dd17f10
commit
cc926f7842
2 changed files with 19 additions and 28 deletions
|
|
@ -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;
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in a new issue