[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] libxc: mmapbatch-v2 adjustments



Just like the kernel, the fallback implementation of
xc_map_foreign_bulk() should clear the error indication array upon
success.

Also, a few allocations were needlessly using calloc() instead of
malloc().

Finally, in xc_domain_save() allocate the error indicator array once
(along with the other arrays) instead of using realloc() (without
error checking) in the loop body.

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>

--- 2010-01-06.orig/tools/libxc/xc_domain_save.c        2010-01-12 
10:22:58.000000000 +0100
+++ 2010-01-06/tools/libxc/xc_domain_save.c     2010-01-22 08:33:52.000000000 
+0100
@@ -1059,7 +1059,8 @@ int xc_domain_save(int xc_handle, int io
     pfn_type   = xg_memalign(PAGE_SIZE, ROUNDUP(
                               MAX_BATCH_SIZE * sizeof(*pfn_type), PAGE_SHIFT));
     pfn_batch  = calloc(MAX_BATCH_SIZE, sizeof(*pfn_batch));
-    if ( (pfn_type == NULL) || (pfn_batch == NULL) )
+    pfn_err    = malloc(MAX_BATCH_SIZE * sizeof(*pfn_err));
+    if ( (pfn_type == NULL) || (pfn_batch == NULL) || (pfn_err == NULL) )
     {
         ERROR("failed to alloc memory for pfn_type and/or pfn_batch arrays");
         errno = ENOMEM;
@@ -1273,7 +1274,6 @@ int xc_domain_save(int xc_handle, int io
             if ( batch == 0 )
                 goto skip; /* vanishingly unlikely... */
 
-            pfn_err = realloc(pfn_err, sizeof(int) * batch);
             region_base = xc_map_foreign_bulk(
                 xc_handle, dom, PROT_READ, pfn_type, pfn_err, batch);
             if ( region_base == NULL )
--- 2010-01-06.orig/tools/libxc/xc_linux.c      2010-01-14 14:05:14.000000000 
+0100
+++ 2010-01-06/tools/libxc/xc_linux.c   2010-01-22 08:38:41.000000000 +0100
@@ -186,7 +186,7 @@ void *xc_map_foreign_bulk(int xc_handle,
          * IOCTL_PRIVCMD_MMAPBATCH_V2 is not supported - fall back to
          * IOCTL_PRIVCMD_MMAPBATCH.
          */
-        xen_pfn_t *pfn = calloc(num, sizeof(*pfn));
+        xen_pfn_t *pfn = malloc(num * sizeof(*pfn));
 
         if ( pfn )
         {
--- 2010-01-06.orig/tools/libxc/xc_misc.c       2010-01-08 15:38:59.000000000 
+0100
+++ 2010-01-06/tools/libxc/xc_misc.c    2010-01-22 08:39:22.000000000 +0100
@@ -360,7 +360,7 @@ void *xc_map_foreign_pages(int xc_handle
         return NULL;
     }
 
-    err = calloc(num, sizeof(*err));
+    err = malloc(num * sizeof(*err));
     if (!err)
         return NULL;
 
@@ -397,7 +397,7 @@ xc_map_foreign_bulk(int xc_handle, uint3
         return NULL;
     }
 
-    pfn = calloc(num, sizeof(*pfn));
+    pfn = malloc(num * sizeof(*pfn));
     if (!pfn) {
         errno = ENOMEM;
         return NULL;
@@ -416,7 +416,8 @@ xc_map_foreign_bulk(int xc_handle, uint3
                 err[i] = -EINVAL;
                 break;
             }
-    }
+    } else
+        memset(err, 0, num * sizeof(*err));
 
     free(pfn);
 



Attachment: xen-libxc-privcmd-mmap-clear.patch
Description: Text document

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.