From: Shaohua Li <shaohua.li@intel.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: aarcange@redhat.com, Hugh Dickins <hughd@google.com>,
Rik van Riel <riel@redhat.com>, mel <mel@csn.ul.ie>,
KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
Minchan Kim <minchan.kim@gmail.com>,
linux-mm <linux-mm@kvack.org>,
lkml <linux-kernel@vger.kernel.org>
Subject: [patch 4/5]thp: correct order in lru list for split huge page
Date: Tue, 25 Oct 2011 10:59:37 +0800 [thread overview]
Message-ID: <1319511577.22361.140.camel@sli10-conroe> (raw)
If a huge page is split, all the subpages should live in lru list adjacently
because they should be taken as a whole.
In page split, with current code:
a. if huge page is in lru list, the order is: page, page+HPAGE_PMD_NR-1,
page + HPAGE_PMD_NR-2, ..., page + 1(in lru page reclaim order)
b. otherwise, the order is: page, ..other pages.., page + 1, page + 2, ...(in
lru page reclaim order). page + 1 ... page + HPAGE_PMD_NR - 1 are in the lru
reclaim tail.
In case a, the order is wrong. In case b, page is isolated (to be reclaimed),
but other tail pages will not soon.
With below patch:
in case a, the order is: page, page + 1, ... page + HPAGE_PMD_NR-1(in lru page
reclaim order).
in case b, the order is: page + 1, ... page + HPAGE_PMD_NR-1 (in lru page reclaim
order). The tail pages are in the lru reclaim head.
Signed-off-by: Shaohua Li <shaohua.li@intel.com>
---
mm/huge_memory.c | 5 ++---
mm/swap.c | 5 +++--
2 files changed, 5 insertions(+), 5 deletions(-)
Index: linux/mm/huge_memory.c
===================================================================
--- linux.orig/mm/huge_memory.c 2011-10-25 09:06:55.000000000 +0800
+++ linux/mm/huge_memory.c 2011-10-25 09:31:07.000000000 +0800
@@ -1162,7 +1162,6 @@ static int __split_huge_page_splitting(s
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;
@@ -1170,7 +1169,7 @@ static void __split_huge_page_refcount(s
spin_lock_irq(&zone->lru_lock);
compound_lock(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->_count cannot change */
@@ -1221,7 +1220,7 @@ static void __split_huge_page_refcount(s
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));
Index: linux/mm/swap.c
===================================================================
--- linux.orig/mm/swap.c 2011-10-25 08:36:09.000000000 +0800
+++ linux/mm/swap.c 2011-10-25 09:31:07.000000000 +0800
@@ -661,11 +661,12 @@ void lru_add_page_tail(struct zone* zone
if (likely(PageLRU(page)))
head = page->lru.prev;
else
- head = &zone->lru[lru].list;
+ head = zone->lru[lru].list.prev;
__add_page_to_lru_list(zone, page_tail, lru, head);
} else {
SetPageUnevictable(page_tail);
- add_page_to_lru_list(zone, page_tail, LRU_UNEVICTABLE);
+ head = zone->lru[LRU_UNEVICTABLE].list.prev;
+ __add_page_to_lru_list(zone, page_tail, LRU_UNEVICTABLE, head);
}
}
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. 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=mailto:"dont@kvack.org"> email@kvack.org </a>
next reply other threads:[~2011-10-25 2:52 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-25 2:59 Shaohua Li [this message]
2011-10-27 23:19 ` [patch 4/5]thp: correct order in lru list for split huge page Minchan Kim
2011-10-28 5:08 ` Shaohua Li
2011-10-28 7:21 ` Minchan Kim
2011-11-10 2:39 ` Andrea Arcangeli
2011-11-10 15:57 ` Andrea Arcangeli
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1319511577.22361.140.camel@sli10-conroe \
--to=shaohua.li@intel.com \
--cc=aarcange@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=hughd@google.com \
--cc=kamezawa.hiroyu@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mel@csn.ul.ie \
--cc=minchan.kim@gmail.com \
--cc=riel@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).