diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2010-01-22 10:59:51 +0000 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2010-01-22 10:59:51 +0000 |
commit | 7848a26a9729479720edfcee8c6bd816eb11ac41 (patch) | |
tree | 3e84286123405ec5b960d42950974fc7a3545837 | |
parent | d6aaa9ee0f8ba5d2d8ff1187b05ed9becee0b40c (diff) | |
download | xen-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.c | 4 | ||||
-rw-r--r-- | tools/libxc/xc_linux.c | 2 | ||||
-rw-r--r-- | tools/libxc/xc_misc.c | 7 |
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); |