aboutsummaryrefslogtreecommitdiffstats
path: root/tools/xenpaging
diff options
context:
space:
mode:
authorOlaf Hering <olaf@aepfle.de>2011-11-20 17:02:41 +0100
committerOlaf Hering <olaf@aepfle.de>2011-11-20 17:02:41 +0100
commitbf67b6d6911aae2a4c22686459879db700c21f84 (patch)
tree4bcf593cf3fc176fa16e867cf211d06f1c72e0a1 /tools/xenpaging
parentf91b416707b5b2cfae44c05c7e8672e3c2e44543 (diff)
downloadxen-bf67b6d6911aae2a4c22686459879db700c21f84.tar.gz
xen-bf67b6d6911aae2a4c22686459879db700c21f84.tar.bz2
xen-bf67b6d6911aae2a4c22686459879db700c21f84.zip
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> Committed-by: Ian Jackson <ian.jackson.citrix.com>
Diffstat (limited to 'tools/xenpaging')
-rw-r--r--tools/xenpaging/policy_default.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/tools/xenpaging/policy_default.c b/tools/xenpaging/policy_default.c
index 55a77b8403..57da85d076 100644
--- a/tools/xenpaging/policy_default.c
+++ b/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 *paging, xenpaging_victim_t *victim)
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;
}