2012-05-22 03:19:26

by Hao, Xudong

[permalink] [raw]
Subject: [PATCH v3 4/4] Enabling Access bit when doing memory swapping

<Re-send>

Enabling Access bit when doing memory swapping.

Changes from v2:
-Still using claer_bit() function to make sure it's atomic operation.

Signed-off-by: Haitao Shan <[email protected]>
Signed-off-by: Xudong Hao <[email protected]>
---
arch/x86/kvm/mmu.c | 14 ++++++++------
arch/x86/kvm/vmx.c | 6 ++++--
2 files changed, 12 insertions(+), 8 deletions(-)

diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index 72102e0..c2fef8e 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -1242,7 +1242,8 @@ static int kvm_age_rmapp(struct kvm *kvm, unsigned long *rmapp,
int young = 0;

/*
- * Emulate the accessed bit for EPT, by checking if this page has
+ * In case of absence of EPT Access and Dirty Bits supports,
+ * emulate the accessed bit for EPT, by checking if this page has
* an EPT mapping, and clearing it if it does. On the next access,
* a new EPT mapping will be established.
* This has some overhead, but not as much as the cost of swapping
@@ -1253,11 +1254,12 @@ static int kvm_age_rmapp(struct kvm *kvm, unsigned long *rmapp,

for (sptep = rmap_get_first(*rmapp, &iter); sptep;
sptep = rmap_get_next(&iter)) {
- BUG_ON(!(*sptep & PT_PRESENT_MASK));
+ BUG_ON(!is_shadow_present_pte(*sptep));

- if (*sptep & PT_ACCESSED_MASK) {
+ if (*sptep & shadow_accessed_mask) {
young = 1;
- clear_bit(PT_ACCESSED_SHIFT, (unsigned long *)sptep);
+ clear_bit((ffs(shadow_accessed_mask) - 1),
+ (unsigned long *)sptep);
}
}

@@ -1281,9 +1283,9 @@ static int kvm_test_age_rmapp(struct kvm *kvm, unsigned long *rmapp,

for (sptep = rmap_get_first(*rmapp, &iter); sptep;
sptep = rmap_get_next(&iter)) {
- BUG_ON(!(*sptep & PT_PRESENT_MASK));
+ BUG_ON(!is_shadow_present_pte(*sptep));

- if (*sptep & PT_ACCESSED_MASK) {
+ if (*sptep & shadow_accessed_mask) {
young = 1;
break;
}
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 32eb588..ea6390e 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -7275,8 +7275,10 @@ static int __init vmx_init(void)
vmx_disable_intercept_for_msr(MSR_IA32_SYSENTER_EIP, false);

if (enable_ept) {
- kvm_mmu_set_mask_ptes(0ull, 0ull, 0ull, 0ull,
- VMX_EPT_EXECUTABLE_MASK);
+ kvm_mmu_set_mask_ptes(0ull,
+ (enable_ept_ad_bits) ? VMX_EPT_ACCESS_BIT : 0ull,
+ (enable_ept_ad_bits) ? VMX_EPT_DIRTY_BIT : 0ull,
+ 0ull, VMX_EPT_EXECUTABLE_MASK);
ept_set_mmio_spte_mask();
kvm_enable_tdp();
} else
--
1.5.6


2012-05-23 13:31:29

by Hao, Xudong

[permalink] [raw]
Subject: RE: [PATCH v3 4/4] Enabling Access bit when doing memory swapping

Hi, Avi

Will these patches be accepted if no other comments?

Thanks,
-Xudong


> -----Original Message-----
> From: Hao, Xudong
> Sent: Tuesday, May 22, 2012 11:23 AM
> To: [email protected]
> Cc: [email protected]; [email protected]; [email protected];
> [email protected]; Zhang, Xiantao; Hao, Xudong; Shan, Haitao
> Subject: [PATCH v3 4/4] Enabling Access bit when doing memory swapping
>
> <Re-send>
>
> Enabling Access bit when doing memory swapping.
>
> Changes from v2:
> -Still using claer_bit() function to make sure it's atomic operation.
>
> Signed-off-by: Haitao Shan <[email protected]>
> Signed-off-by: Xudong Hao <[email protected]>
> ---
> arch/x86/kvm/mmu.c | 14 ++++++++------
> arch/x86/kvm/vmx.c | 6 ++++--
> 2 files changed, 12 insertions(+), 8 deletions(-)
>
> diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
> index 72102e0..c2fef8e 100644
> --- a/arch/x86/kvm/mmu.c
> +++ b/arch/x86/kvm/mmu.c
> @@ -1242,7 +1242,8 @@ static int kvm_age_rmapp(struct kvm *kvm,
> unsigned long *rmapp,
> int young = 0;
>
> /*
> - * Emulate the accessed bit for EPT, by checking if this page has
> + * In case of absence of EPT Access and Dirty Bits supports,
> + * emulate the accessed bit for EPT, by checking if this page has
> * an EPT mapping, and clearing it if it does. On the next access,
> * a new EPT mapping will be established.
> * This has some overhead, but not as much as the cost of swapping
> @@ -1253,11 +1254,12 @@ static int kvm_age_rmapp(struct kvm *kvm,
> unsigned long *rmapp,
>
> for (sptep = rmap_get_first(*rmapp, &iter); sptep;
> sptep = rmap_get_next(&iter)) {
> - BUG_ON(!(*sptep & PT_PRESENT_MASK));
> + BUG_ON(!is_shadow_present_pte(*sptep));
>
> - if (*sptep & PT_ACCESSED_MASK) {
> + if (*sptep & shadow_accessed_mask) {
> young = 1;
> - clear_bit(PT_ACCESSED_SHIFT, (unsigned long *)sptep);
> + clear_bit((ffs(shadow_accessed_mask) - 1),
> + (unsigned long *)sptep);
> }
> }
>
> @@ -1281,9 +1283,9 @@ static int kvm_test_age_rmapp(struct kvm *kvm,
> unsigned long *rmapp,
>
> for (sptep = rmap_get_first(*rmapp, &iter); sptep;
> sptep = rmap_get_next(&iter)) {
> - BUG_ON(!(*sptep & PT_PRESENT_MASK));
> + BUG_ON(!is_shadow_present_pte(*sptep));
>
> - if (*sptep & PT_ACCESSED_MASK) {
> + if (*sptep & shadow_accessed_mask) {
> young = 1;
> break;
> }
> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
> index 32eb588..ea6390e 100644
> --- a/arch/x86/kvm/vmx.c
> +++ b/arch/x86/kvm/vmx.c
> @@ -7275,8 +7275,10 @@ static int __init vmx_init(void)
> vmx_disable_intercept_for_msr(MSR_IA32_SYSENTER_EIP, false);
>
> if (enable_ept) {
> - kvm_mmu_set_mask_ptes(0ull, 0ull, 0ull, 0ull,
> - VMX_EPT_EXECUTABLE_MASK);
> + kvm_mmu_set_mask_ptes(0ull,
> + (enable_ept_ad_bits) ? VMX_EPT_ACCESS_BIT : 0ull,
> + (enable_ept_ad_bits) ? VMX_EPT_DIRTY_BIT : 0ull,
> + 0ull, VMX_EPT_EXECUTABLE_MASK);
> ept_set_mmio_spte_mask();
> kvm_enable_tdp();
> } else
> --
> 1.5.6

2012-05-28 10:21:11

by Hao, Xudong

[permalink] [raw]
Subject: RE: [PATCH v3 4/4] Enabling Access bit when doing memory swapping

> -----Original Message-----
> From: Hao, Xudong
> Sent: Wednesday, May 23, 2012 9:31 PM
> To: [email protected]
> Cc: [email protected]; [email protected]; [email protected];
> [email protected]; Zhang, Xiantao; Shan, Haitao
> Subject: RE: [PATCH v3 4/4] Enabling Access bit when doing memory swapping
>
> Hi, Avi
>
> Will these patches be accepted if no other comments?
>
> Thanks,
> -Xudong
>
>
> > -----Original Message-----
> > From: Hao, Xudong
> > Sent: Tuesday, May 22, 2012 11:23 AM
> > To: [email protected]
> > Cc: [email protected]; [email protected];
> [email protected];
> > [email protected]; Zhang, Xiantao; Hao, Xudong; Shan, Haitao
> > Subject: [PATCH v3 4/4] Enabling Access bit when doing memory swapping
> >
> > <Re-send>
> >
> > Enabling Access bit when doing memory swapping.
> >
> > Changes from v2:
> > -Still using claer_bit() function to make sure it's atomic operation.
> >
> > Signed-off-by: Haitao Shan <[email protected]>
> > Signed-off-by: Xudong Hao <[email protected]>
> > ---
> > arch/x86/kvm/mmu.c | 14 ++++++++------
> > arch/x86/kvm/vmx.c | 6 ++++--
> > 2 files changed, 12 insertions(+), 8 deletions(-)
> >
> > diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
> > index 72102e0..c2fef8e 100644
> > --- a/arch/x86/kvm/mmu.c
> > +++ b/arch/x86/kvm/mmu.c
> > @@ -1242,7 +1242,8 @@ static int kvm_age_rmapp(struct kvm *kvm,
> > unsigned long *rmapp,
> > int young = 0;
> >
> > /*
> > - * Emulate the accessed bit for EPT, by checking if this page has
> > + * In case of absence of EPT Access and Dirty Bits supports,
> > + * emulate the accessed bit for EPT, by checking if this page has
> > * an EPT mapping, and clearing it if it does. On the next access,
> > * a new EPT mapping will be established.
> > * This has some overhead, but not as much as the cost of swapping
> > @@ -1253,11 +1254,12 @@ static int kvm_age_rmapp(struct kvm *kvm,
> > unsigned long *rmapp,
> >
> > for (sptep = rmap_get_first(*rmapp, &iter); sptep;
> > sptep = rmap_get_next(&iter)) {
> > - BUG_ON(!(*sptep & PT_PRESENT_MASK));
> > + BUG_ON(!is_shadow_present_pte(*sptep));
> >
> > - if (*sptep & PT_ACCESSED_MASK) {
> > + if (*sptep & shadow_accessed_mask) {
> > young = 1;
> > - clear_bit(PT_ACCESSED_SHIFT, (unsigned long *)sptep);
> > + clear_bit((ffs(shadow_accessed_mask) - 1),
> > + (unsigned long *)sptep);
> > }
> > }
> >
> > @@ -1281,9 +1283,9 @@ static int kvm_test_age_rmapp(struct kvm *kvm,
> > unsigned long *rmapp,
> >
> > for (sptep = rmap_get_first(*rmapp, &iter); sptep;
> > sptep = rmap_get_next(&iter)) {
> > - BUG_ON(!(*sptep & PT_PRESENT_MASK));
> > + BUG_ON(!is_shadow_present_pte(*sptep));
> >
> > - if (*sptep & PT_ACCESSED_MASK) {
> > + if (*sptep & shadow_accessed_mask) {
> > young = 1;
> > break;
> > }
> > diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
> > index 32eb588..ea6390e 100644
> > --- a/arch/x86/kvm/vmx.c
> > +++ b/arch/x86/kvm/vmx.c
> > @@ -7275,8 +7275,10 @@ static int __init vmx_init(void)
> > vmx_disable_intercept_for_msr(MSR_IA32_SYSENTER_EIP, false);
> >
> > if (enable_ept) {
> > - kvm_mmu_set_mask_ptes(0ull, 0ull, 0ull, 0ull,
> > - VMX_EPT_EXECUTABLE_MASK);
> > + kvm_mmu_set_mask_ptes(0ull,
> > + (enable_ept_ad_bits) ? VMX_EPT_ACCESS_BIT : 0ull,
> > + (enable_ept_ad_bits) ? VMX_EPT_DIRTY_BIT : 0ull,
> > + 0ull, VMX_EPT_EXECUTABLE_MASK);
> > ept_set_mmio_spte_mask();
> > kvm_enable_tdp();
> > } else
> > --
> > 1.5.6

Hi, Avi

Do you have other comments for this series of patches?

2012-05-28 10:36:43

by Avi Kivity

[permalink] [raw]
Subject: Re: [PATCH v3 4/4] Enabling Access bit when doing memory swapping

On 05/23/2012 04:31 PM, Hao, Xudong wrote:
> Hi, Avi
>
> Will these patches be accepted if no other comments?
>

I can't see the other patches (use git send-email if possible) but this
one looks fine.


--
error compiling committee.c: too many arguments to function

2012-05-28 11:34:48

by Hao, Xudong

[permalink] [raw]
Subject: RE: [PATCH v3 4/4] Enabling Access bit when doing memory swapping

> -----Original Message-----
> From: Avi Kivity [mailto:[email protected]]
> Sent: Monday, May 28, 2012 6:37 PM
> To: Hao, Xudong
> Cc: [email protected]; [email protected]; [email protected];
> [email protected]; Zhang, Xiantao; Shan, Haitao
> Subject: Re: [PATCH v3 4/4] Enabling Access bit when doing memory swapping
>
> On 05/23/2012 04:31 PM, Hao, Xudong wrote:
> > Hi, Avi
> >
> > Will these patches be accepted if no other comments?
> >
>
> I can't see the other patches (use git send-email if possible) but this
> one looks fine.
>

Ok, I sent other 3 patches just now.

>
> --
> error compiling committee.c: too many arguments to function

2012-05-29 14:27:29

by Avi Kivity

[permalink] [raw]
Subject: Re: [PATCH v3 4/4] Enabling Access bit when doing memory swapping

On 05/22/2012 06:23 AM, Xudong Hao wrote:
> <Re-send>
>
> Enabling Access bit when doing memory swapping.
>
> Changes from v2:
> -Still using claer_bit() function to make sure it's atomic operation.
>

Thanks, applied.


--
error compiling committee.c: too many arguments to function