xen/xenpaging.paging_prep_enomem.patch
Charles Arnold 0c76f22ef1 - Update to Xen 4.0.2 rc2-pre, changeset 21443
- bnc#633573 - System fail to boot after running several warm
  reboot tests
  22749-vtd-workarounds.patch
- Upstream patches from Jan
  22744-ept-pod-locking.patch
  22777-vtd-ats-fixes.patch
  22781-pod-hap-logdirty.patch
  22782-x86-emul-smsw.patch
  22789-i386-no-x2apic.patch
  22790-svm-resume-migrate-pirqs.patch
  22816-x86-pirq-drop-priv-check.patch

OBS-URL: https://build.opensuse.org/package/show/Virtualization/xen?expand=0&rev=94
2011-02-04 21:19:54 +00:00

82 lines
2.7 KiB
Diff

Subject: xenpaging: handle temporary out-of-memory conditions during page-in
p2m_mem_paging_prep() should return -ENOMEM if a new page could not be
allocated. This can be handled in xenpaging to retry the page-in. Right
now such condition would stall the guest because the requested page will
not come back, xenpaging simply exits. So xenpaging could very well
retry the allocation forever to rescue the guest.
(xen-unstable changeset: 22446:08158f001f19)
Signed-off-by: Olaf Hering <olaf@aepfle.de>
---
tools/xenpaging/xenpaging.c | 27 ++++++++++++++++++++-------
xen/arch/x86/mm/p2m.c | 2 +-
2 files changed, 21 insertions(+), 8 deletions(-)
Index: xen-4.0.2-testing/tools/xenpaging/xenpaging.c
===================================================================
--- xen-4.0.2-testing.orig/tools/xenpaging/xenpaging.c
+++ xen-4.0.2-testing/tools/xenpaging/xenpaging.c
@@ -24,6 +24,7 @@
#include <inttypes.h>
#include <stdlib.h>
#include <signal.h>
+#include <unistd.h>
#include <xc_private.h>
#include <xen/mem_event.h>
@@ -410,19 +411,31 @@ static int xenpaging_populate_page(
unsigned long _gfn;
void *page;
int ret;
+ unsigned char oom = 0;
- /* Tell Xen to allocate a page for the domain */
- ret = xc_mem_paging_prep(paging->xc_handle, paging->mem_event.domain_id,
- *gfn);
- if ( ret != 0 )
+ _gfn = *gfn;
+ do
{
- ERROR("Error preparing for page in");
- goto out_map;
+ /* Tell Xen to allocate a page for the domain */
+ ret = xc_mem_paging_prep(paging->xc_handle, paging->mem_event.domain_id,
+ _gfn);
+ if ( ret != 0 )
+ {
+ if ( errno == ENOMEM )
+ {
+ if ( oom++ == 0 )
+ DPRINTF("ENOMEM while preparing gfn %lx\n", _gfn);
+ sleep(1);
+ continue;
+ }
+ ERROR("Error preparing for page in");
+ goto out_map;
+ }
}
+ while ( ret && !interrupted );
/* Map page */
ret = -EFAULT;
- _gfn = *gfn;
page = xc_map_foreign_pages(paging->xc_handle, paging->mem_event.domain_id,
PROT_READ | PROT_WRITE, &_gfn, 1);
*gfn = _gfn;
Index: xen-4.0.2-testing/xen/arch/x86/mm/p2m.c
===================================================================
--- xen-4.0.2-testing.orig/xen/arch/x86/mm/p2m.c
+++ xen-4.0.2-testing/xen/arch/x86/mm/p2m.c
@@ -2622,7 +2622,7 @@ int p2m_mem_paging_prep(struct domain *d
/* Get a free page */
page = alloc_domheap_page(d, 0);
if ( unlikely(page == NULL) )
- return -EINVAL;
+ return -ENOMEM;
/* Fix p2m mapping */
p2m_lock(d->arch.p2m);