From b5b613f16e4c27e6e070ab700749e93bc6bb1244 Mon Sep 17 00:00:00 2001 From: Tao Zeng Date: Thu, 14 Nov 2019 09:36:02 +0800 Subject: [PATCH] mm: fix global free page not same with buddy system [1/1] PD#TV-12041 Problem: Lost RAM is too high, we checked meminfo, found that global free page count is not same with real value counted from buddy system usually after long time running, this different value can be over 200 MB: [ 484.055739@1] HighMem free:16652kB min:512kB low:15932kB ~~~~~~16MB [ 484.067393@1] lowmem_reserve[]: 0 0 0 [ 484.071021@1] HighMem: 2308*4kB (UMC) 1296*8kB (UMC) 913*16kB (UMC) 555*32kB (UMC) 339*64kB (UMC) 25*128kB (UMC) 2*256kB (C) 1*512kB (C) 1*1024kB (C) 0*2048kB 39*4096kB (C) = 238656kB ~~~~~~~~238MB Solution: Fix wrong sub of free pages when no fallback pages get from high memzone. Verify: x301 Change-Id: Iae011ec216e2479dd400aea1af4750ad436fe946 Signed-off-by: Tao Zeng --- mm/page_alloc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 61806367d580..352791ca8d91 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -2343,7 +2343,9 @@ static struct page *rmqueue_no_cma(struct zone *zone, unsigned int order, if (!page) page = __rmqueue_fallback(zone, order, migratetype); WARN_ON(page && is_migrate_cma(get_pcppage_migratetype(page))); - __mod_zone_page_state(zone, NR_FREE_PAGES, -(1 << order)); + if (page) + __mod_zone_page_state(zone, NR_FREE_PAGES, -(1 << order)); + spin_unlock(&zone->lock); return page; }