From: Minchan Kim <minchan@kernel.org>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
Mel Gorman <mgorman@suse.de>,
Kamezawa Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>,
Xishi Qiu <qiuxishi@huawei.com>,
Wen Congyang <wency@cn.fujitsu.com>,
Minchan Kim <minchan@kernel.org>
Subject: [PATCH v3 4/4] memory-hotplug: fix pages missed by race rather than failng
Date: Fri, 7 Sep 2012 09:39:32 +0900 [thread overview]
Message-ID: <1346978372-17903-5-git-send-email-minchan@kernel.org> (raw)
In-Reply-To: <1346978372-17903-1-git-send-email-minchan@kernel.org>
If race between allocation and isolation in memory-hotplug offline
happens, some pages could be in MIGRATE_MOVABLE of free_list although
the pageblock's migratetype of the page is MIGRATE_ISOLATE.
The race could be detected by get_freepage_migratetype
in __test_page_isolated_in_pageblock. If it is detected, now EBUSY
gets bubbled all the way up and the hotplug operations fails.
But better idea is instead of returning and failing memory-hotremove,
move the free page to the correct list at the time it is detected.
It could enhance memory-hotremove operation success ratio although
the race is really rare.
Suggested-by: Mel Gorman <mgorman@suse.de>
Signed-off-by: Minchan Kim <minchan@kernel.org>
---
include/linux/page-isolation.h | 4 ++++
mm/page_alloc.c | 2 +-
mm/page_isolation.c | 15 +++++++++++++--
3 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/include/linux/page-isolation.h b/include/linux/page-isolation.h
index 105077a..fca8c0a 100644
--- a/include/linux/page-isolation.h
+++ b/include/linux/page-isolation.h
@@ -6,6 +6,10 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count);
void set_pageblock_migratetype(struct page *page, int migratetype);
int move_freepages_block(struct zone *zone, struct page *page,
int migratetype);
+int move_freepages(struct zone *zone,
+ struct page *start_page, struct page *end_page,
+ int migratetype);
+
/*
* Changes migrate type in [start_pfn, end_pfn) to be MIGRATE_ISOLATE.
* If specified range includes migrate types other than MOVABLE or CMA,
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 8531fa3..5a4c4d8 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -918,7 +918,7 @@ static int fallbacks[MIGRATE_TYPES][4] = {
* Note that start_page and end_pages are not aligned on a pageblock
* boundary. If alignment is required, use move_freepages_block()
*/
-static int move_freepages(struct zone *zone,
+int move_freepages(struct zone *zone,
struct page *start_page, struct page *end_page,
int migratetype)
{
diff --git a/mm/page_isolation.c b/mm/page_isolation.c
index 7ba7405..a42fa8d 100644
--- a/mm/page_isolation.c
+++ b/mm/page_isolation.c
@@ -194,8 +194,19 @@ __test_page_isolated_in_pageblock(unsigned long pfn, unsigned long end_pfn)
}
page = pfn_to_page(pfn);
if (PageBuddy(page)) {
- if (get_freepage_migratetype(page) != MIGRATE_ISOLATE)
- break;
+ /*
+ * If race between isolatation and allocation happens,
+ * some free pages could be in MIGRATE_MOVABLE list
+ * although pageblock's migratation type of the page
+ * is MIGRATE_ISOLATE. Catch it and move the page into
+ * MIGRATE_ISOLATE list.
+ */
+ if (get_freepage_migratetype(page) != MIGRATE_ISOLATE) {
+ struct page *end_page = page +
+ (1 << page_order(page)) - 1;
+ move_freepages(page_zone(page), page, end_page,
+ MIGRATE_ISOLATE);
+ }
pfn += 1 << page_order(page);
}
else if (page_count(page) == 0 &&
--
1.7.9.5
--
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>
WARNING: multiple messages have this Message-ID (diff)
From: Minchan Kim <minchan@kernel.org>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
Mel Gorman <mgorman@suse.de>,
Kamezawa Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>,
Xishi Qiu <qiuxishi@huawei.com>,
Wen Congyang <wency@cn.fujitsu.com>,
Minchan Kim <minchan@kernel.org>
Subject: [PATCH v3 4/4] memory-hotplug: fix pages missed by race rather than failng
Date: Fri, 7 Sep 2012 09:39:32 +0900 [thread overview]
Message-ID: <1346978372-17903-5-git-send-email-minchan@kernel.org> (raw)
In-Reply-To: <1346978372-17903-1-git-send-email-minchan@kernel.org>
If race between allocation and isolation in memory-hotplug offline
happens, some pages could be in MIGRATE_MOVABLE of free_list although
the pageblock's migratetype of the page is MIGRATE_ISOLATE.
The race could be detected by get_freepage_migratetype
in __test_page_isolated_in_pageblock. If it is detected, now EBUSY
gets bubbled all the way up and the hotplug operations fails.
But better idea is instead of returning and failing memory-hotremove,
move the free page to the correct list at the time it is detected.
It could enhance memory-hotremove operation success ratio although
the race is really rare.
Suggested-by: Mel Gorman <mgorman@suse.de>
Signed-off-by: Minchan Kim <minchan@kernel.org>
---
include/linux/page-isolation.h | 4 ++++
mm/page_alloc.c | 2 +-
mm/page_isolation.c | 15 +++++++++++++--
3 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/include/linux/page-isolation.h b/include/linux/page-isolation.h
index 105077a..fca8c0a 100644
--- a/include/linux/page-isolation.h
+++ b/include/linux/page-isolation.h
@@ -6,6 +6,10 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count);
void set_pageblock_migratetype(struct page *page, int migratetype);
int move_freepages_block(struct zone *zone, struct page *page,
int migratetype);
+int move_freepages(struct zone *zone,
+ struct page *start_page, struct page *end_page,
+ int migratetype);
+
/*
* Changes migrate type in [start_pfn, end_pfn) to be MIGRATE_ISOLATE.
* If specified range includes migrate types other than MOVABLE or CMA,
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 8531fa3..5a4c4d8 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -918,7 +918,7 @@ static int fallbacks[MIGRATE_TYPES][4] = {
* Note that start_page and end_pages are not aligned on a pageblock
* boundary. If alignment is required, use move_freepages_block()
*/
-static int move_freepages(struct zone *zone,
+int move_freepages(struct zone *zone,
struct page *start_page, struct page *end_page,
int migratetype)
{
diff --git a/mm/page_isolation.c b/mm/page_isolation.c
index 7ba7405..a42fa8d 100644
--- a/mm/page_isolation.c
+++ b/mm/page_isolation.c
@@ -194,8 +194,19 @@ __test_page_isolated_in_pageblock(unsigned long pfn, unsigned long end_pfn)
}
page = pfn_to_page(pfn);
if (PageBuddy(page)) {
- if (get_freepage_migratetype(page) != MIGRATE_ISOLATE)
- break;
+ /*
+ * If race between isolatation and allocation happens,
+ * some free pages could be in MIGRATE_MOVABLE list
+ * although pageblock's migratation type of the page
+ * is MIGRATE_ISOLATE. Catch it and move the page into
+ * MIGRATE_ISOLATE list.
+ */
+ if (get_freepage_migratetype(page) != MIGRATE_ISOLATE) {
+ struct page *end_page = page +
+ (1 << page_order(page)) - 1;
+ move_freepages(page_zone(page), page, end_page,
+ MIGRATE_ISOLATE);
+ }
pfn += 1 << page_order(page);
}
else if (page_count(page) == 0 &&
--
1.7.9.5
next prev parent reply other threads:[~2012-09-07 0:38 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-09-07 0:39 [PATCH v3 0/4] memory-hotplug: handle page race between allocation and isolation Minchan Kim
2012-09-07 0:39 ` Minchan Kim
2012-09-07 0:39 ` [PATCH v3 1/4] use get_freepage_migratetype instead of page_private Minchan Kim
2012-09-07 0:39 ` Minchan Kim
2012-09-07 3:50 ` Yasuaki Ishimatsu
2012-09-07 3:50 ` Yasuaki Ishimatsu
2012-09-07 0:39 ` [PATCH v3 2/4] mm: remain migratetype in freed page Minchan Kim
2012-09-07 0:39 ` Minchan Kim
2012-09-07 3:51 ` Yasuaki Ishimatsu
2012-09-07 3:51 ` Yasuaki Ishimatsu
2012-09-07 0:39 ` [PATCH v3 3/4] memory-hotplug: bug fix race between isolation and allocation Minchan Kim
2012-09-07 0:39 ` Minchan Kim
2012-09-07 3:52 ` Yasuaki Ishimatsu
2012-09-07 3:52 ` Yasuaki Ishimatsu
2012-09-07 0:39 ` Minchan Kim [this message]
2012-09-07 0:39 ` [PATCH v3 4/4] memory-hotplug: fix pages missed by race rather than failng Minchan Kim
2012-09-07 0:48 ` Kamezawa Hiroyuki
2012-09-07 0:48 ` Kamezawa Hiroyuki
2012-09-07 9:17 ` [PATCH v3 0/4] memory-hotplug: handle page race between allocation and isolation Mel Gorman
2012-09-07 9:17 ` Mel Gorman
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=1346978372-17903-5-git-send-email-minchan@kernel.org \
--to=minchan@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=isimatu.yasuaki@jp.fujitsu.com \
--cc=kamezawa.hiroyu@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mgorman@suse.de \
--cc=qiuxishi@huawei.com \
--cc=wency@cn.fujitsu.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.