On Wed, Apr 30, 2014 at 05:45:27PM -0700, David Rientjes wrote: > Memory compaction works by having a "freeing scanner" scan from one end of a > zone which isolates pages as migration targets while another "migrating scanner" > scans from the other end of the same zone which isolates pages for migration. > > When page migration fails for an isolated page, the target page is returned to > the system rather than the freelist built by the freeing scanner. This may > require the freeing scanner to continue scanning memory after suitable migration > targets have already been returned to the system needlessly. > > This patch returns destination pages to the freeing scanner freelist when page > migration fails. This prevents unnecessary work done by the freeing scanner but > also encourages memory to be as compacted as possible at the end of the zone. > > Reported-by: Greg Thelen <gthelen@xxxxxxxxxx> > Signed-off-by: David Rientjes <rientjes@xxxxxxxxxx> > --- > mm/compaction.c | 17 +++++++++++++++-- > 1 file changed, 15 insertions(+), 2 deletions(-) > > diff --git a/mm/compaction.c b/mm/compaction.c > --- a/mm/compaction.c > +++ b/mm/compaction.c > @@ -797,6 +797,19 @@ static struct page *compaction_alloc(struct page *migratepage, > } > > /* > + * This is a migrate-callback that "frees" freepages back to the isolated > + * freelist. All pages on the freelist are from the same zone, so there is no > + * special handling needed for NUMA. > + */ > +static void compaction_free(struct page *page, unsigned long data) > +{ > + struct compact_control *cc = (struct compact_control *)data; > + > + list_add(&page->lru, &cc->freepages); > + cc->nr_freepages++; With this change, migration_page() handles cc->nr_freepages consistently, so we don't have to run over freelist to update this count in update_nr_listpages()? I'm not sure if that's also true for cc->nr_migratepages, but if it is, we can completely remove update_nr_listpages(). Thanks, Naoya Horiguchi -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>