ARM: 8817/1: mm: skip cleaning of idmap page tables on LPAE capable cores
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Thu, 13 Dec 2018 13:04:56 +0000 (14:04 +0100)
committerRussell King <rmk+kernel@armlinux.org.uk>
Fri, 1 Feb 2019 21:44:05 +0000 (21:44 +0000)
commit9ec5cd0a40f2e7834ddd55708e8def18f0940244
treec729517ec0e04b3ab59172e26f8e6c540e24a117
parentbfeffd155283772bbe78c6a05dec7c0128ee500c
ARM: 8817/1: mm: skip cleaning of idmap page tables on LPAE capable cores

Currently, init_static_idmap() installs some page table entries to
cover the identity mapped part of the kernel image (which is only
about 160 bytes in size in a multi_v7_defconfig Thumb2 build), and
calls flush_cache_louis() to ensure that the updates are visible
to the page table walker on the same core.

When running under virtualization, flush_cache_louis() may take more
than 10 seconds to complete:

[    0.108192] Setting up static identity map for 0x40300000 - 0x403000a0
[   13.078127] rcu: Hierarchical SRCU implementation.

This is due to the fact that set/way ops are not virtualizable, and so
KVM may trap each one, resulting in a substantial delay.

Since only LPAE capable CPUs may execute under virtualization, and
considering that LPAE capable CPUs are guaranteed to have cache
coherent page table walkers (per the architecture), let's only
perform this cache maintenance on non-LPAE cores.

Cc: Will Deacon <will.deacon@arm.com>
Acked-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
arch/arm/mm/idmap.c