From 650cf88cea7d3e48103ab5c71290ae132ab4c14e Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 17 Dec 2020 07:52:36 +0100 Subject: [PATCH] Revert "ANDROID: mm: add cma pcp list" This reverts commit 3d7ab504ecc8fa7fb30e7b6cddbc23d72dce9606 as it causes conflicts with other mm changes that are coming in 5.11-rc1. Bug: 158645321 Cc: Liam Mark Cc: Chris Goldsworthy Signed-off-by: Greg Kroah-Hartman Change-Id: I189786d1b3e1470eed157a7978b904dee273c72d --- include/linux/mmzone.h | 4 +-- mm/page_alloc.c | 72 ++++++++++++++---------------------------- 2 files changed, 26 insertions(+), 50 deletions(-) diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 14c235d902ad..519679b226be 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -42,6 +42,8 @@ enum migratetype { MIGRATE_UNMOVABLE, MIGRATE_MOVABLE, MIGRATE_RECLAIMABLE, + MIGRATE_PCPTYPES, /* the number of types on the pcp lists */ + MIGRATE_HIGHATOMIC = MIGRATE_PCPTYPES, #ifdef CONFIG_CMA /* * MIGRATE_CMA migration type is designed to mimic the way @@ -58,8 +60,6 @@ enum migratetype { */ MIGRATE_CMA, #endif - MIGRATE_PCPTYPES, /* the number of types on the pcp lists */ - MIGRATE_HIGHATOMIC = MIGRATE_PCPTYPES, #ifdef CONFIG_MEMORY_ISOLATION MIGRATE_ISOLATE, /* can't allocate from here */ #endif diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 3f51a56fb8c8..ca8156111b43 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -324,10 +324,10 @@ const char * const migratetype_names[MIGRATE_TYPES] = { "Unmovable", "Movable", "Reclaimable", + "HighAtomic", #ifdef CONFIG_CMA "CMA", #endif - "HighAtomic", #ifdef CONFIG_MEMORY_ISOLATION "Isolate", #endif @@ -2939,28 +2939,6 @@ static int rmqueue_bulk(struct zone *zone, unsigned int order, return alloced; } -/* - * Return the pcp list that corresponds to the migrate type if that list isn't - * empty. - * If the list is empty return NULL. - */ -static struct list_head *get_populated_pcp_list(struct zone *zone, - unsigned int order, struct per_cpu_pages *pcp, - int migratetype, unsigned int alloc_flags) -{ - struct list_head *list = &pcp->lists[migratetype]; - - if (list_empty(list)) { - pcp->count += rmqueue_bulk(zone, order, - pcp->batch, list, - migratetype, alloc_flags); - - if (list_empty(list)) - list = NULL; - } - return list; -} - #ifdef CONFIG_NUMA /* * Called from the vmstat counter updater to drain pagesets of this @@ -3411,28 +3389,25 @@ static inline void zone_statistics(struct zone *preferred_zone, struct zone *z) static struct page *__rmqueue_pcplist(struct zone *zone, int migratetype, unsigned int alloc_flags, struct per_cpu_pages *pcp, + struct list_head *list, gfp_t gfp_flags) { - struct page *page = NULL; - struct list_head *list = NULL; + struct page *page; do { - /* First try to get CMA pages */ - if (migratetype == MIGRATE_MOVABLE && + if (list_empty(list) && migratetype == MIGRATE_MOVABLE && gfp_flags & __GFP_CMA) { - list = get_populated_pcp_list(zone, 0, pcp, + pcp->count += rmqueue_bulk(zone, 0, + pcp->batch, list, get_cma_migrate_type(), alloc_flags); } - if (list == NULL) { - /* - * Either CMA is not suitable or there are no - * free CMA pages. - */ - list = get_populated_pcp_list(zone, 0, pcp, + if (unlikely(list_empty(list))) { + pcp->count += rmqueue_bulk(zone, 0, + pcp->batch, list, migratetype, alloc_flags); - if (unlikely(list == NULL) || - unlikely(list_empty(list))) + + if (unlikely(list_empty(list))) return NULL; } @@ -3450,12 +3425,14 @@ static struct page *rmqueue_pcplist(struct zone *preferred_zone, int migratetype, unsigned int alloc_flags) { struct per_cpu_pages *pcp; + struct list_head *list; struct page *page; unsigned long flags; local_irq_save(flags); pcp = &this_cpu_ptr(zone->pageset)->pcp; - page = __rmqueue_pcplist(zone, migratetype, alloc_flags, pcp, + list = &pcp->lists[migratetype]; + page = __rmqueue_pcplist(zone, migratetype, alloc_flags, pcp, list, gfp_flags); if (page) { __count_zid_vm_events(PGALLOC, page_zonenum(page), 1); @@ -3478,9 +3455,16 @@ struct page *rmqueue(struct zone *preferred_zone, struct page *page; if (likely(order == 0)) { - page = rmqueue_pcplist(preferred_zone, zone, gfp_flags, - migratetype, alloc_flags); - goto out; + /* + * MIGRATE_MOVABLE pcplist could have the pages on CMA area and + * we need to skip it when CMA area isn't allowed. + */ + if (!IS_ENABLED(CONFIG_CMA) || gfp_flags & __GFP_CMA || + migratetype != MIGRATE_MOVABLE) { + page = rmqueue_pcplist(preferred_zone, zone, gfp_flags, + migratetype, alloc_flags); + goto out; + } } /* @@ -3688,14 +3672,6 @@ bool __zone_watermark_ok(struct zone *z, unsigned int order, unsigned long mark, continue; for (mt = 0; mt < MIGRATE_PCPTYPES; mt++) { -#ifdef CONFIG_CMA - /* - * Note that this check is needed only - * when MIGRATE_CMA < MIGRATE_PCPTYPES. - */ - if (mt == MIGRATE_CMA) - continue; -#endif if (!free_area_empty(area, mt)) return true; }