[PATCH v2 0/6] KVM: x86/mmu: Fix wrong usages of range-based tlb flushing

Hou Wenlong
2022-08-24T09:29:46Z

Commit c3134ce240eed
("KVM: Replace old tlb flush function with new one to flush a specified range.")
replaces old tlb flush function with kvm_flush_remote_tlbs_with_address()
to do tlb flushing. However, the gfn range of tlb flushing is wrong in
some cases. E.g., when a spte is dropped, the start gfn of tlb flushing
should be the gfn of spte not the base gfn of SP which contains the spte.
Although, as Paolo said, Hyper-V may treat a 1-page flush the same if the
address points to a huge page, and no fixes are reported so far. So it seems
that it works well for Hyper-V. But it would be better to use the
correct size for huge page. So this patchset would fix them and introduce
some helper functions as David suggested to make the code clear.

Changed from v1:
- Align down gfn in kvm_set_pte_rmapp() instead of change iterator->gfn
in rmap_walk_init_level() in Patch 2.
- Introduce some helper functions for common operations as David
suggested.

v1: https://lore.kernel.org/kvm/cover.1656039275.git.houwenlong.hwl@antgroup.com

Hou Wenlong (6):
KVM: x86/mmu: Fix wrong gfn range of tlb flushing in
validate_direct_spte()
KVM: x86/mmu: Fix wrong gfn range of tlb flushing in
kvm_set_pte_rmapp()
KVM: x86/mmu: Reduce gfn range of tlb flushing in
tdp_mmu_map_handle_target_level()
KVM: x86/mmu: Fix wrong start gfn of tlb flushing with range
KVM: x86/mmu: Introduce helper function to do range-based flushing for
given page
KVM: x86/mmu: Use 1 as the size of gfn range for tlb flushing in
FNAME(invlpg)()

arch/x86/kvm/mmu/mmu.c | 35 +++++++++++++++++++++++----------
arch/x86/kvm/mmu/mmu_internal.h | 10 ++++++++++
arch/x86/kvm/mmu/paging_tmpl.h | 4 ++--
arch/x86/kvm/mmu/tdp_mmu.c | 6 ++----
4 files changed, 39 insertions(+), 16 deletions(-)

--
2.31.1