Hi Marc, Noticed this patch while catching up with the lists. Marc Zyngier <maz@xxxxxxxxxx> writes: > For the obscure cases where PMD and PUD are the same size > (64kB pages with 42bit VA, for example, which results in only > two levels of page tables), we can't map anything as a PUD, > because there is... erm... no PUD to speak of. Everything is > either a PMD or a PTE. > > So let's only try and map a PUD when its size is different from > that of a PMD. > > Cc: stable@xxxxxxxxxxxxxxx > Fixes: b8e0ba7c8bea ("KVM: arm64: Add support for creating PUD hugepages at stage 2") > Reported-by: Gavin Shan <gshan@xxxxxxxxxx> > Reported-by: Eric Auger <eric.auger@xxxxxxxxxx> > Reviewed-by: Alexandru Elisei <alexandru.elisei@xxxxxxx> > Reviewed-by: Gavin Shan <gshan@xxxxxxxxxx> > Tested-by: Gavin Shan <gshan@xxxxxxxxxx> > Tested-by: Eric Auger <eric.auger@xxxxxxxxxx> > Tested-by: Alexandru Elisei <alexandru.elisei@xxxxxxx> > Signed-off-by: Marc Zyngier <maz@xxxxxxxxxx> > --- > arch/arm64/kvm/mmu.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c > index 0121ef2c7c8d..16b8660ddbcc 100644 > --- a/arch/arm64/kvm/mmu.c > +++ b/arch/arm64/kvm/mmu.c > @@ -1964,7 +1964,12 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, > (fault_status == FSC_PERM && > stage2_is_exec(mmu, fault_ipa, vma_pagesize)); > > - if (vma_pagesize == PUD_SIZE) { > + /* > + * If PUD_SIZE == PMD_SIZE, there is no real PUD level, and > + * all we have is a 2-level page table. Trying to map a PUD in > + * this case would be fatally wrong. > + */ > + if (PUD_SIZE != PMD_SIZE && vma_pagesize == PUD_SIZE) { > pud_t new_pud = kvm_pfn_pud(pfn, mem_type); > > new_pud = kvm_pud_mkhuge(new_pud); Good catch! Missed the 64kb / 42b VA case while adding the initial support. Thanks for fixing it. Punit