Messages in this thread Patch in this message | | | From | Weijie Yang <> | Subject | [PATCH 2/2] mm: page_isolation: fix zone_freepage accounting | Date | Thu, 06 Nov 2014 16:09:08 +0800 |
| |
If race between isolatation and allocation happens, we could need to move some freepages to MIGRATE_ISOLATE in __test_page_isolated_in_pageblock(). The current code ignores the zone_freepage accounting after the move, which cause the zone NR_FREE_PAGES and NR_FREE_CMA_PAGES statistics incorrect.
This patch fixes this rare issue.
Signed-off-by: Weijie Yang <weijie.yang@samsung.com> --- mm/page_isolation.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/mm/page_isolation.c b/mm/page_isolation.c index 3ddc8b3..15b51de 100644 --- a/mm/page_isolation.c +++ b/mm/page_isolation.c @@ -193,12 +193,15 @@ __test_page_isolated_in_pageblock(unsigned long pfn, unsigned long end_pfn, * is MIGRATE_ISOLATE. Catch it and move the page into * MIGRATE_ISOLATE list. */ - if (get_freepage_migratetype(page) != MIGRATE_ISOLATE) { + int migratetype = get_freepage_migratetype(page); + if (migratetype != MIGRATE_ISOLATE) { struct page *end_page; end_page = page + (1 << page_order(page)) - 1; move_freepages(page_zone(page), page, end_page, MIGRATE_ISOLATE); + __mod_zone_freepage_state(zone, + -(1 << page_order(page)), migratetype); } pfn += 1 << page_order(page); } -- 1.7.0.4
| |