From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: [PATCH 3/4] KVM: Flush TLB in FNAME(invlpg) without holding mmu_lock Date: Thu, 3 May 2012 14:23:01 +0300 Message-ID: <1336044182-12023-4-git-send-email-avi@redhat.com> References: <1336044182-12023-1-git-send-email-avi@redhat.com> To: kvm@vger.kernel.org, Marcelo Tosatti , Xiao Guangrong , takuya.yoshikawa@gmail.com Return-path: Received: from mx1.redhat.com ([209.132.183.28]:41496 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751745Ab2ECLXV (ORCPT ); Thu, 3 May 2012 07:23:21 -0400 In-Reply-To: <1336044182-12023-1-git-send-email-avi@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: mmu_page_zap_pte() is modified to mark the TLB as dirty; but currently only FNAME(invlpg) takes advantage of this. Signed-off-by: Avi Kivity --- arch/x86/kvm/mmu.c | 7 +++---- arch/x86/kvm/paging_tmpl.h | 5 +++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 07424cf..0e7bcff 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -1887,7 +1887,7 @@ static void validate_direct_spte(struct kvm_vcpu *vcpu, u64 *sptep, } } -static bool mmu_page_zap_pte(struct kvm *kvm, struct kvm_mmu_page *sp, +static void mmu_page_zap_pte(struct kvm *kvm, struct kvm_mmu_page *sp, u64 *spte) { u64 pte; @@ -1903,13 +1903,12 @@ static bool mmu_page_zap_pte(struct kvm *kvm, struct kvm_mmu_page *sp, child = page_header(pte & PT64_BASE_ADDR_MASK); drop_parent_pte(child, spte); } - return true; + kvm_mark_tlb_dirty(kvm); + return; } if (is_mmio_spte(pte)) mmu_spte_clear_no_track(spte); - - return false; } static void kvm_mmu_page_unlink_children(struct kvm *kvm, diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h index 97e2a81..72c9cf4 100644 --- a/arch/x86/kvm/paging_tmpl.h +++ b/arch/x86/kvm/paging_tmpl.h @@ -697,8 +697,7 @@ static void FNAME(invlpg)(struct kvm_vcpu *vcpu, gva_t gva) pte_gpa = FNAME(get_level1_sp_gpa)(sp); pte_gpa += (sptep - sp->spt) * sizeof(pt_element_t); - if (mmu_page_zap_pte(vcpu->kvm, sp, sptep)) - kvm_flush_remote_tlbs(vcpu->kvm); + mmu_page_zap_pte(vcpu->kvm, sp, sptep); if (!rmap_can_add(vcpu)) break; @@ -714,6 +713,8 @@ static void FNAME(invlpg)(struct kvm_vcpu *vcpu, gva_t gva) break; } spin_unlock(&vcpu->kvm->mmu_lock); + + kvm_cond_flush_remote_tlbs(vcpu->kvm); } static gpa_t FNAME(gva_to_gpa)(struct kvm_vcpu *vcpu, gva_t vaddr, u32 access, -- 1.7.10