libxc: make error path more verbose
PATCH 1/1 libxc: make error path more verbose
Hi!
Attached patch makes qemu's output more verbose on failures.
The qemu process seems to leak memory by performing more mmap() calls than munmap()'s. When a HVM guest with a 12GB image runs fsck, then the guest window disappears when the qemu process dies.
Then /var/log/qemu-dm-<domid>.log shows this:
I/O request not ready: 0, ptr: 0, port: 0, data: 0, count: 0, size: 0 xc_map_foreign_batch error 12
With the attached patch you see this:
I/O request not ready: 0, ptr: 0, port: 0, data: 0, count: 0, size: 0xc_map_foreign_batch: mmap failed: Cannot allocate memory xc_map_foreign_batch error 12
For short: The patch makes it easier to figure out when you triggered the resource exhausting bug.
Signature · 12 lines
AMD Saxony, Dresden, Germany Operating System Research Center Legal Information: AMD Saxony Limited Liability Company & Co. KG Sitz (Geschäftsanschrift): Wilschdorfer Landstr. 101, 01109 Dresden, Deutschland Registergericht Dresden: HRA 4896 vertretungsberechtigter Komplementär: AMD Saxony LLC (Sitz Wilmington, Delaware, USA) Geschäftsführer der AMD Saxony LLC: Dr. Hans-R. Deppe, Thomas McCoy
tools/libxc/xc_linux.c +12 -5
@@ -67,8 +67,10 @@ void *xc_map_foreign_batch(int xc_handleprivcmd_mmapbatch_t ioctlx;void *addr; addr =mmap (NULL , num*PAGE_SIZE , prot,MAP_SHARED , xc_handle,0 ); -if ( addr ==MAP_FAILED ) -return NULL ; +if ( addr ==MAP_FAILED ) { +perror ("xc_map_foreign_batch: mmap failed" ); +return NULL ; + } ioctlx.num=num; ioctlx.dom=dom;
@@ -77,7 +79,7 @@ void *xc_map_foreign_batch(int xc_handleif (ioctl (xc_handle,IOCTL_PRIVCMD_MMAPBATCH , &ioctlx) <0 ) {int saved_errno = errno; -perror ("XXXXXXXX" ); +perror ("xc_map_foreign_batch: ioctl failed" ); (void )munmap (addr, num*PAGE_SIZE ); errno = saved_errno;return NULL ;
@@ -94,8 +96,10 @@ void *xc_map_foreign_range(int xc_handleprivcmd_mmap_entry_t entry;void *addr; addr =mmap (NULL , size, prot,MAP_SHARED , xc_handle,0 ); -if ( addr ==MAP_FAILED ) -return NULL ; +if ( addr ==MAP_FAILED ) { +perror ("xc_map_foreign_range: mmap failed" ); +return NULL ; + } ioctlx.num=1 ; ioctlx.dom=dom;
@@ -106,6 +110,7 @@ void *xc_map_foreign_range(int xc_handleif (ioctl (xc_handle,IOCTL_PRIVCMD_MMAP , &ioctlx) <0 ) {int saved_errno = errno; +perror ("xc_map_foreign_range: ioctl failed" ); (void )munmap (addr, size); errno = saved_errno;return NULL ;
@@ -402,6 +407,7 @@ void *xc_gnttab_map_grant_ref(int xcg_haint saved_errno = errno;struct ioctl_gntdev_unmap_grant_ref unmap_grant;/* Unmap the driver slots used to store the grant information. */ +perror ("xc_gnttab_map_grant_ref: mmap failed" ); unmap_grant.index = map.index; unmap_grant.count =1 ;ioctl (xcg_handle,IOCTL_GNTDEV_UNMAP_GRANT_REF , &unmap_grant);
@@ -445,6 +451,7 @@ void *xc_gnttab_map_grant_refs(int xcg_hint saved_errno = errno;struct ioctl_gntdev_unmap_grant_ref unmap_grant;/* Unmap the driver slots used to store the grant information. */ +perror ("xc_gnttab_map_grant_refs: mmap failed" ); unmap_grant.index = map->index; unmap_grant.count = count;ioctl (xcg_handle,IOCTL_GNTDEV_UNMAP_GRANT_REF , &unmap_grant);
tools/libxc/xc_netbsd.c +10 -5
@@ -63,8 +63,10 @@ void *xc_map_foreign_batch(int xc_handleprivcmd_mmapbatch_t ioctlx;void *addr; addr =mmap (NULL , num*PAGE_SIZE , prot,MAP_ANON |MAP_SHARED ,-1 ,0 ); -if ( addr ==MAP_FAILED ) -return NULL ; +if ( addr ==MAP_FAILED ) { +perror ("xc_map_foreign_batch: mmap failed" ); +return NULL ; + } ioctlx.num=num; ioctlx.dom=dom;
@@ -73,7 +75,7 @@ void *xc_map_foreign_batch(int xc_handleif (ioctl (xc_handle,IOCTL_PRIVCMD_MMAPBATCH , &ioctlx) <0 ) {int saved_errno = errno; -perror ("XXXXXXXX" ); +perror ("xc_map_foreign_batch: ioctl failed" ); (void )munmap (addr, num*PAGE_SIZE ); errno = saved_errno;return NULL ;
@@ -90,8 +92,10 @@ void *xc_map_foreign_range(int xc_handleprivcmd_mmap_entry_t entry;void *addr; addr =mmap (NULL , size, prot,MAP_ANON |MAP_SHARED ,-1 ,0 ); -if ( addr ==MAP_FAILED ) -return NULL ; +if ( addr ==MAP_FAILED ) { +perror ("xc_map_foreign_range: mmap failed" ); +return NULL ; + } ioctlx.num=1 ; ioctlx.dom=dom;
@@ -102,6 +106,7 @@ void *xc_map_foreign_range(int xc_handleif (ioctl (xc_handle,IOCTL_PRIVCMD_MMAP , &ioctlx) <0 ) {int saved_errno = errno; +perror ("xc_map_foreign_range: ioctl failed" ); (void )munmap (addr, size); errno = saved_errno;return NULL ;
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel