|
@@ -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);
|