2011-12-02 21:25:29 +01:00
|
|
|
changeset: 24219:8eba32b9598c
|
|
|
|
user: Olaf Hering <olaf@aepfle.de>
|
|
|
|
date: Sun Nov 20 17:02:41 2011 +0100
|
|
|
|
files: tools/xenpaging/policy_default.c
|
|
|
|
description:
|
2011-11-03 23:59:30 +01:00
|
|
|
xenpaging: retry unpageable gfns
|
|
|
|
|
|
|
|
Nomination of gfns can fail, but may succeed later.
|
|
|
|
Thats the case for a guest that starts ballooned.
|
|
|
|
|
|
|
|
v2:
|
|
|
|
- print debug when clearing uncosumed happens
|
|
|
|
|
|
|
|
Signed-off-by: Olaf Hering <olaf@aepfle.de>
|
2011-12-02 21:25:29 +01:00
|
|
|
Committed-by: Ian Jackson <ian.jackson.citrix.com>
|
|
|
|
|
2011-11-03 23:59:30 +01:00
|
|
|
|
|
|
|
---
|
|
|
|
tools/xenpaging/policy_default.c | 14 ++++++++++++++
|
|
|
|
1 file changed, 14 insertions(+)
|
|
|
|
|
|
|
|
Index: xen-4.1.2-testing/tools/xenpaging/policy_default.c
|
|
|
|
===================================================================
|
|
|
|
--- xen-4.1.2-testing.orig/tools/xenpaging/policy_default.c
|
|
|
|
+++ xen-4.1.2-testing/tools/xenpaging/policy_default.c
|
|
|
|
@@ -32,6 +32,7 @@ static unsigned int i_mru;
|
|
|
|
static unsigned int mru_size;
|
|
|
|
static unsigned long *bitmap;
|
|
|
|
static unsigned long *unconsumed;
|
|
|
|
+static unsigned int unconsumed_cleared;
|
|
|
|
static unsigned long current_gfn;
|
|
|
|
static unsigned long max_pages;
|
|
|
|
|
|
|
|
@@ -87,8 +88,21 @@ int policy_choose_victim(xenpaging_t *pa
|
|
|
|
current_gfn++;
|
|
|
|
if ( current_gfn >= max_pages )
|
|
|
|
current_gfn = 0;
|
|
|
|
+ /* Could not nominate any gfn */
|
|
|
|
if ( wrap == current_gfn )
|
|
|
|
{
|
|
|
|
+ /* Count wrap arounds */
|
|
|
|
+ unconsumed_cleared++;
|
|
|
|
+ /* Force retry every few seconds (depends on poll() timeout) */
|
|
|
|
+ if ( unconsumed_cleared > 123)
|
|
|
|
+ {
|
|
|
|
+ /* Force retry of unconsumed gfns */
|
|
|
|
+ bitmap_clear(unconsumed, max_pages);
|
|
|
|
+ unconsumed_cleared = 0;
|
|
|
|
+ DPRINTF("clearing unconsumed, wrap %lx", wrap);
|
|
|
|
+ /* One more round before returning ENOSPC */
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
victim->gfn = INVALID_MFN;
|
|
|
|
return -ENOSPC;
|
|
|
|
}
|