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

From: Johannes Weiner
Date: Sat Jul 19 2014 - 13:39:30 EST


On Fri, Jul 18, 2014 at 05:12:54PM +0200, Miklos Szeredi wrote:
> On Fri, Jul 18, 2014 at 4:45 PM, Johannes Weiner <hannes@xxxxxxxxxxx> wrote:
>
> > I assumed the source page would always be new, according to this part
> > in fuse_try_move_page():
> >
> > /*
> > * This is a new and locked page, it shouldn't be mapped or
> > * have any special flags on it
> > */
> > if (WARN_ON(page_mapped(oldpage)))
> > goto out_fallback_unlock;
> > if (WARN_ON(page_has_private(oldpage)))
> > goto out_fallback_unlock;
> > if (WARN_ON(PageDirty(oldpage) || PageWriteback(oldpage)))
> > goto out_fallback_unlock;
> > if (WARN_ON(PageMlocked(oldpage)))
> > goto out_fallback_unlock;
> >
> > However, it's in the page cache and I can't really convince myself
> > that it's not also on the LRU. Miklos, I have trouble pinpointing
> > where oldpage is instantiated exactly and what state it might be in -
> > can it already be on the LRU?
>
> oldpage comes from ->readpages() (*NOT* ->readpage()), i.e. readahead.
>
> AFAICS it is added to the LRU in read_cache_pages(), so it looks like
> it is definitely on the LRU at that point.

I see, thanks!

Then we need charge migration to lock the page like I proposed. But
it's not enough: we also need to exclude isolation and putback while
we uncharge it, and make sure that if it was on the LRU it's moved to
the correct lruvec (the root memcg's):

---