From 6899527530aee8f9add4b18c591286a59405e1ed Mon Sep 17 00:00:00 2001 From: Vinayak Menon Date: Tue, 23 Feb 2016 18:06:29 +0530 Subject: mm: add zone counter for cma pages Add per free area nr_free_cma counter. The idea is to also track the number of cma pages present in free pages. This will be used in later patches to fix issues with zone_watermark_ok. Change-Id: I97da9d2f3642db56fc541c48ab56a7ce78e2333c Signed-off-by: Vinayak Menon Signed-off-by: Prakash Gupta (cherry picked from commit a147305588507b1a241af87f1006c5d0b30beade) --- mm/page_alloc.c | 34 ++++++++++++++++++++++++++++------ mm/page_isolation.c | 8 +++++--- 2 files changed, 33 insertions(+), 9 deletions(-) (limited to 'mm') diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 21686a238..430956db0 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -621,6 +621,8 @@ static inline void __free_one_page(struct page *page, } else { list_del(&buddy->lru); zone->free_area[order].nr_free--; + if (is_migrate_cma(migratetype)) + zone->free_area[order].nr_free_cma--; rmv_page_order(buddy); } combined_idx = buddy_idx & page_idx; @@ -752,6 +754,8 @@ static inline void __free_one_page(struct page *page, list_add(&page->lru, &zone->free_area[order].free_list[migratetype]); out: zone->free_area[order].nr_free++; + if (is_migrate_cma(migratetype)) + zone->free_area[order].nr_free_cma++; } #endif @@ -1081,6 +1085,8 @@ static inline void expand(struct zone *zone, struct page *page, #endif list_add(&page[size].lru, &area->free_list[migratetype]); area->nr_free++; + if (is_migrate_cma(migratetype)) + area->nr_free_cma++; set_page_order(&page[size], high); } } @@ -1152,6 +1158,8 @@ struct page *__rmqueue_smallest(struct zone *zone, unsigned int order, list_del(&page->lru); rmv_page_order(page); area->nr_free--; + if (is_migrate_cma(migratetype)) + area->nr_free_cma--; expand(zone, page, order, current_order, area, migratetype); return page; } @@ -1218,7 +1226,7 @@ static int fallbacks[MIGRATE_TYPES][4] = { */ int move_freepages(struct zone *zone, struct page *start_page, struct page *end_page, - int migratetype) + int migratetype, int old_mt) { struct page *page; unsigned long order; @@ -1252,6 +1260,12 @@ int move_freepages(struct zone *zone, order = page_order(page); list_move(&page->lru, &zone->free_area[order].free_list[migratetype]); + + if (is_migrate_cma(migratetype)) + zone->free_area[order].nr_free_cma++; + else if (is_migrate_cma(old_mt)) + zone->free_area[order].nr_free_cma--; + set_freepage_migratetype(page, migratetype); page += 1 << order; pages_moved += 1 << order; @@ -1261,7 +1275,7 @@ int move_freepages(struct zone *zone, } int move_freepages_block(struct zone *zone, struct page *page, - int migratetype) + int migratetype, int old_mt) { unsigned long start_pfn, end_pfn; struct page *start_page, *end_page; @@ -1278,7 +1292,7 @@ int move_freepages_block(struct zone *zone, struct page *page, if (!zone_spans_pfn(zone, end_pfn)) return 0; - return move_freepages(zone, start_page, end_page, migratetype); + return move_freepages(zone, start_page, end_page, migratetype, old_mt); } static void change_pageblock_range(struct page *pageblock_page, @@ -1326,6 +1340,8 @@ __rmqueue_fallback(struct zone *zone, int order, int start_migratetype) page = list_entry(area->free_list[migratetype].next, struct page, lru); area->nr_free--; + if (is_migrate_cma(migratetype)) + area->nr_free_cma--; /* We don't want move pages with MIGRATE_MTKPASR to other mobilities either! */ if (is_migrate_mtkpasr(migratetype)) { @@ -1374,7 +1390,7 @@ __rmqueue_fallback(struct zone *zone, int order, int start_migratetype) page_group_by_mobility_disabled)) { int pages; pages = move_freepages_block(zone, page, - start_migratetype); + start_migratetype, 0); /* Claim the whole block if over half of it is free */ if (pages >= (1 << (pageblock_order-1)) || @@ -1776,6 +1792,8 @@ int __isolate_free_page(struct page *page, unsigned int order) /* Remove page from free list */ list_del(&page->lru); zone->free_area[order].nr_free--; + if (is_migrate_cma(mt)) + zone->free_area[order].nr_free_cma--; rmv_page_order(page); /* Set the pageblock if the isolated page is at least a pageblock */ @@ -4596,7 +4614,7 @@ static void setup_zone_migrate_reserve(struct zone *zone) set_pageblock_migratetype(page, MIGRATE_RESERVE); move_freepages_block(zone, page, - MIGRATE_RESERVE); + MIGRATE_RESERVE, 0); reserve--; continue; } @@ -4608,7 +4626,8 @@ static void setup_zone_migrate_reserve(struct zone *zone) */ if (block_migratetype == MIGRATE_RESERVE) { set_pageblock_migratetype(page, MIGRATE_MOVABLE); - move_freepages_block(zone, page, MIGRATE_MOVABLE); + move_freepages_block(zone, page, + MIGRATE_MOVABLE, 0); } } } @@ -4698,6 +4717,7 @@ static void __meminit zone_init_free_lists(struct zone *zone) for_each_migratetype_order(order, t) { INIT_LIST_HEAD(&zone->free_area[order].free_list[t]); zone->free_area[order].nr_free = 0; + zone->free_area[order].nr_free_cma = 0; } } @@ -7525,6 +7545,8 @@ __offline_isolated_pages(unsigned long start_pfn, unsigned long end_pfn) if (PageHighMem(page)) totalhigh_pages -= 1 << order; #endif + if (is_migrate_cma(get_pageblock_migratetype(page))) + zone->free_area[order].nr_free_cma--; for (i = 0; i < (1 << order); i++) SetPageReserved((page+i)); pfn += (1 << order); diff --git a/mm/page_isolation.c b/mm/page_isolation.c index 87011247a..0e55d52c5 100644 --- a/mm/page_isolation.c +++ b/mm/page_isolation.c @@ -65,7 +65,8 @@ out: // commit ad53f92eb416d81e469fa8ea57153e59455e7175 zone->nr_isolate_pageblock++; #endif - nr_pages = move_freepages_block(zone, page, MIGRATE_ISOLATE); + nr_pages = move_freepages_block(zone, page, + MIGRATE_ISOLATE, migratetype); #if !defined(CONFIG_CMA) || !defined(CONFIG_MTK_SVP) // SVP 16 __mod_zone_freepage_state(zone, -nr_pages, migratetype); @@ -141,7 +142,8 @@ void unset_migratetype_isolate(struct page *page, unsigned migratetype) * pageblock scanning for freepage moving. */ if (!isolated_page) { - nr_pages = move_freepages_block(zone, page, migratetype); + nr_pages = move_freepages_block(zone, page, + migratetype, 0); #if !defined(CONFIG_CMA) || !defined(CONFIG_MTK_SVP) // SVP 16 __mod_zone_freepage_state(zone, nr_pages, migratetype); #else @@ -274,7 +276,7 @@ __test_page_isolated_in_pageblock(struct zone *zone, unsigned long pfn, end_page = page + (1 << page_order(page)) - 1; move_freepages(page_zone(page), page, end_page, - MIGRATE_ISOLATE); + MIGRATE_ISOLATE,0); } pfn += 1 << page_order(page); } -- cgit v1.2.3