From mboxrd@z Thu Jan 1 00:00:00 1970 From: Xiao Guangrong Subject: Re: [PATCH 2/2] KVM: MMU: Flush TLBs only once in invlpg() before releasing mmu_lock Date: Fri, 10 Feb 2012 14:55:58 +0800 Message-ID: <4F34BF7E.4050009@linux.vnet.ibm.com> References: <20120210152831.6ac3ac87.yoshikawa.takuya@oss.ntt.co.jp> <20120210152950.b54969be.yoshikawa.takuya@oss.ntt.co.jp> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Cc: avi@redhat.com, mtosatti@redhat.com, kvm@vger.kernel.org, aarcange@redhat.com To: Takuya Yoshikawa Return-path: Received: from e28smtp01.in.ibm.com ([122.248.162.1]:37401 "EHLO e28smtp01.in.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750822Ab2BJG43 (ORCPT ); Fri, 10 Feb 2012 01:56:29 -0500 Received: from /spool/local by e28smtp01.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 10 Feb 2012 12:26:24 +0530 Received: from d28av03.in.ibm.com (d28av03.in.ibm.com [9.184.220.65]) by d28relay05.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q1A6u2LD3277008 for ; Fri, 10 Feb 2012 12:26:03 +0530 Received: from d28av03.in.ibm.com (loopback [127.0.0.1]) by d28av03.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q1A6u1PP027140 for ; Fri, 10 Feb 2012 17:56:02 +1100 In-Reply-To: <20120210152950.b54969be.yoshikawa.takuya@oss.ntt.co.jp> Sender: kvm-owner@vger.kernel.org List-ID: On 02/10/2012 02:29 PM, Takuya Yoshikawa wrote: > diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h > index 1561028..69d06f5 100644 > --- a/arch/x86/kvm/paging_tmpl.h > +++ b/arch/x86/kvm/paging_tmpl.h > @@ -682,6 +682,7 @@ static void FNAME(invlpg)(struct kvm_vcpu *vcpu, gva_t gva) > mmu_topup_memory_caches(vcpu); > > spin_lock(&vcpu->kvm->mmu_lock); > + > for_each_shadow_entry(vcpu, gva, iterator) { > level = iterator.level; > sptep = iterator.sptep; > @@ -697,8 +698,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; > @@ -713,6 +713,8 @@ static void FNAME(invlpg)(struct kvm_vcpu *vcpu, gva_t gva) > if (!is_shadow_present_pte(*sptep) || !sp->unsync_children) > break; > } > + > + kvm_flush_remote_tlbs(vcpu->kvm); > spin_unlock(&vcpu->kvm->mmu_lock); It is obvious wrong, i do not think all tlbs always need be flushed...