From: Weijie Yang <weijie.yang@samsung.com>
To: iamjoonsoo.kim@lge.com
Cc: 'Andrew Morton' <akpm@linux-foundation.org>,
mgorman@suse.de, 'Rik van Riel' <riel@redhat.com>,
'Johannes Weiner' <hannes@cmpxchg.org>,
'Minchan Kim' <minchan@kernel.org>,
mina86@mina86.com, vbabka@suse.cz, linux-kernel@vger.kernel.org,
linux-mm@kvack.org, 'Weijie Yang' <weijie.yang.kh@gmail.com>
Subject: [PATCH] mm: page_alloc: store updated page migratetype to avoid misusing stale value
Date: Mon, 17 Nov 2014 18:40:10 +0800 [thread overview]
Message-ID: <000301d00253$0fcd0560$2f671020$%yang@samsung.com> (raw)
The commit ad53f92e(fix incorrect isolation behavior by rechecking migratetype)
patch series describe the race between page isolation and free path, and try to
fix the freepage account issues.
However, there is still a little issue: freed page could have stale migratetype
in the free_list. This would cause some bad behavior if we misuse this stale
value later.
Such as: in __test_page_isolated_in_pageblock() we check the buddy page, if the
page's stale migratetype is not MIGRATE_ISOLATE, which will cause unnecessary
page move action.
This patch store the page's updated migratetype after free the page to the
free_list to avoid subsequent misusing stale value, and use a WARN_ON_ONCE
to catch a potential undetected race between isolatation and free path.
Signed-off-by: Weijie Yang <weijie.yang@samsung.com>
---
mm/page_alloc.c | 1 +
mm/page_isolation.c | 17 +++++------------
2 files changed, 6 insertions(+), 12 deletions(-)
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 616a2c9..177fca0 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -622,6 +622,7 @@ static inline void __free_one_page(struct page *page,
}
list_add(&page->lru, &zone->free_area[order].free_list[migratetype]);
+ set_freepage_migratetype(page, migratetype);
out:
zone->free_area[order].nr_free++;
}
diff --git a/mm/page_isolation.c b/mm/page_isolation.c
index c8778f7..0618071 100644
--- a/mm/page_isolation.c
+++ b/mm/page_isolation.c
@@ -223,19 +223,12 @@ __test_page_isolated_in_pageblock(unsigned long pfn, unsigned long end_pfn,
page = pfn_to_page(pfn);
if (PageBuddy(page)) {
/*
- * 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.
+ * Use a WARN_ON_ONCE to catch a potential undetected
+ * race between isolatation and free pages, even if
+ * we try to avoid this issue.
*/
- if (get_freepage_migratetype(page) != MIGRATE_ISOLATE) {
- struct page *end_page;
-
- end_page = page + (1 << page_order(page)) - 1;
- move_freepages(page_zone(page), page, end_page,
- MIGRATE_ISOLATE);
- }
+ WARN_ON_ONCE(get_freepage_migratetype(page) !=
+ MIGRATE_ISOLATE);
pfn += 1 << page_order(page);
}
else if (page_count(page) == 0 &&
--
1.7.0.4
--
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 reply other threads:[~2014-11-17 10:41 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-17 10:40 Weijie Yang [this message]
2014-11-19 21:28 ` Vlastimil Babka
2014-11-20 13:42 ` Weijie Yang
2014-11-20 17:52 ` Vlastimil Babka
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='000301d00253$0fcd0560$2f671020$%yang@samsung.com' \
--to=weijie.yang@samsung.com \
--cc=akpm@linux-foundation.org \
--cc=hannes@cmpxchg.org \
--cc=iamjoonsoo.kim@lge.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mgorman@suse.de \
--cc=mina86@mina86.com \
--cc=minchan@kernel.org \
--cc=riel@redhat.com \
--cc=vbabka@suse.cz \
--cc=weijie.yang.kh@gmail.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