From: Wei Liu Date: Wed, 8 Jun 2016 14:01:02 +0000 (+0100) Subject: libxl: only issue cpu-add call to QEMU for not present CPU X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~804 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=56bac262e097684b20f7753ceb6debe594e9725c;p=xen.git libxl: only issue cpu-add call to QEMU for not present CPU Calculate the final bitmap for CPUs to add to avoid having annoying error messages complaining those CPUs are already present. Example message is like (wrapped): libxl: error: libxl_qmp.c:287:qmp_handle_error_response: received an error message from QMP server: Unable to add CPU: 0, it already exists We can also properly handle error from QMP now. Signed-off-by: Wei Liu Reviewed-by: Anthony PERARD Acked-by: Ian Jackson --- diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index d059251010..e49741d34e 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -5756,19 +5756,38 @@ static int libxl__set_vcpuonline_qmp(libxl__gc *gc, uint32_t domid, libxl_bitmap *cpumap, const libxl_dominfo *info) { - int i; + int i, rc; + libxl_bitmap current_map, final_map; + + libxl_bitmap_init(¤t_map); + libxl_bitmap_init(&final_map); + + libxl_bitmap_alloc(CTX, ¤t_map, info->vcpu_max_id + 1); + libxl_bitmap_set_none(¤t_map); + rc = libxl__qmp_query_cpus(gc, domid, ¤t_map); + if (rc) { + LOG(ERROR, "failed to query cpus for domain %d", domid); + goto out; + } + + libxl_bitmap_copy_alloc(CTX, &final_map, cpumap); - for (i = 0; i <= info->vcpu_max_id; i++) { - if (libxl_bitmap_test(cpumap, i)) { - /* Return value is ignore because it does not tell anything useful - * on the completion of the command. - * (For instance, "CPU already plugged-in" give the same return - * value as "command not supported".) - */ - libxl__qmp_cpu_add(gc, domid, i); + libxl_for_each_set_bit(i, current_map) + libxl_bitmap_reset(&final_map, i); + + libxl_for_each_set_bit(i, final_map) { + rc = libxl__qmp_cpu_add(gc, domid, i); + if (rc) { + LOG(ERROR, "failed to add cpu %d to domain %d", i, domid); + goto out; } } - return 0; + + rc = 0; +out: + libxl_bitmap_dispose(¤t_map); + libxl_bitmap_dispose(&final_map); + return rc; } int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t domid, libxl_bitmap *cpumap)