diff options
Diffstat (limited to 'mm/page_alloc.c')
| -rw-r--r-- | mm/page_alloc.c | 26 | 
1 files changed, 19 insertions, 7 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index d259cc2b69c..6969a8abdba 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -558,7 +558,8 @@ static inline void __free_one_page(struct page *page,  		if (page_is_guard(buddy)) {  			clear_page_guard_flag(buddy);  			set_page_private(page, 0); -			__mod_zone_page_state(zone, NR_FREE_PAGES, 1 << order); +			__mod_zone_freepage_state(zone, 1 << order, +						  migratetype);  		} else {  			list_del(&buddy->lru);  			zone->free_area[order].nr_free--; @@ -677,6 +678,8 @@ static void free_pcppages_bulk(struct zone *zone, int count,  			/* MIGRATE_MOVABLE list may include MIGRATE_RESERVEs */  			__free_one_page(page, zone, 0, mt);  			trace_mm_page_pcpu_drain(page, 0, mt); +			if (is_migrate_cma(mt)) +				__mod_zone_page_state(zone, NR_FREE_CMA_PAGES, 1);  		} while (--to_free && --batch_free && !list_empty(list));  	}  	__mod_zone_page_state(zone, NR_FREE_PAGES, count); @@ -692,7 +695,7 @@ static void free_one_page(struct zone *zone, struct page *page, int order,  	__free_one_page(page, zone, order, migratetype);  	if (unlikely(migratetype != MIGRATE_ISOLATE)) -		__mod_zone_page_state(zone, NR_FREE_PAGES, 1 << order); +		__mod_zone_freepage_state(zone, 1 << order, migratetype);  	spin_unlock(&zone->lock);  } @@ -815,7 +818,8 @@ static inline void expand(struct zone *zone, struct page *page,  			set_page_guard_flag(&page[size]);  			set_page_private(&page[size], high);  			/* Guard pages are not available for any usage */ -			__mod_zone_page_state(zone, NR_FREE_PAGES, -(1 << high)); +			__mod_zone_freepage_state(zone, -(1 << high), +						  migratetype);  			continue;  		}  #endif @@ -1141,6 +1145,9 @@ static int rmqueue_bulk(struct zone *zone, unsigned int order,  		}  		set_page_private(page, mt);  		list = &page->lru; +		if (is_migrate_cma(mt)) +			__mod_zone_page_state(zone, NR_FREE_CMA_PAGES, +					      -(1 << order));  	}  	__mod_zone_page_state(zone, NR_FREE_PAGES, -(i << order));  	spin_unlock(&zone->lock); @@ -1412,7 +1419,7 @@ int capture_free_page(struct page *page, int alloc_order, int migratetype)  	mt = get_pageblock_migratetype(page);  	if (unlikely(mt != MIGRATE_ISOLATE)) -		__mod_zone_page_state(zone, NR_FREE_PAGES, -(1UL << order)); +		__mod_zone_freepage_state(zone, -(1UL << order), mt);  	if (alloc_order != order)  		expand(zone, page, alloc_order, order, @@ -1516,7 +1523,8 @@ again:  		spin_unlock(&zone->lock);  		if (!page)  			goto failed; -		__mod_zone_page_state(zone, NR_FREE_PAGES, -(1 << order)); +		__mod_zone_freepage_state(zone, -(1 << order), +					  get_pageblock_migratetype(page));  	}  	__count_zone_vm_events(PGALLOC, zone, 1 << order); @@ -2890,7 +2898,8 @@ void show_free_areas(unsigned int filter)  		" unevictable:%lu"  		" dirty:%lu writeback:%lu unstable:%lu\n"  		" free:%lu slab_reclaimable:%lu slab_unreclaimable:%lu\n" -		" mapped:%lu shmem:%lu pagetables:%lu bounce:%lu\n", +		" mapped:%lu shmem:%lu pagetables:%lu bounce:%lu\n" +		" free_cma:%lu\n",  		global_page_state(NR_ACTIVE_ANON),  		global_page_state(NR_INACTIVE_ANON),  		global_page_state(NR_ISOLATED_ANON), @@ -2907,7 +2916,8 @@ void show_free_areas(unsigned int filter)  		global_page_state(NR_FILE_MAPPED),  		global_page_state(NR_SHMEM),  		global_page_state(NR_PAGETABLE), -		global_page_state(NR_BOUNCE)); +		global_page_state(NR_BOUNCE), +		global_page_state(NR_FREE_CMA_PAGES));  	for_each_populated_zone(zone) {  		int i; @@ -2939,6 +2949,7 @@ void show_free_areas(unsigned int filter)  			" pagetables:%lukB"  			" unstable:%lukB"  			" bounce:%lukB" +			" free_cma:%lukB"  			" writeback_tmp:%lukB"  			" pages_scanned:%lu"  			" all_unreclaimable? %s" @@ -2968,6 +2979,7 @@ void show_free_areas(unsigned int filter)  			K(zone_page_state(zone, NR_PAGETABLE)),  			K(zone_page_state(zone, NR_UNSTABLE_NFS)),  			K(zone_page_state(zone, NR_BOUNCE)), +			K(zone_page_state(zone, NR_FREE_CMA_PAGES)),  			K(zone_page_state(zone, NR_WRITEBACK_TEMP)),  			zone->pages_scanned,  			(zone->all_unreclaimable ? "yes" : "no")  |