Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Evergreen:Maintenance:114
xen.openSUSE_Evergreen_11.4
xenpaging.paging_prep_enomem.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File xenpaging.paging_prep_enomem.patch of Package xen.openSUSE_Evergreen_11.4
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.3-testing/tools/xenpaging/xenpaging.c =================================================================== --- xen-4.0.3-testing.orig/tools/xenpaging/xenpaging.c +++ xen-4.0.3-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.3-testing/xen/arch/x86/mm/p2m.c =================================================================== --- xen-4.0.3-testing.orig/xen/arch/x86/mm/p2m.c +++ xen-4.0.3-testing/xen/arch/x86/mm/p2m.c @@ -2637,7 +2637,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);
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor