mm/page_alloc: fix freeing of MIGRATE_RESERVE migratetype pages
authorBartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Fri, 14 Feb 2014 18:34:17 +0000 (19:34 +0100)
committerChanho Park <chanho61.park@samsung.com>
Thu, 20 Mar 2014 08:43:52 +0000 (17:43 +0900)
commit68f19cbeccfc48523f118394d154f2df3431b889
treeba07f106868fc054a4b61069af5d1ea45e2bb07b
parent10d282f12d57a467a83a32d6163430557d631f09
mm/page_alloc: fix freeing of MIGRATE_RESERVE migratetype pages

Pages allocated from MIGRATE_RESERVE migratetype pageblocks
are not freed back to MIGRATE_RESERVE migratetype free
lists in free_pcppages_bulk()->__free_one_page() if we got
to free_pcppages_bulk() through drain_[zone_]pages().
The freeing through free_hot_cold_page() is okay because
freepage migratetype is set to pageblock migratetype before
calling free_pcppages_bulk().  If pages of MIGRATE_RESERVE
migratetype end up on the free lists of other migratetype
whole Reserved pageblock may be later changed to the other
migratetype in __rmqueue_fallback() and it will be never
changed back to be a Reserved pageblock.  Fix the issue by
preserving freepage migratetype as a pageblock migratetype
(instead of overriding it to the requested migratetype)
for MIGRATE_RESERVE migratetype pages in rmqueue_bulk().

The problem was introduced in v2.6.31 by commit ed0ae21
("page allocator: do not call get_pageblock_migratetype()
more than necessary").

Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Reported-by: Yong-Taek Lee <ytk.lee@samsung.com>
Cc: Marek Szyprowski <m.szyprowski@samsung.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Hugh Dickins <hughd@google.com>
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Change-Id: I1d4ab2a3241387160dd376b0ead864cd2b0c59f0
include/linux/mmzone.h
mm/page_alloc.c