From: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
To: Andi Kleen <andi@firstfloor.org>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Mel Gorman <mel@csn.ul.ie>, Wu Fengguang <fengguang.wu@intel.com>,
Jun'ichi Nomura <j-nomura@ce.jp.nec.com>,
linux-mm <linux-mm@kvack.org>,
LKML <linux-kernel@vger.kernel.org>
Subject: [PATCH 5/7] hugetlb: pin oldpage in page migration
Date: Fri, 2 Jul 2010 14:47:24 +0900 [thread overview]
Message-ID: <1278049646-29769-6-git-send-email-n-horiguchi@ah.jp.nec.com> (raw)
In-Reply-To: <1278049646-29769-1-git-send-email-n-horiguchi@ah.jp.nec.com>
This patch introduces pinning the old page during page migration
to avoid freeing it before we complete copying.
This race condition can happen for privately mapped or anonymous hugepage.
Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Signed-off-by: Jun'ichi Nomura <j-nomura@ce.jp.nec.com>
---
mm/migrate.c | 26 +++++++++++++++++++++++---
1 files changed, 23 insertions(+), 3 deletions(-)
diff --git v2.6.35-rc3-hwpoison/mm/migrate.c v2.6.35-rc3-hwpoison/mm/migrate.c
index 4205b1d..e4a381c 100644
--- v2.6.35-rc3-hwpoison/mm/migrate.c
+++ v2.6.35-rc3-hwpoison/mm/migrate.c
@@ -214,7 +214,7 @@ static int migrate_page_move_mapping(struct address_space *mapping,
if (!mapping) {
/* Anonymous page without mapping */
- if (page_count(page) != 1)
+ if (page_count(page) != 2 - PageHuge(page))
return -EAGAIN;
return 0;
}
@@ -224,7 +224,11 @@ static int migrate_page_move_mapping(struct address_space *mapping,
pslot = radix_tree_lookup_slot(&mapping->page_tree,
page_index(page));
- expected_count = 2 + page_has_private(page);
+ /*
+ * Hugepages are expected to have only one remained reference
+ * from pagecache, because hugepages are not linked to LRU list.
+ */
+ expected_count = 3 + page_has_private(page) - PageHuge(page);
if (page_count(page) != expected_count ||
(struct page *)radix_tree_deref_slot(pslot) != page) {
spin_unlock_irq(&mapping->tree_lock);
@@ -561,7 +565,11 @@ static int unmap_and_move(new_page_t get_new_page, unsigned long private,
if (!newpage)
return -ENOMEM;
- if (page_count(page) == 1) {
+ /*
+ * For anonymous hugepages, reference count is equal to mapcount,
+ * so don't consider migration is done for anonymou hugepage.
+ */
+ if (page_count(page) == 1 && !(PageHuge(page) && PageAnon(page))) {
/* page was freed from under us. So we are done. */
goto move_newpage;
}
@@ -644,6 +652,16 @@ static int unmap_and_move(new_page_t get_new_page, unsigned long private,
}
/*
+ * It's reasonable to pin the old page until unmapping and copying
+ * complete, because when the original page is an anonymous hugepage,
+ * it will be freed in try_to_unmap() due to the fact that
+ * all references of anonymous hugepage come from mapcount.
+ * Although in the other cases no problem comes out without pinning,
+ * it looks logically correct to do it.
+ */
+ get_page(page);
+
+ /*
* Corner case handling:
* 1. When a new swap-cache page is read into, it is added to the LRU
* and treated as swapcache but it has no rmap yet.
@@ -697,6 +715,8 @@ uncharge:
unlock:
unlock_page(page);
+ put_page(page);
+
if (rc != -EAGAIN) {
/*
* A page that has been migrated has all references
--
1.7.1
--
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/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2010-07-02 5:49 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-07-02 5:47 [PATCH 0/7] hugepage migration Naoya Horiguchi
2010-07-02 5:47 ` [PATCH 1/7] hugetlb: add missing unlock in avoidcopy path in hugetlb_cow() Naoya Horiguchi
2010-07-02 8:31 ` Andi Kleen
2010-07-05 8:44 ` Naoya Horiguchi
2010-07-07 22:17 ` Andi Kleen
2010-07-02 5:47 ` [PATCH 2/7] hugetlb, HWPOISON: move PG_HWPoison bit check Naoya Horiguchi
2010-07-02 5:47 ` [PATCH 3/7] hugetlb: add allocate function for hugepage migration Naoya Horiguchi
2010-07-02 9:08 ` Andi Kleen
2010-07-05 8:46 ` Naoya Horiguchi
2010-07-05 9:28 ` Andi Kleen
2010-07-02 5:47 ` [PATCH 4/7] hugetlb: add hugepage check in mem_cgroup_{register,end}_migration() Naoya Horiguchi
2010-07-02 9:11 ` Andi Kleen
2010-07-02 5:47 ` Naoya Horiguchi [this message]
2010-07-05 9:45 ` [PATCH 5/7] hugetlb: pin oldpage in page migration Andi Kleen
2010-07-06 15:54 ` Christoph Lameter
2010-07-07 6:40 ` Naoya Horiguchi
2010-07-02 5:47 ` [PATCH 6/7] hugetlb: hugepage migration core Naoya Horiguchi
2010-07-05 9:59 ` Andi Kleen
2010-07-06 3:33 ` Naoya Horiguchi
2010-07-06 7:13 ` Andi Kleen
2010-07-07 6:05 ` Naoya Horiguchi
2010-07-07 9:27 ` Andi Kleen
2010-07-08 5:44 ` Naoya Horiguchi
2010-07-08 6:49 ` Andi Kleen
2010-07-06 16:02 ` Christoph Lameter
2010-07-07 6:44 ` Naoya Horiguchi
2010-07-06 16:00 ` Christoph Lameter
2010-07-07 6:45 ` Naoya Horiguchi
2010-07-02 5:47 ` [PATCH 7/7] hugetlb, HWPOISON: soft offlining for hugepage Naoya Horiguchi
2010-07-05 10:28 ` Andi Kleen
2010-07-02 8:30 ` [PATCH 0/7] hugepage migration Andi Kleen
2010-07-05 8:44 ` Naoya Horiguchi
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=1278049646-29769-6-git-send-email-n-horiguchi@ah.jp.nec.com \
--to=n-horiguchi@ah.jp.nec.com \
--cc=akpm@linux-foundation.org \
--cc=andi@firstfloor.org \
--cc=fengguang.wu@intel.com \
--cc=j-nomura@ce.jp.nec.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mel@csn.ul.ie \
/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