From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Yang, Sheng" Subject: [PATCH] KVM: MMU: Add shadow_accessed_shift Date: Fri, 29 Aug 2008 15:28:50 +0800 Message-ID: <200808291528.51242.sheng.yang@intel.com> Mime-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_zU6tIuDNpI85bFq" Cc: kvm@vger.kernel.org To: Avi Kivity Return-path: Received: from mga14.intel.com ([143.182.124.37]:17371 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750900AbYH2H0S (ORCPT ); Fri, 29 Aug 2008 03:26:18 -0400 Sender: kvm-owner@vger.kernel.org List-ID: --Boundary-00=_zU6tIuDNpI85bFq Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline From: Sheng Yang Date: Fri, 29 Aug 2008 14:02:29 +0800 Subject: [PATCH] KVM: MMU: Add shadow_accessed_shift Signed-off-by: Sheng Yang --- arch/x86/kvm/mmu.c | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-) diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 3008279..0997d82 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -151,6 +151,7 @@ static u64 __read_mostly shadow_nx_mask; static u64 __read_mostly shadow_x_mask; /* mutual exclusive with nx_mask */ static u64 __read_mostly shadow_user_mask; static u64 __read_mostly shadow_accessed_mask; +static u16 __read_mostly shadow_accessed_shift; static u64 __read_mostly shadow_dirty_mask; void kvm_mmu_set_nonpresent_ptes(u64 trap_pte, u64 notrap_pte) @@ -171,6 +172,8 @@ void kvm_mmu_set_mask_ptes(u64 user_mask, u64 accessed_mask, { shadow_user_mask = user_mask; shadow_accessed_mask = accessed_mask; + shadow_accessed_shift = find_first_bit((unsigned long *)&accessed_mask, + sizeof(accessed_mask)); shadow_dirty_mask = dirty_mask; shadow_nx_mask = nx_mask; shadow_x_mask = x_mask; @@ -709,10 +712,10 @@ static int kvm_age_rmapp(struct kvm *kvm, unsigned long *rmapp) int _young; u64 _spte = *spte; BUG_ON(!(_spte & PT_PRESENT_MASK)); - _young = _spte & PT_ACCESSED_MASK; + _young = _spte & shadow_accessed_mask; if (_young) { young = 1; - clear_bit(PT_ACCESSED_SHIFT, (unsigned long *)spte); + clear_bit(shadow_accessed_shift, (unsigned long *)spte); } spte = rmap_next(kvm, rmapp, spte); } @@ -1785,7 +1788,7 @@ static void kvm_mmu_access_page(struct kvm_vcpu *vcpu, gfn_t gfn) && shadow_accessed_mask && !(*spte & shadow_accessed_mask) && is_shadow_present_pte(*spte)) - set_bit(PT_ACCESSED_SHIFT, (unsigned long *)spte); + set_bit(shadow_accessed_shift, (unsigned long *)spte); } void kvm_mmu_pte_write(struct kvm_vcpu *vcpu, gpa_t gpa, -- 1.5.4.5 --Boundary-00=_zU6tIuDNpI85bFq Content-Type: text/x-diff; charset="utf-8"; name="0001-KVM-MMU-Add-shadow_accessed_shift.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="0001-KVM-MMU-Add-shadow_accessed_shift.patch" =46rom 3a2cc947a656a6eb4e815e64a44cb3e77a162a89 Mon Sep 17 00:00:00 2001 =46rom: Sheng Yang Date: Fri, 29 Aug 2008 14:02:29 +0800 Subject: [PATCH] KVM: MMU: Add shadow_accessed_shift Signed-off-by: Sheng Yang =2D-- arch/x86/kvm/mmu.c | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-) diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 3008279..0997d82 100644 =2D-- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -151,6 +151,7 @@ static u64 __read_mostly shadow_nx_mask; static u64 __read_mostly shadow_x_mask; /* mutual exclusive with nx_mask */ static u64 __read_mostly shadow_user_mask; static u64 __read_mostly shadow_accessed_mask; +static u16 __read_mostly shadow_accessed_shift; static u64 __read_mostly shadow_dirty_mask; =20 void kvm_mmu_set_nonpresent_ptes(u64 trap_pte, u64 notrap_pte) @@ -171,6 +172,8 @@ void kvm_mmu_set_mask_ptes(u64 user_mask, u64 accessed_= mask, { shadow_user_mask =3D user_mask; shadow_accessed_mask =3D accessed_mask; + shadow_accessed_shift =3D find_first_bit((unsigned long *)&accessed_mask, + sizeof(accessed_mask)); shadow_dirty_mask =3D dirty_mask; shadow_nx_mask =3D nx_mask; shadow_x_mask =3D x_mask; @@ -709,10 +712,10 @@ static int kvm_age_rmapp(struct kvm *kvm, unsigned lo= ng *rmapp) int _young; u64 _spte =3D *spte; BUG_ON(!(_spte & PT_PRESENT_MASK)); =2D _young =3D _spte & PT_ACCESSED_MASK; + _young =3D _spte & shadow_accessed_mask; if (_young) { young =3D 1; =2D clear_bit(PT_ACCESSED_SHIFT, (unsigned long *)spte); + clear_bit(shadow_accessed_shift, (unsigned long *)spte); } spte =3D rmap_next(kvm, rmapp, spte); } @@ -1785,7 +1788,7 @@ static void kvm_mmu_access_page(struct kvm_vcpu *vcpu= , gfn_t gfn) && shadow_accessed_mask && !(*spte & shadow_accessed_mask) && is_shadow_present_pte(*spte)) =2D set_bit(PT_ACCESSED_SHIFT, (unsigned long *)spte); + set_bit(shadow_accessed_shift, (unsigned long *)spte); } =20 void kvm_mmu_pte_write(struct kvm_vcpu *vcpu, gpa_t gpa, =2D-=20 1.5.4.5 --Boundary-00=_zU6tIuDNpI85bFq--