From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Yang, Sheng" Subject: Re: [PATCH][REPOST] KVM: VMX: Always return 0 for clear_flush_young() when using EPT Date: Mon, 8 Sep 2008 15:22:01 +0800 Message-ID: <200809081522.01819.sheng.yang@intel.com> References: <200809040929.02012.sheng.yang@intel.com> <48C3D7CA.4030506@qumranet.com> Mime-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_ZKNxIbVC+c5QcVB" Cc: kvm@vger.kernel.org To: Avi Kivity Return-path: Received: from mga02.intel.com ([134.134.136.20]:2524 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751975AbYIHHSs (ORCPT ); Mon, 8 Sep 2008 03:18:48 -0400 In-Reply-To: <48C3D7CA.4030506@qumranet.com> Sender: kvm-owner@vger.kernel.org List-ID: --Boundary-00=_ZKNxIbVC+c5QcVB Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline On Sunday 07 September 2008 21:31:54 Avi Kivity wrote: > Why not to a > > if (!shadow_access_mask) > return 0; > > in the beginning? Oops... > > I guess returning 'old' is safer than returning 'young'. Yeah, me too, though possibly cause thrashing. How about this one? -- From: Sheng Yang Date: Mon, 8 Sep 2008 15:12:30 +0800 Subject: [PATCH] KVM: VMX: Always return old for clear_flush_young() when using EPT As well as discard fake accessed bit and dirty bit of EPT. Signed-off-by: Sheng Yang --- arch/x86/kvm/mmu.c | 4 ++++ arch/x86/kvm/vmx.c | 3 +-- arch/x86/kvm/vmx.h | 2 -- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index a87a11e..bce3e25 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -711,6 +711,10 @@ static int kvm_age_rmapp(struct kvm *kvm, unsigned long *rmapp) u64 *spte; int young = 0; + /* always return old for EPT */ + if (!shadow_accessed_mask) + return 0; + spte = rmap_next(kvm, rmapp, NULL); while (spte) { int _young; diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 14671f4..2d6c770 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -3558,8 +3558,7 @@ static int __init vmx_init(void) kvm_mmu_set_base_ptes(VMX_EPT_READABLE_MASK | VMX_EPT_WRITABLE_MASK | VMX_EPT_DEFAULT_MT << VMX_EPT_MT_EPTE_SHIFT); - kvm_mmu_set_mask_ptes(0ull, VMX_EPT_FAKE_ACCESSED_MASK, - VMX_EPT_FAKE_DIRTY_MASK, 0ull, + kvm_mmu_set_mask_ptes(0ull, 0ull, 0ull, 0ull, VMX_EPT_EXECUTABLE_MASK); kvm_enable_tdp(); } else diff --git a/arch/x86/kvm/vmx.h b/arch/x86/kvm/vmx.h index 0c22e5f..41e8c10 100644 --- a/arch/x86/kvm/vmx.h +++ b/arch/x86/kvm/vmx.h @@ -370,8 +370,6 @@ enum vmcs_field { #define VMX_EPT_READABLE_MASK 0x1ull #define VMX_EPT_WRITABLE_MASK 0x2ull #define VMX_EPT_EXECUTABLE_MASK 0x4ull -#define VMX_EPT_FAKE_ACCESSED_MASK (1ull << 62) -#define VMX_EPT_FAKE_DIRTY_MASK (1ull << 63) #define VMX_EPT_IDENTITY_PAGETABLE_ADDR 0xfffbc000ul -- 1.5.6.5 --Boundary-00=_ZKNxIbVC+c5QcVB Content-Type: text/x-diff; charset="iso-8859-1"; name="0001-KVM-VMX-Always-return-old-for-clear_flush_young.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="0001-KVM-VMX-Always-return-old-for-clear_flush_young.patch" =46rom 250f978cf178fce89b9e5c68007307ccddbb2868 Mon Sep 17 00:00:00 2001 =46rom: Sheng Yang Date: Mon, 8 Sep 2008 15:12:30 +0800 Subject: [PATCH] KVM: VMX: Always return old for clear_flush_young() when u= sing EPT As well as discard fake accessed bit and dirty bit of EPT. Signed-off-by: Sheng Yang =2D-- arch/x86/kvm/mmu.c | 4 ++++ arch/x86/kvm/vmx.c | 3 +-- arch/x86/kvm/vmx.h | 2 -- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index a87a11e..bce3e25 100644 =2D-- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -711,6 +711,10 @@ static int kvm_age_rmapp(struct kvm *kvm, unsigned lon= g *rmapp) u64 *spte; int young =3D 0; =20 + /* always return old for EPT */ + if (!shadow_accessed_mask) + return 0; + spte =3D rmap_next(kvm, rmapp, NULL); while (spte) { int _young; diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 14671f4..2d6c770 100644 =2D-- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -3558,8 +3558,7 @@ static int __init vmx_init(void) kvm_mmu_set_base_ptes(VMX_EPT_READABLE_MASK | VMX_EPT_WRITABLE_MASK | VMX_EPT_DEFAULT_MT << VMX_EPT_MT_EPTE_SHIFT); =2D kvm_mmu_set_mask_ptes(0ull, VMX_EPT_FAKE_ACCESSED_MASK, =2D VMX_EPT_FAKE_DIRTY_MASK, 0ull, + kvm_mmu_set_mask_ptes(0ull, 0ull, 0ull, 0ull, VMX_EPT_EXECUTABLE_MASK); kvm_enable_tdp(); } else diff --git a/arch/x86/kvm/vmx.h b/arch/x86/kvm/vmx.h index 0c22e5f..41e8c10 100644 =2D-- a/arch/x86/kvm/vmx.h +++ b/arch/x86/kvm/vmx.h @@ -370,8 +370,6 @@ enum vmcs_field { #define VMX_EPT_READABLE_MASK 0x1ull #define VMX_EPT_WRITABLE_MASK 0x2ull #define VMX_EPT_EXECUTABLE_MASK 0x4ull =2D#define VMX_EPT_FAKE_ACCESSED_MASK (1ull << 62) =2D#define VMX_EPT_FAKE_DIRTY_MASK (1ull << 63) =20 #define VMX_EPT_IDENTITY_PAGETABLE_ADDR 0xfffbc000ul =20 =2D-=20 1.5.6.5 --Boundary-00=_ZKNxIbVC+c5QcVB--