@@ -681,10 +681,14 @@ static inline void __free_one_page(struct page *page,
__mod_zone_freepage_state(zone, 1 << order,
migratetype);
} else {
+ int mt;
+
area = &zone->free_area[order];
- del_from_freelist(buddy, &area->free_list[migratetype]);
+ mt = get_freepage_migratetype(buddy);
+ del_from_freelist(buddy, &area->free_list[mt]);
area->nr_free--;
rmv_page_order(buddy);
+ set_freepage_migratetype(buddy, migratetype);
}
combined_idx = buddy_idx & page_idx;
page = page + (combined_idx - page_idx);
While merging buddy free pages of a given order to make a higher order page, the buddy allocator might coalesce pages belonging to *two* *different* migratetypes of that order! So, don't assume that both the buddies come from the same freelist; instead, explicitly find out the migratetype info of the buddy page and use it while merging the buddies. Also, set the freepage migratetype of the buddy to the new one. Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com> --- mm/page_alloc.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html