On Fri, Jun 24, 2022 at 11:36:56AM +0800, Hou Wenlong wrote: > 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. > So this patchset would fix them and do some cleanups. One thing that would help prevent future buggy use of kvm_flush_remote_tlbs_with_address(), and clean up this series, would be to introduce some helper functions for common operations. In fact, even if there is only one caller, I still think it would be useful to have helper functions because it makes it clear the author's intent. For example, I think the following helpers would be useful in this series: /* Flush the given page (huge or not) of guest memory. */ static void kvm_flush_remote_tlbs_gfn(struct kvm *kvm, gfn_t gfn, int level) { u64 pages = KVM_PAGES_PER_HPAGE(level); kvm_flush_remote_tlbs_with_address(kvm, gfn, pages); } /* Flush the range of guest memory mapped by the given SPTE. */ static void kvm_flush_remote_tlbs_sptep(struct kvm *kvm, u64 *sptep) { struct kvm_mmu_page *sp = sptep_to_sp(sptep); gfn_t gfn = kvm_mmu_page_get_gfn(sp, spte_index(sptep)); kvm_flush_remote_tlbs_gfn(kvm, gfn, sp->role.level); } /* Flush all memory mapped by the given direct SP. */ static void kvm_flush_remote_tlbs_direct_sp(struct kvm *kvm, struct kvm_mmu_page *sp) { WARN_ON_ONCE(!sp->role.direct); kvm_flush_remote_tlbs_gfn(kvm, sp->gfn, sp->role.level + 1); } > > Hou Wenlong (5): > 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: Use 1 as the size of gfn range for tlb flushing in > FNAME(invlpg)() > > arch/x86/kvm/mmu/mmu.c | 15 +++++++++------ > arch/x86/kvm/mmu/paging_tmpl.h | 2 +- > arch/x86/kvm/mmu/tdp_mmu.c | 4 ++-- > 3 files changed, 12 insertions(+), 9 deletions(-) > > -- > 2.31.1 >