Re: [PATCH] x86, mm: disable 1GB direct mapping when disabling 2MB mapping

From: Ingo Molnar
Date: Sun Jun 11 2017 - 03:58:11 EST



* Vlastimil Babka <vbabka@xxxxxxx> wrote:

> The kmemleak and debug_pagealloc features both disable using huge pages for
> direct mapping so they can do cpa() on page level granularity in any context.
> However they only do that for 2MB pages, which means 1GB pages can still be
> used if the CPU supports it, unless disabled by a boot param, which is
> non-obvious. Disable also 1GB pages when disabling 2MB pages.
>
> Signed-off-by: Vlastimil Babka <vbabka@xxxxxxx>
> ---
> arch/x86/mm/init.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c
> index cbc87ea98751..20282dfce0fa 100644
> --- a/arch/x86/mm/init.c
> +++ b/arch/x86/mm/init.c
> @@ -170,6 +170,10 @@ static void __init probe_page_size_mask(void)
> */
> if (boot_cpu_has(X86_FEATURE_PSE) && !debug_pagealloc_enabled())
> page_size_mask |= 1 << PG_LEVEL_2M;
> + else
> + direct_gbpages = 0;
> +#else
> + direct_gbpages = 0;
> #endif
>
> /* Enable PSE if available */

So I agree with the fix, but I think it would be much cleaner to eliminate the
outer #ifdef:

#if !defined(CONFIG_KMEMCHECK)

and put it into the condition, like this:

if (boot_cpu_has(X86_FEATURE_PSE) && !debug_pagealloc_enabled() && !IS_ENABLED(CONFIG_KMEMCHECK))
page_size_mask |= 1 << PG_LEVEL_2M;
else
direct_gbpages = 0;

without any #ifdeffery. This makes it much more readable all around, and also
makes it obvious that when the 2MB size bit is not set then gbpages are disabled
as well.

Thanks,

Ingo