On Mon, Jul 23, 2018 at 5:23 PM, Johannes Weiner <hannes@xxxxxxxxxxx> wrote: > On Mon, Jul 23, 2018 at 03:36:09PM +0200, Arnd Bergmann wrote: >> On Thu, Jul 12, 2018 at 7:29 PM, Johannes Weiner <hannes@xxxxxxxxxxx> wrote: >> In file included from /git/arm-soc/include/linux/kernel.h:10, >> from /git/arm-soc/arch/arm64/mm/init.c:20: >> /git/arm-soc/arch/arm64/mm/init.c: In function 'mem_init': >> /git/arm-soc/include/linux/compiler.h:357:38: error: call to >> '__compiletime_assert_618' declared with attribute error: BUILD_BUG_ON >> failed: sizeof(struct page) > (1 << STRUCT_PAGE_MAX_SHIFT) > > This BUILD_BUG_ON() is to make sure we're sizing the VMEMMAP struct > page array properly (address space divided by struct page size). > > From the code: > > /* > * Log2 of the upper bound of the size of a struct page. Used for sizing > * the vmemmap region only, does not affect actual memory footprint. > * We don't use sizeof(struct page) directly since taking its size here > * requires its definition to be available at this point in the inclusion > * chain, and it may not be a power of 2 in the first place. > */ > #define STRUCT_PAGE_MAX_SHIFT 6 > ... > However, the check isn't conditional on that config option. And when > VMEMMAP is disabled, we need 22 additional bits to identify the sparse > memory sections in page->flags as well: > >> CONFIG_NODES_SHIFT=2 >> # CONFIG_ARCH_USES_PG_UNCACHED is not set >> CONFIG_MEMORY_FAILURE=y >> CONFIG_IDLE_PAGE_TRACKING=y >> >> #define MAX_NR_ZONES 3 >> #define ZONES_SHIFT 2 >> #define MAX_PHYSMEM_BITS 52 >> #define SECTION_SIZE_BITS 30 >> #define SECTIONS_WIDTH 22 > > ^^^ Those we get back with VMEMMAP enabled. > > So for configs for which the check is intended, it passes. We just > need to make it conditional to those. Ok, thanks for the analysis, I had missed that and was about to send a different patch to increase STRUCT_PAGE_MAX_SHIFT in some configurations, which is not as good. > From 1d24635a6c7cd395bad5c29a3b9e5d2e98d9ab84 Mon Sep 17 00:00:00 2001 > From: Johannes Weiner <hannes@xxxxxxxxxxx> > Date: Mon, 23 Jul 2018 10:18:23 -0400 > Subject: [PATCH] arm64: fix vmemmap BUILD_BUG_ON() triggering on !vmemmap > setups > > Arnd reports the following arm64 randconfig build error with the PSI > patches that add another page flag: > You could add further text here that I had just added to my patch description (not sent): Further experiments show that the build error already existed before, but was only triggered with larger values of CONFIG_NR_CPU and/or CONFIG_NODES_SHIFT that might be used in actual configurations but not in randconfig builds. With longer CPU and node masks, I could recreate the problem with kernels as old as linux-4.7 when arm64 NUMA support got added. Cc: stable@xxxxxxxxxxxxxxx Fixes: 1a2db300348b ("arm64, numa: Add NUMA support for arm64 platforms.") Fixes: 3e1907d5bf5a ("arm64: mm: move vmemmap region right below the linear region") > arch/arm64/mm/init.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c > index 1b18b4722420..72c9b6778b0a 100644 > --- a/arch/arm64/mm/init.c > +++ b/arch/arm64/mm/init.c > @@ -611,11 +611,13 @@ void __init mem_init(void) > BUILD_BUG_ON(TASK_SIZE_32 > TASK_SIZE_64); > #endif > > +#ifndef CONFIG_SPARSEMEM_VMEMMAP > /* I tested it on two broken configurations, and found that you have a typo here, it should be 'ifdef', not 'ifndef'. With that change, it seems to build fine. Tested-by: Arnd Bergmann <arnd@xxxxxxxx> Arnd