diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index de23fec44a..1e9da1002b 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -5320,7 +5320,7 @@ int libxl_set_vcpuaffinity(libxl_ctx *ctx, uint32_t domid, uint32_t vcpuid, if (rc) goto out; - libxl_bitmap_copy(ctx, &hard, cpumap_hard); + libxl__bitmap_copy_best_effort(gc, &hard, cpumap_hard); flags = XEN_VCPUAFFINITY_HARD; } if (cpumap_soft) { @@ -5328,7 +5328,7 @@ int libxl_set_vcpuaffinity(libxl_ctx *ctx, uint32_t domid, uint32_t vcpuid, if (rc) goto out; - libxl_bitmap_copy(ctx, &soft, cpumap_soft); + libxl__bitmap_copy_best_effort(gc, &soft, cpumap_soft); flags |= XEN_VCPUAFFINITY_SOFT; } diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 4361421421..a38f695751 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -3617,6 +3617,17 @@ static inline void libxl__update_config_vtpm(libxl__gc *gc, libxl_device_##type##_copy(CTX, DA_p, (dev)); \ }) +/* This function copies X bytes from source to destination bitmap, + * where X is the smaller of the two sizes. + * + * If destination's size is larger than source, the extra bytes are + * untouched. + * + * XXX This is introduced to fix a regression for 4.5. It shall + * be revisited in 4.6 time frame. + */ +void libxl__bitmap_copy_best_effort(libxl__gc *gc, libxl_bitmap *dptr, + const libxl_bitmap *sptr); #endif /* diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index 58df4f3b7e..3e1ba170bd 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -614,6 +614,21 @@ void libxl_bitmap_copy(libxl_ctx *ctx, libxl_bitmap *dptr, memcpy(dptr->map, sptr->map, sz * sizeof(*dptr->map)); } +/* This function copies X bytes from source to destination bitmap, + * where X is the smaller of the two sizes. + * + * If destination's size is larger than source, the extra bytes are + * untouched. + */ +void libxl__bitmap_copy_best_effort(libxl__gc *gc, libxl_bitmap *dptr, + const libxl_bitmap *sptr) +{ + int sz; + + sz = dptr->size < sptr->size ? dptr->size : sptr->size; + memcpy(dptr->map, sptr->map, sz * sizeof(*dptr->map)); +} + void libxl_bitmap_copy_alloc(libxl_ctx *ctx, libxl_bitmap *dptr, const libxl_bitmap *sptr)