The high zone managed page count is wrong on nyan boards |
|||
Issue description
E.g. On nyan_big with 4GB RAM.
# cat /proc/zoneinfo
...
Node 0, zone HighMem
pages free 578616
min 128
low 2106
high 4085
scanned 0
spanned 854016
present 845802
managed 1691604
The managed field is wrong. There are ~6607 MB of managed pages, larger than physical RAM. Wrong managed field would confuse the memory reclaim and the low memory notification mechanisms.
The wrong managed field is introduced by patch "ARM: Speed up page list initialization during boot" (https://crrev.com/c/190381)
It can be fixed by applying upstream patch "mm: accurately calculate zone->managed_pages for highmem zones" (https://github.com/torvalds/linux/commit/7b4b2a0d6c8500350784beb83a6a55e60ea3bea3)
,
Oct 2
More explanation about how "mm: accurately calculate zone->managed_pages for highmem zones" fixes the bug: https://docs.google.com/document/d/1SGOHptN09gMD6P0bJwzSW0VtPgHCnjCAGH0G8XH0pJU/edit?usp=sharing
,
Oct 3
The following revision refers to this bug: https://chromium.googlesource.com/chromiumos/third_party/kernel/+/719e863357ccbb233d91b17853a5a746268c3612 commit 719e863357ccbb233d91b17853a5a746268c3612 Author: Jiang Liu <liuj97@gmail.com> Date: Wed Oct 03 13:51:02 2018 UPSTREAM: mm: accurately calculate zone->managed_pages for highmem zones Commit "mm: introduce new field 'managed_pages' to struct zone" assumes that all highmem pages will be freed into the buddy system by function mem_init(). But that's not always true, some architectures may reserve some highmem pages during boot. For example PPC may allocate highmem pages for giagant HugeTLB pages, and several architectures have code to check PageReserved flag to exclude highmem pages allocated during boot when freeing highmem pages into the buddy system. So treat highmem pages in the same way as normal pages, that is to: 1) reset zone->managed_pages to zero in mem_init(). 2) recalculate managed_pages when freeing pages into the buddy system. Signed-off-by: Jiang Liu <jiang.liu@huawei.com> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Tejun Heo <tj@kernel.org> Cc: Joonsoo Kim <js1304@gmail.com> Cc: Yinghai Lu <yinghai@kernel.org> Cc: Mel Gorman <mel@csn.ul.ie> Cc: Minchan Kim <minchan@kernel.org> Cc: Kamezawa Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Marek Szyprowski <m.szyprowski@samsung.com> Cc: "Michael S. Tsirkin" <mst@redhat.com> Cc: <sworddragon2@aol.com> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Chris Metcalf <cmetcalf@tilera.com> Cc: David Howells <dhowells@redhat.com> Cc: Geert Uytterhoeven <geert@linux-m68k.org> Cc: Ingo Molnar <mingo@redhat.com> Cc: Jeremy Fitzhardinge <jeremy@goop.org> Cc: Jianguo Wu <wujianguo@huawei.com> Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Cc: Michel Lespinasse <walken@google.com> Cc: Rik van Riel <riel@redhat.com> Cc: Rusty Russell <rusty@rustcorp.com.au> Cc: Tang Chen <tangchen@cn.fujitsu.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Wen Congyang <wency@cn.fujitsu.com> Cc: Will Deacon <will.deacon@arm.com> Cc: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com> Cc: Russell King <rmk@arm.linux.org.uk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> (cherry picked from commit 7b4b2a0d6c8500350784beb83a6a55e60ea3bea3) Signed-off-by: Kuo-Hsin Yang <vovoy@chromium.org> BUG= chromium:891178 TEST=boot and check /proc/zoneinfo Change-Id: I4ba7e6d033514b5f854835490e9c44ed47c4adda Reviewed-on: https://chromium-review.googlesource.com/1256642 Commit-Ready: Vovo Yang <vovoy@chromium.org> Tested-by: Vovo Yang <vovoy@chromium.org> Reviewed-by: Guenter Roeck <groeck@chromium.org> Reviewed-by: Sonny Rao <sonnyrao@chromium.org> [modify] https://crrev.com/719e863357ccbb233d91b17853a5a746268c3612/mm/nobootmem.c [modify] https://crrev.com/719e863357ccbb233d91b17853a5a746268c3612/arch/metag/mm/init.c [modify] https://crrev.com/719e863357ccbb233d91b17853a5a746268c3612/mm/bootmem.c [modify] https://crrev.com/719e863357ccbb233d91b17853a5a746268c3612/arch/x86/mm/highmem_32.c [modify] https://crrev.com/719e863357ccbb233d91b17853a5a746268c3612/mm/page_alloc.c [modify] https://crrev.com/719e863357ccbb233d91b17853a5a746268c3612/include/linux/bootmem.h
,
Oct 8
|
|||
►
Sign in to add a comment |
|||
Comment 1 by vovoy@chromium.org
, Oct 2