diff mbox

x86/PoD: skip eager reclaim when possible

Message ID 573201D202000078000EA201@prv-mh.provo.novell.com (mailing list archive)
State New, archived
Headers show

Commit Message

Jan Beulich May 10, 2016, 1:44 p.m. UTC
Reclaiming pages is pointless when the cache can already satisfy all
outstanding PoD entries, and doing reclaims in that case can be very
harmful to performance when that memory gets used by the guest, but
only to store zeroes there.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
x86/PoD: skip eager reclaim when possible

Reclaiming pages is pointless when the cache can already satisfy all
outstanding PoD entries, and doing reclaims in that case can be very
harmful to performance when that memory gets used by the guest, but
only to store zeroes there.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/mm/p2m-pod.c
+++ b/xen/arch/x86/mm/p2m-pod.c
@@ -1027,7 +1027,6 @@ static void pod_eager_record(struct p2m_
 {
     struct pod_mrp_list *mrp = &p2m->pod.mrp;
 
-    ASSERT(mrp->list[mrp->idx] == INVALID_GFN);
     ASSERT(gfn != INVALID_GFN);
 
     mrp->list[mrp->idx++] =
@@ -1075,7 +1074,9 @@ p2m_pod_demand_populate(struct p2m_domai
         return 0;
     }
 
-    pod_eager_reclaim(p2m);
+    /* Only reclaim if we're in actual need of more cache. */
+    if ( p2m->pod.entry_count > p2m->pod.count )
+        pod_eager_reclaim(p2m);
 
     /* Only sweep if we're actually out of memory.  Doing anything else
      * causes unnecessary time and fragmentation of superpages in the p2m. */

Comments

Jan Beulich May 10, 2016, 1:49 p.m. UTC | #1
>>> On 10.05.16 at 15:44, <JBeulich@suse.com> wrote:
> Reclaiming pages is pointless when the cache can already satisfy all
> outstanding PoD entries, and doing reclaims in that case can be very
> harmful to performance when that memory gets used by the guest, but
> only to store zeroes there.
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

And I realize I forgot to Cc you, Wei.

Jan

> --- a/xen/arch/x86/mm/p2m-pod.c
> +++ b/xen/arch/x86/mm/p2m-pod.c
> @@ -1027,7 +1027,6 @@ static void pod_eager_record(struct p2m_
>  {
>      struct pod_mrp_list *mrp = &p2m->pod.mrp;
>  
> -    ASSERT(mrp->list[mrp->idx] == INVALID_GFN);
>      ASSERT(gfn != INVALID_GFN);
>  
>      mrp->list[mrp->idx++] =
> @@ -1075,7 +1074,9 @@ p2m_pod_demand_populate(struct p2m_domai
>          return 0;
>      }
>  
> -    pod_eager_reclaim(p2m);
> +    /* Only reclaim if we're in actual need of more cache. */
> +    if ( p2m->pod.entry_count > p2m->pod.count )
> +        pod_eager_reclaim(p2m);
>  
>      /* Only sweep if we're actually out of memory.  Doing anything else
>       * causes unnecessary time and fragmentation of superpages in the p2m. 
> */
Andrew Cooper May 10, 2016, 1:50 p.m. UTC | #2
On 10/05/16 14:44, Jan Beulich wrote:
> Reclaiming pages is pointless when the cache can already satisfy all
> outstanding PoD entries, and doing reclaims in that case can be very
> harmful to performance when that memory gets used by the guest, but
> only to store zeroes there.
>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>

Possibly worth mentioning a dd from /dev/zero as the most likely action
to trigger this.
Wei Liu May 10, 2016, 2:18 p.m. UTC | #3
On Tue, May 10, 2016 at 07:49:01AM -0600, Jan Beulich wrote:
> >>> On 10.05.16 at 15:44, <JBeulich@suse.com> wrote:
> > Reclaiming pages is pointless when the cache can already satisfy all
> > outstanding PoD entries, and doing reclaims in that case can be very
> > harmful to performance when that memory gets used by the guest, but
> > only to store zeroes there.
> > 
> > Signed-off-by: Jan Beulich <jbeulich@suse.com>
> 
> And I realize I forgot to Cc you, Wei.
> 

Release-acked-by: Wei Liu <wei.liu2@citrix.com>

Please apply this after we cut RC2.

Wei.
Jan Beulich May 10, 2016, 2:27 p.m. UTC | #4
>>> On 10.05.16 at 15:50, <andrew.cooper3@citrix.com> wrote:
> On 10/05/16 14:44, Jan Beulich wrote:
>> Reclaiming pages is pointless when the cache can already satisfy all
>> outstanding PoD entries, and doing reclaims in that case can be very
>> harmful to performance when that memory gets used by the guest, but
>> only to store zeroes there.
>>
>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
> 
> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
> 
> Possibly worth mentioning a dd from /dev/zero as the most likely action
> to trigger this.

Well, I didn't want to because I think there are other means, like
mmap()-ing anonymous memory.

Jan
George Dunlap May 12, 2016, 2:40 p.m. UTC | #5
On 10/05/16 14:44, Jan Beulich wrote:
> Reclaiming pages is pointless when the cache can already satisfy all
> outstanding PoD entries, and doing reclaims in that case can be very
> harmful to performance when that memory gets used by the guest, but
> only to store zeroes there.
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Sorry for the delay.  Just one question...

> 
> --- a/xen/arch/x86/mm/p2m-pod.c
> +++ b/xen/arch/x86/mm/p2m-pod.c
> @@ -1027,7 +1027,6 @@ static void pod_eager_record(struct p2m_
>  {
>      struct pod_mrp_list *mrp = &p2m->pod.mrp;
>  
> -    ASSERT(mrp->list[mrp->idx] == INVALID_GFN);
>      ASSERT(gfn != INVALID_GFN);

What's this for?

 -George
Jan Beulich May 12, 2016, 3:08 p.m. UTC | #6
>>> On 12.05.16 at 16:40, <george.dunlap@citrix.com> wrote:
> On 10/05/16 14:44, Jan Beulich wrote:
>> Reclaiming pages is pointless when the cache can already satisfy all
>> outstanding PoD entries, and doing reclaims in that case can be very
>> harmful to performance when that memory gets used by the guest, but
>> only to store zeroes there.
>> 
>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
> 
> Sorry for the delay.  Just one question...
> 
>> 
>> --- a/xen/arch/x86/mm/p2m-pod.c
>> +++ b/xen/arch/x86/mm/p2m-pod.c
>> @@ -1027,7 +1027,6 @@ static void pod_eager_record(struct p2m_
>>  {
>>      struct pod_mrp_list *mrp = &p2m->pod.mrp;
>>  
>> -    ASSERT(mrp->list[mrp->idx] == INVALID_GFN);
>>      ASSERT(gfn != INVALID_GFN);
> 
> What's this for?

The deletion of the ASSERT()? Since we no longer always insert a
GFN through pod_eager_reclaim(), we also can no longer assume
all (used) entries hold a valid GFN.

Jan
George Dunlap May 12, 2016, 3:19 p.m. UTC | #7
On 12/05/16 16:08, Jan Beulich wrote:
>>>> On 12.05.16 at 16:40, <george.dunlap@citrix.com> wrote:
>> On 10/05/16 14:44, Jan Beulich wrote:
>>> Reclaiming pages is pointless when the cache can already satisfy all
>>> outstanding PoD entries, and doing reclaims in that case can be very
>>> harmful to performance when that memory gets used by the guest, but
>>> only to store zeroes there.
>>>
>>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>>
>> Sorry for the delay.  Just one question...
>>
>>>
>>> --- a/xen/arch/x86/mm/p2m-pod.c
>>> +++ b/xen/arch/x86/mm/p2m-pod.c
>>> @@ -1027,7 +1027,6 @@ static void pod_eager_record(struct p2m_
>>>  {
>>>      struct pod_mrp_list *mrp = &p2m->pod.mrp;
>>>  
>>> -    ASSERT(mrp->list[mrp->idx] == INVALID_GFN);
>>>      ASSERT(gfn != INVALID_GFN);
>>
>> What's this for?
> 
> The deletion of the ASSERT()? Since we no longer always insert a
> GFN through pod_eager_reclaim(), we also can no longer assume
> all (used) entries hold a valid GFN.

Oh, right.  Should have taken a closer look, sorry for the noise:

Reviewed-by: George Dunlap <george.dunlap@citrix.com>
diff mbox

Patch

--- a/xen/arch/x86/mm/p2m-pod.c
+++ b/xen/arch/x86/mm/p2m-pod.c
@@ -1027,7 +1027,6 @@  static void pod_eager_record(struct p2m_
 {
     struct pod_mrp_list *mrp = &p2m->pod.mrp;
 
-    ASSERT(mrp->list[mrp->idx] == INVALID_GFN);
     ASSERT(gfn != INVALID_GFN);
 
     mrp->list[mrp->idx++] =
@@ -1075,7 +1074,9 @@  p2m_pod_demand_populate(struct p2m_domai
         return 0;
     }
 
-    pod_eager_reclaim(p2m);
+    /* Only reclaim if we're in actual need of more cache. */
+    if ( p2m->pod.entry_count > p2m->pod.count )
+        pod_eager_reclaim(p2m);
 
     /* Only sweep if we're actually out of memory.  Doing anything else
      * causes unnecessary time and fragmentation of superpages in the p2m. */