From mboxrd@z Thu Jan 1 00:00:00 1970 From: Aurelien Jarno Subject: Re: cr3 OOS optimisation breaks 32-bit GNU/kFreeBSD guest Date: Tue, 24 Mar 2009 11:39:06 +0100 Message-ID: <20090324103906.GS28499@hall.aurel32.net> References: <20090223003305.GW12976@hall.aurel32.net> <20090320231405.GA26415@amt.cnet> <49C60644.2090904@redhat.com> <20090323172725.GA28775@amt.cnet> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-15 Cc: Avi Kivity , kvm@vger.kernel.org To: Marcelo Tosatti Return-path: Received: from hall.aurel32.net ([88.191.82.174]:56323 "EHLO hall.aurel32.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757530AbZCXKjJ (ORCPT ); Tue, 24 Mar 2009 06:39:09 -0400 Content-Disposition: inline In-Reply-To: <20090323172725.GA28775@amt.cnet> Sender: kvm-owner@vger.kernel.org List-ID: On Mon, Mar 23, 2009 at 02:27:25PM -0300, Marcelo Tosatti wrote: > On Sun, Mar 22, 2009 at 11:35:00AM +0200, Avi Kivity wrote: > > Good catch, indeed. But is it sufficient? We could unlink a page > > through other means, for example by the guest zapping a page directory > > entry. > > Yep. > > > Maybe it's best to resync when relinking a global page? > > How about this. It will shorten the unsync period of global pages, > unfortunately. JFYI, it still fixes the problem seen with FreeBSD. > diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c > index 2a36f7f..bccdcc7 100644 > --- a/arch/x86/kvm/mmu.c > +++ b/arch/x86/kvm/mmu.c > @@ -1238,6 +1238,10 @@ static struct kvm_mmu_page *kvm_mmu_get_page(struct kvm_vcpu *vcpu, > set_bit(KVM_REQ_MMU_SYNC, &vcpu->requests); > kvm_mmu_mark_parents_unsync(vcpu, sp); > } > + if (role.level != PT_PAGE_TABLE_LEVEL && > + !list_empty(&vcpu->kvm->arch.oos_global_pages)) > + set_bit(KVM_REQ_MMU_GLOBAL_SYNC, &vcpu->requests); > + > pgprintk("%s: found\n", __func__); > return sp; > } > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index 2ea8262..48169d7 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -3109,6 +3109,8 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) > kvm_write_guest_time(vcpu); > if (test_and_clear_bit(KVM_REQ_MMU_SYNC, &vcpu->requests)) > kvm_mmu_sync_roots(vcpu); > + if (test_and_clear_bit(KVM_REQ_MMU_GLOBAL_SYNC, &vcpu->requests)) > + kvm_mmu_sync_global(vcpu); > if (test_and_clear_bit(KVM_REQ_TLB_FLUSH, &vcpu->requests)) > kvm_x86_ops->tlb_flush(vcpu); > if (test_and_clear_bit(KVM_REQ_REPORT_TPR_ACCESS, > diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h > index 11eb702..8efd6e3 100644 > --- a/include/linux/kvm_host.h > +++ b/include/linux/kvm_host.h > @@ -37,7 +37,8 @@ > #define KVM_REQ_PENDING_TIMER 5 > #define KVM_REQ_UNHALT 6 > #define KVM_REQ_MMU_SYNC 7 > -#define KVM_REQ_KVMCLOCK_UPDATE 8 > +#define KVM_REQ_MMU_GLOBAL_SYNC 8 > +#define KVM_REQ_KVMCLOCK_UPDATE 9 > > #define KVM_USERSPACE_IRQ_SOURCE_ID 0 > > -- Aurelien Jarno GPG: 1024D/F1BCDB73 aurelien@aurel32.net http://www.aurel32.net