[...]
> +/**
> + * 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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to