On Tue, Apr 06, 2021 at 09:57:03PM +0200, Oscar Salvador wrote: > On Tue, Apr 06, 2021 at 11:39:47AM -0700, Randy Dunlap wrote: > > > > Looks like that compound "if" is too much for gcc 7.5.0 to handle: > > > > > > } else if (IS_ENABLED(CONFIG_SPARSEMEM_VMEMMAP) && > > > vmemmap_pmd_is_unused(addr, next)) { > > > free_hugepage_table(pmd_page(*pmd), > > > altmap); > > > spin_lock(&init_mm.page_table_lock); > > > pmd_clear(pmd); > > > spin_unlock(&init_mm.page_table_lock); > > > } > > > > > > > > > > This is what I am using for now: > > Hi Randy > > Yeah, that is what v4 was using [1]. > We decided to get rid of the ifdef for costimetic reasons but it seems > it does not do the trick. > > I will ask Andrew to squash that on top. This is pretty ugly. What I was doing was this: +++ b/arch/x86/mm/init_64.c @@ -862,6 +862,9 @@ static bool __meminit vmemmap_pmd_is_unused(unsigned long addr, unsigned long en return !memchr_inv((void *)start, PAGE_UNUSED, PMD_SIZE); } +#else +static inline bool vmemmap_pmd_is_unused(unsigned long addr, unsigned long end) +{ return false; } #endif static void __meminit __vmemmap_use_sub_pmd(unsigned long start) @@ -924,6 +927,9 @@ static void __meminit vmemmap_use_new_sub_pmd(unsigned long start, unsigned long if (!IS_ALIGNED(end, PMD_SIZE)) unused_pmd_start = end; } +#else +static inline bool vmemmap_pmd_is_unused(unsigned long addr, unsigned long end) +{ return false; } #endif /* (whitespace damaged, but ...)