KVM: arm64: Fix host stage-2 PGD refcount
authorQuentin Perret <qperret@google.com>
Tue, 5 Oct 2021 09:01:41 +0000 (10:01 +0100)
committerMarc Zyngier <maz@kernel.org>
Tue, 5 Oct 2021 12:02:54 +0000 (13:02 +0100)
commit1d58a17ef54599506d44c45ac95be27273a4d2b1
tree10dbb0b3fb1a689c6c114e045fae8b9d621e9b41
parente840f42a49925707fca90e6c7a4095118fdb8c4d
KVM: arm64: Fix host stage-2 PGD refcount

The KVM page-table library refcounts the pages of concatenated stage-2
PGDs individually. However, when running KVM in protected mode, the
host's stage-2 PGD is currently managed by EL2 as a single high-order
compound page, which can cause the refcount of the tail pages to reach 0
when they shouldn't, hence corrupting the page-table.

Fix this by introducing a new hyp_split_page() helper in the EL2 page
allocator (matching the kernel's split_page() function), and make use of
it from host_s2_zalloc_pages_exact().

Fixes: 1025c8c0c6ac ("KVM: arm64: Wrap the host with a stage 2")
Acked-by: Will Deacon <will@kernel.org>
Suggested-by: Will Deacon <will@kernel.org>
Signed-off-by: Quentin Perret <qperret@google.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20211005090155.734578-5-qperret@google.com
arch/arm64/kvm/hyp/include/nvhe/gfp.h
arch/arm64/kvm/hyp/nvhe/mem_protect.c
arch/arm64/kvm/hyp/nvhe/page_alloc.c