Skip to content

Commit

Permalink
thp: improve order in lru list for split huge page
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Andrea Arcangeli <[email protected]>
Cc: David Rientjes <[email protected]>
Cc: Johannes Weiner <[email protected]>
Cc: Minchan Kim <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Shaohua Li authored and torvalds committed Jan 13, 2012
1 parent f21760b commit 4567688
Show file tree
Hide file tree
Showing 2 changed files with 3 additions and 4 deletions.
5 changes: 2 additions & 3 deletions mm/huge_memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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 */
Expand Down Expand Up @@ -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));
Expand Down
2 changes: 1 addition & 1 deletion mm/swap.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down

0 comments on commit 4567688

Please sign in to comment.