| From | "Srivatsa S. Bhat" <> | Subject | [RFC PATCH v4 08/40] mm: Use the correct migratetype during buddy merging | Date | Thu, 26 Sep 2013 04:45:28 +0530 |
| |
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(-)
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index e31daf4..c40715c 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -685,10 +685,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);
|