diff options
author | Olaf Hering <olaf@aepfle.de> | 2011-11-20 17:02:41 +0100 |
---|---|---|
committer | Olaf Hering <olaf@aepfle.de> | 2011-11-20 17:02:41 +0100 |
commit | bf67b6d6911aae2a4c22686459879db700c21f84 (patch) | |
tree | 4bcf593cf3fc176fa16e867cf211d06f1c72e0a1 | |
parent | f91b416707b5b2cfae44c05c7e8672e3c2e44543 (diff) | |
download | xen-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>
-rw-r--r-- | tools/xenpaging/policy_default.c | 14 |
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; } |