aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2010-01-22 10:59:51 +0000
committerKeir Fraser <keir.fraser@citrix.com>2010-01-22 10:59:51 +0000
commit7848a26a9729479720edfcee8c6bd816eb11ac41 (patch)
tree3e84286123405ec5b960d42950974fc7a3545837
parentd6aaa9ee0f8ba5d2d8ff1187b05ed9becee0b40c (diff)
downloadxen-7848a26a9729479720edfcee8c6bd816eb11ac41.tar.gz
xen-7848a26a9729479720edfcee8c6bd816eb11ac41.tar.bz2
xen-7848a26a9729479720edfcee8c6bd816eb11ac41.zip
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@novell.com>
-rw-r--r--tools/libxc/xc_domain_save.c4
-rw-r--r--tools/libxc/xc_linux.c2
-rw-r--r--tools/libxc/xc_misc.c7
3 files changed, 7 insertions, 6 deletions
diff --git a/tools/libxc/xc_domain_save.c b/tools/libxc/xc_domain_save.c
index aa9748a7e5..2334b49c07 100644
--- a/tools/libxc/xc_domain_save.c
+++ b/tools/libxc/xc_domain_save.c
@@ -1059,7 +1059,8 @@ int xc_domain_save(int xc_handle, int io_fd, uint32_t dom, uint32_t max_iters,
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_fd, uint32_t dom, uint32_t max_iters,
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 --git a/tools/libxc/xc_linux.c b/tools/libxc/xc_linux.c
index 3f3bc10d95..55ceda1fcd 100644
--- a/tools/libxc/xc_linux.c
+++ b/tools/libxc/xc_linux.c
@@ -186,7 +186,7 @@ void *xc_map_foreign_bulk(int xc_handle, uint32_t dom, int prot,
* 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 --git a/tools/libxc/xc_misc.c b/tools/libxc/xc_misc.c
index 44039b03be..04da3d2a3f 100644
--- a/tools/libxc/xc_misc.c
+++ b/tools/libxc/xc_misc.c
@@ -360,7 +360,7 @@ void *xc_map_foreign_pages(int xc_handle, uint32_t dom, int prot,
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, uint32_t dom, int prot,
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, uint32_t dom, int prot,
err[i] = -EINVAL;
break;
}
- }
+ } else
+ memset(err, 0, num * sizeof(*err));
free(pfn);