51 lines
1.7 KiB
Diff
51 lines
1.7 KiB
Diff
|
# HG changeset patch
|
||
|
# Parent 5d87917314c0b4f13c987575d5329dfa215c5698
|
||
|
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>
|
||
|
|
||
|
---
|
||
|
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;
|
||
|
}
|