Skip to contentSkip to conversation

libxc: make error path more verbose

PATCH New Christoph Egger 1 participant 1 message Nov 13, 2007

lore
Share & tools
lore
#0 lore raw

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: 0
xc_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
diff -r dfca1120813f tools/libxc/xc_linux.c
@@ -67,8 +67,10 @@ void *xc_map_foreign_batch(int xc_handle
     privcmd_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_handle
     if ( 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_handle
     privcmd_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_handle
     if ( 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_ha
         int 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_h
         int 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
diff -r dfca1120813f tools/libxc/xc_netbsd.c
@@ -63,8 +63,10 @@ void *xc_map_foreign_batch(int xc_handle
     privcmd_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_handle
     if ( 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_handle
     privcmd_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_handle
     if ( 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