arm64: KVM: fix 2-level page tables unmapping
authorMarc Zyngier <marc.zyngier@arm.com>
Tue, 6 Aug 2013 12:05:48 +0000 (13:05 +0100)
committerChristoffer Dall <christoffer.dall@linaro.org>
Thu, 8 Aug 2013 01:17:39 +0000 (18:17 -0700)
commit979acd5e18c3e5cb7e3308c699d79553af5af8c6
treecda729a9d652b3d19cb88efa78e846af4032cf67
parentd3840b26614d8ce3db53c98061d9fcb1b9ccb0dd
arm64: KVM: fix 2-level page tables unmapping

When using 64kB pages, we only have two levels of page tables,
meaning that PGD, PUD and PMD are fused. In this case, trying
to refcount PUDs and PMDs independently is a a complete disaster,
as they are the same.

We manage to get it right for the allocation (stage2_set_pte uses
{pmd,pud}_none), but the unmapping path clears both pud and pmd
refcounts, which fails spectacularly with 2-level page tables.

The fix is to avoid calling clear_pud_entry when both the pmd and
pud pages are empty. For this, and instead of introducing another
pud_empty function, consolidate both pte_empty and pmd_empty into
page_empty (the code is actually identical) and use that to also
test the validity of the pud.

Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
arch/arm/kvm/mmu.c