From 45676885b76237a4c236d26fe20a9b0cfdb2eb22 Mon Sep 17 00:00:00 2001 From: Shaohua Li Date: Thu, 12 Jan 2012 17:19:18 -0800 Subject: [PATCH] thp: improve order in lru list for split huge page Put the tail subpages of an isolated hugepage under splitting in the lru reclaim head as they supposedly should be isolated too next. Queues the subpages in physical order in the lru for non isolated hugepages under splitting. That might provide some theoretical cache benefit to the buddy allocator later. Signed-off-by: Shaohua Li Signed-off-by: Andrea Arcangeli Cc: David Rientjes Cc: Johannes Weiner Cc: Minchan Kim Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- mm/huge_memory.c | 5 ++--- mm/swap.c | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 5a595554bd8c..76cc3f7dd4f0 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -1228,7 +1228,6 @@ static int __split_huge_page_splitting(struct page *page, static void __split_huge_page_refcount(struct page *page) { int i; - unsigned long head_index = page->index; struct zone *zone = page_zone(page); int zonestat; int tail_count = 0; @@ -1239,7 +1238,7 @@ static void __split_huge_page_refcount(struct page *page) /* complete memcg works before add pages to LRU */ mem_cgroup_split_huge_fixup(page); - for (i = 1; i < HPAGE_PMD_NR; i++) { + for (i = HPAGE_PMD_NR - 1; i >= 1; i--) { struct page *page_tail = page + i; /* tail_page->_mapcount cannot change */ @@ -1302,7 +1301,7 @@ static void __split_huge_page_refcount(struct page *page) BUG_ON(page_tail->mapping); page_tail->mapping = page->mapping; - page_tail->index = ++head_index; + page_tail->index = page->index + i; BUG_ON(!PageAnon(page_tail)); BUG_ON(!PageUptodate(page_tail)); diff --git a/mm/swap.c b/mm/swap.c index 126da2919f60..ddccf8e0b4ae 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -681,7 +681,7 @@ void lru_add_page_tail(struct zone* zone, if (likely(PageLRU(page))) list_add(&page_tail->lru, page->lru.prev); else - list_add(&page_tail->lru, &lruvec->lists[lru]); + list_add(&page_tail->lru, lruvec->lists[lru].prev); __mod_zone_page_state(zone, NR_LRU_BASE + lru, hpage_nr_pages(page_tail)); } else {