On Wed, Apr 27, 2011 at 1:25 AM, Minchan Kim <minchan.kim@xxxxxxxxx> wrote: > There are some places to isolate lru page and I believe > users of isolate_lru_page will be growing. > The purpose of them is each different so part of isolated pages > should put back to LRU, again. > > The problem is when we put back the page into LRU, > we lose LRU ordering and the page is inserted at head of LRU list. > It makes unnecessary LRU churning so that vm can evict working set pages > rather than idle pages. > > This patch adds new filter mask when we isolate page in LRU. > So, we don't isolate pages if we can't handle it. > It could reduce LRU churning. > > This patch shouldn't change old behavior. > It's just used by next patches. > > Cc: KOSAKI Motohiro <kosaki.motohiro@xxxxxxxxxxxxxx> > Cc: Mel Gorman <mgorman@xxxxxxx> > Cc: Rik van Riel <riel@xxxxxxxxxx> > Cc: Andrea Arcangeli <aarcange@xxxxxxxxxx> > Signed-off-by: Minchan Kim <minchan.kim@xxxxxxxxx> > --- > Âinclude/linux/swap.h |  Â3 ++- > Âmm/compaction.c   Â|  Â2 +- > Âmm/memcontrol.c   Â|  Â2 +- > Âmm/vmscan.c     Â|  26 ++++++++++++++++++++------ > Â4 files changed, 24 insertions(+), 9 deletions(-) > > diff --git a/include/linux/swap.h b/include/linux/swap.h > index 384eb5f..baef4ad 100644 > --- a/include/linux/swap.h > +++ b/include/linux/swap.h > @@ -259,7 +259,8 @@ extern unsigned long mem_cgroup_shrink_node_zone(struct mem_cgroup *mem, >                        Âunsigned int swappiness, >                        Âstruct zone *zone, >                        Âunsigned long *nr_scanned); > -extern int __isolate_lru_page(struct page *page, int mode, int file); > +extern int __isolate_lru_page(struct page *page, int mode, int file, > +                int not_dirty, int not_mapped); > Âextern unsigned long shrink_all_memory(unsigned long nr_pages); > Âextern int vm_swappiness; > Âextern int remove_mapping(struct address_space *mapping, struct page *page); > diff --git a/mm/compaction.c b/mm/compaction.c > index 021a296..dea32e3 100644 > --- a/mm/compaction.c > +++ b/mm/compaction.c > @@ -335,7 +335,7 @@ static unsigned long isolate_migratepages(struct zone *zone, >        Â} > >        Â/* Try isolate the page */ > -        if (__isolate_lru_page(page, ISOLATE_BOTH, 0) != 0) > +        if (__isolate_lru_page(page, ISOLATE_BOTH, 0, 0, 0) != 0) >            Âcontinue; > >        ÂVM_BUG_ON(PageTransCompound(page)); > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > index c2776f1..471e7fd 100644 > --- a/mm/memcontrol.c > +++ b/mm/memcontrol.c > @@ -1193,7 +1193,7 @@ unsigned long mem_cgroup_isolate_pages(unsigned long nr_to_scan, >            Âcontinue; > >        Âscan++; > -        ret = __isolate_lru_page(page, mode, file); > +        ret = __isolate_lru_page(page, mode, file, 0, 0); >        Âswitch (ret) { >        Âcase 0: >            Âlist_move(&page->lru, dst); > diff --git a/mm/vmscan.c b/mm/vmscan.c > index b3a569f..71d2da9 100644 > --- a/mm/vmscan.c > +++ b/mm/vmscan.c > @@ -954,10 +954,13 @@ keep_lumpy: > Â* > Â* page:    page to consider > Â* mode:    one of the LRU isolation modes defined above > - * > + * file:    page be on a file LRU > + * not_dirty: Âpage should be not dirty or not writeback > + * not_mapped: page should be not mapped > Â* returns 0 on success, -ve errno on failure. > Â*/ > -int __isolate_lru_page(struct page *page, int mode, int file) > +int __isolate_lru_page(struct page *page, int mode, int file, > +                int not_dirty, int not_mapped) > Â{ >    Âint ret = -EINVAL; > > @@ -976,6 +979,12 @@ int __isolate_lru_page(struct page *page, int mode, int file) >    Âif (mode != ISOLATE_BOTH && page_is_file_cache(page) != file) >        Âreturn ret; > > +    if (not_dirty) > +        if (PageDirty(page) || PageWriteback(page)) > +            return ret; > +    if (not_mapped) > +        if (page_mapped(page)) > +            return ret; I should have fixed this return value. Now caller regards -EINVAL with BUG. I will fix it in next version. -- Kind regards, Minchan Kim -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxxx For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ Don't email: <a href