# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1264157991 0
# Node ID 9c6ba538ce75f73c40208aa445eeee38dcc453d8
# Parent fbe8f32fa257e6d8e02cd4c84ccbe61dd31f1906
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>
---
tools/libxc/xc_domain_save.c | 4 ++--
tools/libxc/xc_linux.c | 2 +-
tools/libxc/xc_misc.c | 7 ++++---
3 files changed, 7 insertions(+), 6 deletions(-)
diff -r fbe8f32fa257 -r 9c6ba538ce75 tools/libxc/xc_domain_save.c
--- a/tools/libxc/xc_domain_save.c Fri Jan 22 10:59:03 2010 +0000
+++ b/tools/libxc/xc_domain_save.c Fri Jan 22 10:59:51 2010 +0000
@@ -1059,7 +1059,8 @@ int xc_domain_save(int xc_handle, int io
pfn_type = xc_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 )
diff -r fbe8f32fa257 -r 9c6ba538ce75 tools/libxc/xc_linux.c
--- a/tools/libxc/xc_linux.c Fri Jan 22 10:59:03 2010 +0000
+++ b/tools/libxc/xc_linux.c Fri Jan 22 10:59:51 2010 +0000
@@ -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 )
{
diff -r fbe8f32fa257 -r 9c6ba538ce75 tools/libxc/xc_misc.c
--- a/tools/libxc/xc_misc.c Fri Jan 22 10:59:03 2010 +0000
+++ b/tools/libxc/xc_misc.c Fri Jan 22 10:59:51 2010 +0000
@@ -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);
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|