From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: [PATCH v2 4/5] KVM: Flush TLB in FNAME(invlpg) without holding mmu_lock Date: Thu, 17 May 2012 13:24:43 +0300 Message-ID: <1337250284-18607-4-git-send-email-avi@redhat.com> References: <1337250284-18607-1-git-send-email-avi@redhat.com> To: Marcelo Tosatti , Xiao Guangrong , Takuya Yoshikawa , kvm@vger.kernel.org Return-path: Received: from mx1.redhat.com ([209.132.183.28]:47455 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1759475Ab2EQKYz (ORCPT ); Thu, 17 May 2012 06:24:55 -0400 In-Reply-To: <1337250284-18607-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 | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 03a9c80..0e1faec 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -1895,7 +1895,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; @@ -1911,13 +1911,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 9fe5f72..72c9cf4 100644 --- a/arch/x86/kvm/paging_tmpl.h +++ b/arch/x86/kvm/paging_tmpl.h @@ -697,10 +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_mark_tlb_dirty(vcpu->kvm); - - kvm_cond_flush_remote_tlbs(vcpu->kvm); + mmu_page_zap_pte(vcpu->kvm, sp, sptep); if (!rmap_can_add(vcpu)) break; @@ -716,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.1