Messages in this thread | | | From | Yanan Wang <> | Subject | [PATCH v2 0/3] Fix several bugs in KVM stage 2 translation | Date | Wed, 2 Dec 2020 04:10:31 +0800 |
| |
When installing a new pte entry or updating an old valid entry in stage 2 translation, we use get_page()/put_page() to record page_count of the page-table pages. PATCH 1/3 aims to fix incorrect use of get_page()/put_page() in stage 2, which might make page-table pages unable to be freed when unmapping a range.
When dirty logging of a guest with hugepages is finished, we should merge tables back into a block entry if adjustment of huge mapping is found necessary. In addition to installing the block entry, we should not only free the non-huge page-table pages but also invalidate all the TLB entries of non-huge mappings for the block. PATCH 2/3 adds enough TLBI when merging tables into a block entry.
The rewrite of page-table code and fault handling add two different handlers for "just relaxing permissions" and "map by stage2 page-table walk", that's good improvement. Yet, in function user_mem_abort(), conditions where we choose the above two fault handlers are not strictly distinguished. This will causes guest errors such as infinite-loop (soft lockup will occur in result), because of calling the inappropriate fault handler. So, a solution that can strictly distinguish conditions is introduced in PATCH 3/3.
Changes from v1: * In PATCH 1/3, introduce a more concise fix. * In PATCH 2/3, using full S2 TLB invalidation when merging tables into a block entry.
Yanan Wang (3): KVM: arm64: Fix possible memory leak in kvm stage2 KVM: arm64: Fix handling of merging tables into a block entry KVM: arm64: Add usage of stage 2 fault lookup level in user_mem_abort()
arch/arm64/include/asm/esr.h | 1 + arch/arm64/include/asm/kvm_emulate.h | 5 +++++ arch/arm64/kvm/hyp/pgtable.c | 11 ++++++++++- arch/arm64/kvm/mmu.c | 11 +++++++++-- 4 files changed, 25 insertions(+), 3 deletions(-)
-- 2.19.1
| |