[PATCH] ARM: mm: reduce maximum number of CPUs if DEBUG_KMAP_LOCAL is enabled
Peter Robinson
pbrobinson at gmail.com
Tue Feb 16 18:06:18 EST 2021
On Tue, Feb 16, 2021 at 6:15 PM Ard Biesheuvel <ardb at kernel.org> wrote:
>
> The debugging code for kmap_local() doubles the number of fixmap slots
> allocated for kmap_local(), in order to use half of them as guard
> regions. This causes the fixmap region to grow downwards and collide
> with the newly added virtual DT mapping, which is obviously not good.
>
> One manifestation of this is EFI boot on a kernel built with NR_CPUS=32,
> which may pass the FDT in highmem, resulting in block entries that the
> fixmap code misidentifies as table entries, and subsequently tries to
> dereference using a phys-to-virt translation that is only valid for
> lowmem. This results in a cryptic splat such as the one below.
>
> ftrace: allocating 45548 entries in 89 pages
> 8<--- cut here ---
> Unable to handle kernel paging request at virtual address fc6006f0
> pgd = (ptrval)
> [fc6006f0] *pgd=80000040207003, *pmd=00000000
> Internal error: Oops: a06 [#1] SMP ARM
> Modules linked in:
> CPU: 0 PID: 0 Comm: swapper Not tainted 5.11.0+ #382
> Hardware name: Generic DT based system
> PC is at cpu_ca15_set_pte_ext+0x24/0x30
> LR is at __set_fixmap+0xe4/0x118
> pc : [<c041ac9c>] lr : [<c04189d8>] psr: 400000d3
> sp : c1601ed8 ip : 00400000 fp : 00800000
> r10: 0000071f r9 : 00421000 r8 : 00c00000
> r7 : 00c00000 r6 : 0000071f r5 : ffade000 r4 : 4040171f
> r3 : 00c00000 r2 : 4040171f r1 : c041ac78 r0 : fc6006f0
> Flags: nZcv IRQs off FIQs off Mode SVC_32 ISA ARM Segment none
> Control: 30c5387d Table: 40203000 DAC: 00000001
> Process swapper (pid: 0, stack limit = 0x(ptrval))
>
> So let's limit the supported number of CPUs to 16 when
> CONFIG_DEBUG_KMAP_LOCAL is in effect.
>
> Reported-by: Peter Robinson <pbrobinson at gmail.com>
> Signed-off-by: Ard Biesheuvel <ardb at kernel.org>
Tested-by: Peter Robinson <pbrobinson at gmail.com>
Tested with both a LPAE and non LPAE kernel.
> ---
> arch/arm/Kconfig | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index 138248999df7..3d2c684eab77 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -1310,9 +1310,15 @@ config KASAN_SHADOW_OFFSET
>
> config NR_CPUS
> int "Maximum number of CPUs (2-32)"
> - range 2 32
> + range 2 16 if DEBUG_KMAP_LOCAL
> + range 2 32 if !DEBUG_KMAP_LOCAL
> depends on SMP
> default "4"
> + help
> + The maximum number of CPUs that the kernel can support.
> + Up to 32 CPUs can be supported, or up to 16 if kmap_local()
> + debugging is enabled, which uses half of the per-CPU fixmap
> + slots as guard regions.
>
> config HOTPLUG_CPU
> bool "Support for hot-pluggable CPUs"
> --
> 2.30.0
>
More information about the linux-arm-kernel
mailing list