Re: [patch 13/13] mm: memcontrol: rewrite uncharge API

From: Michal Hocko
Date: Tue Jul 15 2014 - 08:19:45 EST


[...]
> +/**
> + * mem_cgroup_migrate - migrate a charge to another page
> + * @oldpage: currently charged page
> + * @newpage: page to transfer the charge to
> + * @lrucare: page might be on LRU already

which one? I guess the newpage?

> + *
> + * Migrate the charge from @oldpage to @newpage.
> + *
> + * Both pages must be locked, @newpage->mapping must be set up.
> + */
> +void mem_cgroup_migrate(struct page *oldpage, struct page *newpage,
> + bool lrucare)
> +{
> + unsigned int nr_pages = 1;
> + struct page_cgroup *pc;
> +
> + VM_BUG_ON_PAGE(!PageLocked(oldpage), oldpage);
> + VM_BUG_ON_PAGE(!PageLocked(newpage), newpage);
> + VM_BUG_ON_PAGE(PageLRU(oldpage), oldpage);
> + VM_BUG_ON_PAGE(PageLRU(newpage), newpage);

VM_BUG_ON_PAGE(PageLRU(newpage) && !lruvec, newpage);

> + VM_BUG_ON_PAGE(PageAnon(oldpage) != PageAnon(newpage), newpage);
> +
> + if (mem_cgroup_disabled())
> + return;
> +
> + pc = lookup_page_cgroup(oldpage);
> + if (!PageCgroupUsed(pc))
> + return;
> +
> + /* Already migrated */
> + if (!(pc->flags & PCG_MEM))
> + return;
> +
> + VM_BUG_ON_PAGE(do_swap_account && !(pc->flags & PCG_MEMSW), oldpage);
> + pc->flags &= ~(PCG_MEM | PCG_MEMSW);

What about PCG_USED?
Wouldn't we uncharge the currently transfered charge when oldpage does
its last put_page when the migration is done?

On a not directly related note. I was quite surprised to see that
__unmap_and_move calls putback_lru_page on oldpage even when migration
succeeded. So it goes through mem_cgroup_page_lruvec which checks
PCG_USED and resets pc->mem_cgroup to root for !PCG_USED.

> +
> + if (PageTransHuge(oldpage)) {
> + nr_pages <<= compound_order(oldpage);
> + VM_BUG_ON_PAGE(!PageTransHuge(oldpage), oldpage);
> + VM_BUG_ON_PAGE(!PageTransHuge(newpage), newpage);
> + }
> +
> + commit_charge(newpage, pc->mem_cgroup, nr_pages, lrucare);
> +}
--
Michal Hocko
SUSE Labs
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/