On Wed, Aug 24, 2022 at 05:29:19PM +0800, Hou Wenlong wrote: > When the spte of hupe page is dropped in kvm_set_pte_rmapp(), > the whole gfn range covered by the spte should be flushed. > However, rmap_walk_init_level() doesn't align down the gfn > for new level like tdp iterator does, then the gfn used in > kvm_set_pte_rmapp() is not the base gfn of huge page. And > the size of gfn range is wrong too for huge page. Use the > base gfn of huge page and the size of huge page for > flushing tlbs for huge page. > > Fixes: c3134ce240eed ("KVM: Replace old tlb flush function with new one to flush a specified range.") > Signed-off-by: Hou Wenlong <houwenlong.hwl@xxxxxxxxxxxx> > --- > arch/x86/kvm/mmu/mmu.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c > index a3578abd8bbc..3bcff56df109 100644 > --- a/arch/x86/kvm/mmu/mmu.c > +++ b/arch/x86/kvm/mmu/mmu.c > @@ -1438,7 +1438,8 @@ static bool kvm_set_pte_rmap(struct kvm *kvm, struct kvm_rmap_head *rmap_head, > } > > if (need_flush && kvm_available_flush_tlb_with_range()) { > - kvm_flush_remote_tlbs_with_address(kvm, gfn, 1); > + kvm_flush_remote_tlbs_with_address(kvm, gfn & -KVM_PAGES_PER_HPAGE(level), Rounding down the GFN to a huge page size is a common pattern throughout KVM. Can you introduce a common way of doing this and clean up the other call sites? > + KVM_PAGES_PER_HPAGE(level)); This eventually gets converted to kvm_flush_remote_tlbs_gfn() in a later patch; which is even more reason to introduce kvm_flush_remote_tlbs_gfn() in the previous patch. > return false; > } > > -- > 2.31.1 >