From: Yasunori Goto The BUG_ON() check at move_freepages() is wrong. Its end_page is start_page + MAX_ORDER_NR_PAGES. So, it can be next zone. BUG_ON() should check "end_page - 1". Signed-off-by: Yasunori Goto Cc: Mel Gorman Signed-off-by: Andrew Morton --- mm/page_alloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff -puN mm/page_alloc.c~move-free-pages-between-lists-on-steal-fix-2 mm/page_alloc.c --- a/mm/page_alloc.c~move-free-pages-between-lists-on-steal-fix-2 +++ a/mm/page_alloc.c @@ -673,7 +673,7 @@ int move_freepages(struct zone *zone, unsigned long order; int blocks_moved = 0; - BUG_ON(page_zone(start_page) != page_zone(end_page)); + BUG_ON(page_zone(start_page) != page_zone(end_page - 1)); for (page = start_page; page < end_page;) { if (!PageBuddy(page)) { _