All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 4/4] Enabling Access bit when doing memory swapping
@ 2012-05-16  1:12 Xudong Hao
  2012-05-18  2:22 ` Marcelo Tosatti
  0 siblings, 1 reply; 8+ messages in thread
From: Xudong Hao @ 2012-05-16  1:12 UTC (permalink / raw)
  To: avi; +Cc: kvm, linux-kernel, haitao.shan, xiantao.zhang, xudong.hao

Enabling Access bit when doing memory swapping.

Signed-off-by: Haitao Shan <haitao.shan@intel.com>
Signed-off-by: Xudong Hao <xudong.hao@intel.com>
---
 arch/x86/kvm/mmu.c |   13 +++++++------
 arch/x86/kvm/vmx.c |    6 ++++--
 2 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index ff053ca..5f55f98 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -1166,7 +1166,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
@@ -1179,11 +1180,11 @@ static int kvm_age_rmapp(struct kvm *kvm, unsigned long *rmapp,
    while (spte) {
        int _young;
        u64 _spte = *spte;
-       BUG_ON(!(_spte & PT_PRESENT_MASK));
-       _young = _spte & PT_ACCESSED_MASK;
+       BUG_ON(!is_shadow_present_pte(_spte));
+       _young = _spte & shadow_accessed_mask;
        if (_young) {
            young = 1;
-           clear_bit(PT_ACCESSED_SHIFT, (unsigned long *)spte);
+           *spte &= ~shadow_accessed_mask;
        }
        spte = rmap_next(rmapp, spte);
    }
@@ -1207,8 +1208,8 @@ static int kvm_test_age_rmapp(struct kvm *kvm, unsigned long *rmapp,
    spte = rmap_next(rmapp, NULL);
    while (spte) {
        u64 _spte = *spte;
-       BUG_ON(!(_spte & PT_PRESENT_MASK));
-       young = _spte & PT_ACCESSED_MASK;
+       BUG_ON(!is_shadow_present_pte(_spte));
+       young = _spte & shadow_accessed_mask;
        if (young) {
            young = 1;
            break;
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 89151a9..a3ef549 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -7242,8 +7242,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.7.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH 4/4] Enabling Access bit when doing memory swapping
  2012-05-16  1:12 [PATCH 4/4] Enabling Access bit when doing memory swapping Xudong Hao
@ 2012-05-18  2:22 ` Marcelo Tosatti
  2012-05-21  3:22   ` Hao, Xudong
  0 siblings, 1 reply; 8+ messages in thread
From: Marcelo Tosatti @ 2012-05-18  2:22 UTC (permalink / raw)
  To: Xudong Hao; +Cc: avi, kvm, linux-kernel, haitao.shan, xiantao.zhang, xudong.hao

On Wed, May 16, 2012 at 09:12:30AM +0800, Xudong Hao wrote:
> Enabling Access bit when doing memory swapping.
> 
> Signed-off-by: Haitao Shan <haitao.shan@intel.com>
> Signed-off-by: Xudong Hao <xudong.hao@intel.com>
> ---
>  arch/x86/kvm/mmu.c |   13 +++++++------
>  arch/x86/kvm/vmx.c |    6 ++++--
>  2 files changed, 11 insertions(+), 8 deletions(-)
> 
> diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
> index ff053ca..5f55f98 100644
> --- a/arch/x86/kvm/mmu.c
> +++ b/arch/x86/kvm/mmu.c
> @@ -1166,7 +1166,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
> @@ -1179,11 +1180,11 @@ static int kvm_age_rmapp(struct kvm *kvm, unsigned long *rmapp,
>     while (spte) {
>         int _young;
>         u64 _spte = *spte;
> -       BUG_ON(!(_spte & PT_PRESENT_MASK));
> -       _young = _spte & PT_ACCESSED_MASK;
> +       BUG_ON(!is_shadow_present_pte(_spte));
> +       _young = _spte & shadow_accessed_mask;
>         if (_young) {
>             young = 1;
> -           clear_bit(PT_ACCESSED_SHIFT, (unsigned long *)spte);
> +           *spte &= ~shadow_accessed_mask;
>         }

Now a dirty bit can be lost. Is there a reason to remove the clear_bit?


^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: [PATCH 4/4] Enabling Access bit when doing memory swapping
  2012-05-18  2:22 ` Marcelo Tosatti
@ 2012-05-21  3:22   ` Hao, Xudong
  2012-05-21  8:31     ` Avi Kivity
  0 siblings, 1 reply; 8+ messages in thread
From: Hao, Xudong @ 2012-05-21  3:22 UTC (permalink / raw)
  To: Marcelo Tosatti, Xudong Hao
  Cc: avi, kvm, linux-kernel, Shan, Haitao, Zhang, Xiantao

> -----Original Message-----
> From: Marcelo Tosatti [mailto:mtosatti@redhat.com]
> Sent: Friday, May 18, 2012 10:23 AM
> To: Xudong Hao
> Cc: avi@redhat.com; kvm@vger.kernel.org; linux-kernel@vger.kernel.org;
> Shan, Haitao; Zhang, Xiantao; Hao, Xudong
> Subject: Re: [PATCH 4/4] Enabling Access bit when doing memory swapping
> 
> On Wed, May 16, 2012 at 09:12:30AM +0800, Xudong Hao wrote:
> > Enabling Access bit when doing memory swapping.
> >
> > Signed-off-by: Haitao Shan <haitao.shan@intel.com>
> > Signed-off-by: Xudong Hao <xudong.hao@intel.com>
> > ---
> >  arch/x86/kvm/mmu.c |   13 +++++++------
> >  arch/x86/kvm/vmx.c |    6 ++++--
> >  2 files changed, 11 insertions(+), 8 deletions(-)
> >
> > diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
> > index ff053ca..5f55f98 100644
> > --- a/arch/x86/kvm/mmu.c
> > +++ b/arch/x86/kvm/mmu.c
> > @@ -1166,7 +1166,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
> > @@ -1179,11 +1180,11 @@ static int kvm_age_rmapp(struct kvm *kvm,
> unsigned long *rmapp,
> >     while (spte) {
> >         int _young;
> >         u64 _spte = *spte;
> > -       BUG_ON(!(_spte & PT_PRESENT_MASK));
> > -       _young = _spte & PT_ACCESSED_MASK;
> > +       BUG_ON(!is_shadow_present_pte(_spte));
> > +       _young = _spte & shadow_accessed_mask;
> >         if (_young) {
> >             young = 1;
> > -           clear_bit(PT_ACCESSED_SHIFT, (unsigned long *)spte);
> > +           *spte &= ~shadow_accessed_mask;
> >         }
> 
> Now a dirty bit can be lost. Is there a reason to remove the clear_bit?

The clear_bit() is called in shadown and EPT A/D mode, because PT_ACCESSED_SHIFT does not make sense for EPT A/D bit, so use the code shadow_accessed_mask to mask the bit for both of them.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 4/4] Enabling Access bit when doing memory swapping
  2012-05-21  3:22   ` Hao, Xudong
@ 2012-05-21  8:31     ` Avi Kivity
  2012-05-21 10:35       ` Hao, Xudong
  0 siblings, 1 reply; 8+ messages in thread
From: Avi Kivity @ 2012-05-21  8:31 UTC (permalink / raw)
  To: Hao, Xudong
  Cc: Marcelo Tosatti, Xudong Hao, kvm, linux-kernel, Shan, Haitao,
	Zhang, Xiantao

On 05/21/2012 06:22 AM, Hao, Xudong wrote:
> > -----Original Message-----
> > From: Marcelo Tosatti [mailto:mtosatti@redhat.com]
> > Sent: Friday, May 18, 2012 10:23 AM
> > To: Xudong Hao
> > Cc: avi@redhat.com; kvm@vger.kernel.org; linux-kernel@vger.kernel.org;
> > Shan, Haitao; Zhang, Xiantao; Hao, Xudong
> > Subject: Re: [PATCH 4/4] Enabling Access bit when doing memory swapping
> > 
> > On Wed, May 16, 2012 at 09:12:30AM +0800, Xudong Hao wrote:
> > > Enabling Access bit when doing memory swapping.
> > >
> > > Signed-off-by: Haitao Shan <haitao.shan@intel.com>
> > > Signed-off-by: Xudong Hao <xudong.hao@intel.com>
> > > ---
> > >  arch/x86/kvm/mmu.c |   13 +++++++------
> > >  arch/x86/kvm/vmx.c |    6 ++++--
> > >  2 files changed, 11 insertions(+), 8 deletions(-)
> > >
> > > diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
> > > index ff053ca..5f55f98 100644
> > > --- a/arch/x86/kvm/mmu.c
> > > +++ b/arch/x86/kvm/mmu.c
> > > @@ -1166,7 +1166,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
> > > @@ -1179,11 +1180,11 @@ static int kvm_age_rmapp(struct kvm *kvm,
> > unsigned long *rmapp,
> > >     while (spte) {
> > >         int _young;
> > >         u64 _spte = *spte;
> > > -       BUG_ON(!(_spte & PT_PRESENT_MASK));
> > > -       _young = _spte & PT_ACCESSED_MASK;
> > > +       BUG_ON(!is_shadow_present_pte(_spte));
> > > +       _young = _spte & shadow_accessed_mask;
> > >         if (_young) {
> > >             young = 1;
> > > -           clear_bit(PT_ACCESSED_SHIFT, (unsigned long *)spte);
> > > +           *spte &= ~shadow_accessed_mask;
> > >         }
> > 
> > Now a dirty bit can be lost. Is there a reason to remove the clear_bit?
>
> The clear_bit() is called in shadown and EPT A/D mode, because PT_ACCESSED_SHIFT does not make sense for EPT A/D bit, so use the code shadow_accessed_mask to mask the bit for both of them.

That doesn't answer the question.  An atomic operation is now non-atomic.

You can calculate shadow_accessed_bit and keep on using clear_bit(), or
switch to cmpxchg64(), but don't just drop the dirty bit here.

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


^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: [PATCH 4/4] Enabling Access bit when doing memory swapping
  2012-05-21  8:31     ` Avi Kivity
@ 2012-05-21 10:35       ` Hao, Xudong
  2012-05-21 10:48         ` Avi Kivity
  0 siblings, 1 reply; 8+ messages in thread
From: Hao, Xudong @ 2012-05-21 10:35 UTC (permalink / raw)
  To: Avi Kivity
  Cc: Marcelo Tosatti, Xudong Hao, kvm, linux-kernel, Shan, Haitao,
	Zhang, Xiantao

> -----Original Message-----
> From: Avi Kivity [mailto:avi@redhat.com]
> Sent: Monday, May 21, 2012 4:32 PM
> To: Hao, Xudong
> Cc: Marcelo Tosatti; Xudong Hao; kvm@vger.kernel.org;
> linux-kernel@vger.kernel.org; Shan, Haitao; Zhang, Xiantao
> Subject: Re: [PATCH 4/4] Enabling Access bit when doing memory swapping
> 
> On 05/21/2012 06:22 AM, Hao, Xudong wrote:
> > > -----Original Message-----
> > > From: Marcelo Tosatti [mailto:mtosatti@redhat.com]
> > > Sent: Friday, May 18, 2012 10:23 AM
> > > To: Xudong Hao
> > > Cc: avi@redhat.com; kvm@vger.kernel.org; linux-kernel@vger.kernel.org;
> > > Shan, Haitao; Zhang, Xiantao; Hao, Xudong
> > > Subject: Re: [PATCH 4/4] Enabling Access bit when doing memory swapping
> > >
> > > On Wed, May 16, 2012 at 09:12:30AM +0800, Xudong Hao wrote:
> > > > Enabling Access bit when doing memory swapping.
> > > >
> > > > Signed-off-by: Haitao Shan <haitao.shan@intel.com>
> > > > Signed-off-by: Xudong Hao <xudong.hao@intel.com>
> > > > ---
> > > >  arch/x86/kvm/mmu.c |   13 +++++++------
> > > >  arch/x86/kvm/vmx.c |    6 ++++--
> > > >  2 files changed, 11 insertions(+), 8 deletions(-)
> > > >
> > > > diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
> > > > index ff053ca..5f55f98 100644
> > > > --- a/arch/x86/kvm/mmu.c
> > > > +++ b/arch/x86/kvm/mmu.c
> > > > @@ -1166,7 +1166,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
> > > > @@ -1179,11 +1180,11 @@ static int kvm_age_rmapp(struct kvm *kvm,
> > > unsigned long *rmapp,
> > > >     while (spte) {
> > > >         int _young;
> > > >         u64 _spte = *spte;
> > > > -       BUG_ON(!(_spte & PT_PRESENT_MASK));
> > > > -       _young = _spte & PT_ACCESSED_MASK;
> > > > +       BUG_ON(!is_shadow_present_pte(_spte));
> > > > +       _young = _spte & shadow_accessed_mask;
> > > >         if (_young) {
> > > >             young = 1;
> > > > -           clear_bit(PT_ACCESSED_SHIFT, (unsigned long *)spte);
> > > > +           *spte &= ~shadow_accessed_mask;
> > > >         }
> > >
> > > Now a dirty bit can be lost. Is there a reason to remove the clear_bit?
> >
> > The clear_bit() is called in shadown and EPT A/D mode, because
> PT_ACCESSED_SHIFT does not make sense for EPT A/D bit, so use the code
> shadow_accessed_mask to mask the bit for both of them.
> 
> That doesn't answer the question.  An atomic operation is now non-atomic.
> 
> You can calculate shadow_accessed_bit and keep on using clear_bit(), or
> switch to cmpxchg64(), but don't just drop the dirty bit here.
> 

I know your meaning. How about this changes:

...
            young = 1;
+            if (enable_ept_ad_bits)
+                clear_bit(ffs(shadow_accessed_mask), (unsigned long *)spte);
            clear_bit(PT_ACCESSED_SHIFT, (unsigned long *)spte);
...

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


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 4/4] Enabling Access bit when doing memory swapping
  2012-05-21 10:35       ` Hao, Xudong
@ 2012-05-21 10:48         ` Avi Kivity
  2012-05-21 11:17           ` Hao, Xudong
  0 siblings, 1 reply; 8+ messages in thread
From: Avi Kivity @ 2012-05-21 10:48 UTC (permalink / raw)
  To: Hao, Xudong
  Cc: Marcelo Tosatti, Xudong Hao, kvm, linux-kernel, Shan, Haitao,
	Zhang, Xiantao

On 05/21/2012 01:35 PM, Hao, Xudong wrote:
> > 
> > That doesn't answer the question.  An atomic operation is now non-atomic.
> > 
> > You can calculate shadow_accessed_bit and keep on using clear_bit(), or
> > switch to cmpxchg64(), but don't just drop the dirty bit here.
> > 
>
> I know your meaning. How about this changes:
>
> ...
>             young = 1;
> +            if (enable_ept_ad_bits)
> +                clear_bit(ffs(shadow_accessed_mask), (unsigned long *)spte);

ffs() returns an off-by-one result, so this needs to be adjusted.  IIRC
bsfl is slow, but this shouldn't be a problem here.


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


^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: [PATCH 4/4] Enabling Access bit when doing memory swapping
  2012-05-21 10:48         ` Avi Kivity
@ 2012-05-21 11:17           ` Hao, Xudong
  2012-05-21 11:31             ` Avi Kivity
  0 siblings, 1 reply; 8+ messages in thread
From: Hao, Xudong @ 2012-05-21 11:17 UTC (permalink / raw)
  To: Avi Kivity
  Cc: Marcelo Tosatti, Xudong Hao, kvm, linux-kernel, Shan, Haitao,
	Zhang, Xiantao

> -----Original Message-----
> From: Avi Kivity [mailto:avi@redhat.com]
> Sent: Monday, May 21, 2012 6:48 PM
> To: Hao, Xudong
> Cc: Marcelo Tosatti; Xudong Hao; kvm@vger.kernel.org;
> linux-kernel@vger.kernel.org; Shan, Haitao; Zhang, Xiantao
> Subject: Re: [PATCH 4/4] Enabling Access bit when doing memory swapping
> 
> On 05/21/2012 01:35 PM, Hao, Xudong wrote:
> > >
> > > That doesn't answer the question.  An atomic operation is now
> non-atomic.
> > >
> > > You can calculate shadow_accessed_bit and keep on using clear_bit(), or
> > > switch to cmpxchg64(), but don't just drop the dirty bit here.
> > >
> >
> > I know your meaning. How about this changes:
> >
> > ...
> >             young = 1;
> > +            if (enable_ept_ad_bits)
> > +                clear_bit(ffs(shadow_accessed_mask), (unsigned long
> *)spte);
> 
> ffs() returns an off-by-one result, so this needs to be adjusted. 

Yes, it need to decrease 1, I'll send v3 version for patch4, any other comments?

> IIRC
> bsfl is slow, but this shouldn't be a problem here.
> 

I do not know the story...

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


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 4/4] Enabling Access bit when doing memory swapping
  2012-05-21 11:17           ` Hao, Xudong
@ 2012-05-21 11:31             ` Avi Kivity
  0 siblings, 0 replies; 8+ messages in thread
From: Avi Kivity @ 2012-05-21 11:31 UTC (permalink / raw)
  To: Hao, Xudong
  Cc: Marcelo Tosatti, Xudong Hao, kvm, linux-kernel, Shan, Haitao,
	Zhang, Xiantao

On 05/21/2012 02:17 PM, Hao, Xudong wrote:
> > -----Original Message-----
> > From: Avi Kivity [mailto:avi@redhat.com]
> > Sent: Monday, May 21, 2012 6:48 PM
> > To: Hao, Xudong
> > Cc: Marcelo Tosatti; Xudong Hao; kvm@vger.kernel.org;
> > linux-kernel@vger.kernel.org; Shan, Haitao; Zhang, Xiantao
> > Subject: Re: [PATCH 4/4] Enabling Access bit when doing memory swapping
> > 
> > On 05/21/2012 01:35 PM, Hao, Xudong wrote:
> > > >
> > > > That doesn't answer the question.  An atomic operation is now
> > non-atomic.
> > > >
> > > > You can calculate shadow_accessed_bit and keep on using clear_bit(), or
> > > > switch to cmpxchg64(), but don't just drop the dirty bit here.
> > > >
> > >
> > > I know your meaning. How about this changes:
> > >
> > > ...
> > >             young = 1;
> > > +            if (enable_ept_ad_bits)
> > > +                clear_bit(ffs(shadow_accessed_mask), (unsigned long
> > *)spte);
> > 
> > ffs() returns an off-by-one result, so this needs to be adjusted. 
>
> Yes, it need to decrease 1, I'll send v3 version for patch4, any other comments?

I think it's fine.

> > IIRC
> > bsfl is slow, but this shouldn't be a problem here.
> > 
>
> I do not know the story...
>

No story, bsf is a relatively slow instruction, but it shouldn't affect
us here; this isn't a fast path and in any case it's only a few cycles.

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


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2012-05-21 11:31 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-05-16  1:12 [PATCH 4/4] Enabling Access bit when doing memory swapping Xudong Hao
2012-05-18  2:22 ` Marcelo Tosatti
2012-05-21  3:22   ` Hao, Xudong
2012-05-21  8:31     ` Avi Kivity
2012-05-21 10:35       ` Hao, Xudong
2012-05-21 10:48         ` Avi Kivity
2012-05-21 11:17           ` Hao, Xudong
2012-05-21 11:31             ` Avi Kivity

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.