[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20140715121935.GB9366@dhcp22.suse.cz>
Date: Tue, 15 Jul 2014 14:19:35 +0200
From: Michal Hocko <mhocko@...e.cz>
To: Johannes Weiner <hannes@...xchg.org>
Cc: Andrew Morton <akpm@...ux-foundation.org>,
Hugh Dickins <hughd@...gle.com>, Tejun Heo <tj@...nel.org>,
Vladimir Davydov <vdavydov@...allels.com>, linux-mm@...ck.org,
cgroups@...r.kernel.org, linux-kernel@...r.kernel.org
Subject: Re: [patch 13/13] mm: memcontrol: rewrite uncharge API
[...]
> +/**
> + * 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@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists