On Thu, Jan 09 2014, Joonsoo Kim wrote: > If (MAX_ORDER-1) is greater than pageblock order, there is a possibility > to merge different migratetype pages and to be linked in unintended > freelist. > > While I test CMA, CMA pages are merged and linked into MOVABLE freelist > by above issue and then, the pages change their migratetype to UNMOVABLE by > try_to_steal_freepages(). After that, CMA to this region always fail. > > To prevent this, we should not merge the page on MIGRATE_(CMA|ISOLATE) > freelist. This is strange. CMA regions are always multiplies of max-pages (or pageblocks whichever is larger), so MOVABLE free pages should never be inside of a CMA region. If what you're describing happens, it looks like an issue somewhere else. > Signed-off-by: Joonsoo Kim > > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index 2548b42..ea99cee 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -581,6 +581,15 @@ static inline void __free_one_page(struct page *page, > __mod_zone_freepage_state(zone, 1 << order, > migratetype); > } else { > + int buddy_mt = get_buddy_migratetype(buddy); > + > + /* We don't want to merge cma, isolate pages */ > + if (unlikely(order >= pageblock_order) && > + migratetype != buddy_mt && > + (migratetype >= MIGRATE_PCPTYPES || > + buddy_mt >= MIGRATE_PCPTYPES)) { > + break; > + } > list_del(&buddy->lru); > zone->free_area[order].nr_free--; > rmv_page_order(buddy); > -- > 1.7.9.5 > -- Best regards, _ _ .o. | Liege of Serenely Enlightened Majesty of o' \,=./ `o ..o | Computer Science, Michał “mina86” Nazarewicz (o o) ooo +------ooO--(_)--Ooo--