diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/page_alloc.c | 51 |
1 files changed, 37 insertions, 14 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index e3e726bd285..fea1e3b56c3 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -158,6 +158,7 @@ int nr_node_ids __read_mostly = MAX_NUMNODES; EXPORT_SYMBOL(nr_node_ids); #endif +#ifdef CONFIG_PAGE_GROUP_BY_MOBILITY static inline int get_pageblock_migratetype(struct page *page) { return get_pageblock_flags_group(page, PB_migrate, PB_migrate_end); @@ -174,6 +175,22 @@ static inline int gfpflags_to_migratetype(gfp_t gfp_flags) return ((gfp_flags & __GFP_MOVABLE) != 0); } +#else +static inline int get_pageblock_migratetype(struct page *page) +{ + return MIGRATE_UNMOVABLE; +} + +static void set_pageblock_migratetype(struct page *page, int migratetype) +{ +} + +static inline int gfpflags_to_migratetype(gfp_t gfp_flags) +{ + return MIGRATE_UNMOVABLE; +} +#endif /* CONFIG_PAGE_GROUP_BY_MOBILITY */ + #ifdef CONFIG_DEBUG_VM static int page_outside_zone_boundaries(struct zone *zone, struct page *page) { @@ -653,6 +670,7 @@ static int prep_new_page(struct page *page, int order, gfp_t gfp_flags) return 0; } +#ifdef CONFIG_PAGE_GROUP_BY_MOBILITY /* * This array describes the order lists are fallen back to when * the free lists for the desirable migrate type are depleted @@ -709,6 +727,13 @@ static struct page *__rmqueue_fallback(struct zone *zone, int order, return NULL; } +#else +static struct page *__rmqueue_fallback(struct zone *zone, int order, + int start_migratetype) +{ + return NULL; +} +#endif /* CONFIG_PAGE_GROUP_BY_MOBILITY */ /* * Do the hard work of removing an element from the buddy allocator. @@ -953,27 +978,25 @@ again: if (unlikely(!pcp->count)) goto failed; } + +#ifdef CONFIG_PAGE_GROUP_BY_MOBILITY /* Find a page of the appropriate migrate type */ - list_for_each_entry(page, &pcp->list, lru) { - if (page_private(page) == migratetype) { - list_del(&page->lru); - pcp->count--; + list_for_each_entry(page, &pcp->list, lru) + if (page_private(page) == migratetype) break; - } - } - /* - * Check if a page of the appropriate migrate type - * was found. If not, allocate more to the pcp list - */ - if (&page->lru == &pcp->list) { + /* Allocate more to the pcp list if necessary */ + if (unlikely(&page->lru == &pcp->list)) { pcp->count += rmqueue_bulk(zone, 0, pcp->batch, &pcp->list, migratetype); page = list_entry(pcp->list.next, struct page, lru); - VM_BUG_ON(page_private(page) != migratetype); - list_del(&page->lru); - pcp->count--; } +#else + page = list_entry(pcp->list.next, struct page, lru); +#endif /* CONFIG_PAGE_GROUP_BY_MOBILITY */ + + list_del(&page->lru); + pcp->count--; } else { spin_lock_irqsave(&zone->lock, flags); page = __rmqueue(zone, order, migratetype); |