On 13/10/2018 16:53, lantianyu1986@xxxxxxxxx wrote: > + bool flush = false; > int i; > > spin_lock(&kvm->mmu_lock); > @@ -5654,18 +5655,27 @@ void kvm_zap_gfn_range(struct kvm *kvm, gfn_t gfn_start, gfn_t gfn_end) > slots = __kvm_memslots(kvm, i); > kvm_for_each_memslot(memslot, slots) { > gfn_t start, end; > + bool flush_tlb = true; > > start = max(gfn_start, memslot->base_gfn); > end = min(gfn_end, memslot->base_gfn + memslot->npages); > if (start >= end) > continue; > > - slot_handle_level_range(kvm, memslot, kvm_zap_rmapp, > - PT_PAGE_TABLE_LEVEL, PT_MAX_HUGEPAGE_LEVEL, > - start, end - 1, true); > + if (kvm_available_flush_tlb_with_range()) > + flush_tlb = false; This should be moved outside the for, because it's invariant. > + flush = slot_handle_level_range(kvm, memslot, > + kvm_zap_rmapp, PT_PAGE_TABLE_LEVEL, > + PT_MAX_HUGEPAGE_LEVEL, start, > + end - 1, flush_tlb); ... and this should be "flush |= ". > } > } > > + if (flush && kvm_available_flush_tlb_with_range()) > + kvm_flush_remote_tlbs_with_address(kvm, gfn_start, > + gfn_end - gfn_start + 1); > + ... and this can be just if (flush), because if flush_tlb is true then slot_handle_level_range always returns false. Paolo