Apparently no TLB flush is needed when there's no valid rmap in memory slot.

Signed-off-by: Kai Huang <[email protected]>
---
 arch/x86/kvm/mmu.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index f83fc6c..d43bf50 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -4309,6 +4309,7 @@ void kvm_mmu_slot_remove_write_access(struct kvm *kvm, 
int slot)
        struct kvm_memory_slot *memslot;
        gfn_t last_gfn;
        int i;
+       bool flush = false;
 
        memslot = id_to_memslot(kvm->memslots, slot);
        last_gfn = memslot->base_gfn + memslot->npages - 1;
@@ -4325,7 +4326,8 @@ void kvm_mmu_slot_remove_write_access(struct kvm *kvm, 
int slot)
 
                for (index = 0; index <= last_index; ++index, ++rmapp) {
                        if (*rmapp)
-                               __rmap_write_protect(kvm, rmapp, false);
+                               flush |= __rmap_write_protect(kvm, rmapp,
+                                               false);
 
                        if (need_resched() || spin_needbreak(&kvm->mmu_lock))
                                cond_resched_lock(&kvm->mmu_lock);
@@ -4352,7 +4354,8 @@ void kvm_mmu_slot_remove_write_access(struct kvm *kvm, 
int slot)
         * instead of PT_WRITABLE_MASK, that means it does not depend
         * on PT_WRITABLE_MASK anymore.
         */
-       kvm_flush_remote_tlbs(kvm);
+       if (flush)
+               kvm_flush_remote_tlbs(kvm);
 }
 
 #define BATCH_ZAP_PAGES        10
-- 
2.1.0

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to