diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 3d9543bc57..75f5053647 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -4171,6 +4171,11 @@ libxl_vcpuinfo *libxl_list_vcpu(libxl_ctx *ctx, uint32_t domid, LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting infolist"); return NULL; } + + if (domaininfo.max_vcpu_id == XEN_INVALID_MAX_VCPU_ID) { + return NULL; + } + *nr_vcpus_out = libxl_get_max_cpus(ctx); ret = ptr = calloc(domaininfo.max_vcpu_id + 1, sizeof (libxl_vcpuinfo)); if (!ptr) { diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index a7f888ce2f..b251f4cd84 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -4384,10 +4384,8 @@ static void print_domain_vcpuinfo(uint32_t domid, uint32_t nr_cpus) vcpuinfo = libxl_list_vcpu(ctx, domid, &nb_vcpu, &nrcpus); - if (!vcpuinfo) { - fprintf(stderr, "libxl_list_vcpu failed.\n"); + if (!vcpuinfo) return; - } for (i = 0; i < nb_vcpu; i++) { print_vcpuinfo(domid, &vcpuinfo[i], nr_cpus); diff --git a/xen/common/domctl.c b/xen/common/domctl.c index 2747dcd82d..99882933ea 100644 --- a/xen/common/domctl.c +++ b/xen/common/domctl.c @@ -154,6 +154,7 @@ void getdomaininfo(struct domain *d, struct xen_domctl_getdomaininfo *info) struct vcpu_runstate_info runstate; info->domain = d->domain_id; + info->max_vcpu_id = XEN_INVALID_MAX_VCPU_ID; info->nr_online_vcpus = 0; info->ssidref = 0; diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h index 4c5b2bbbbd..d381903dfd 100644 --- a/xen/include/public/domctl.h +++ b/xen/include/public/domctl.h @@ -101,6 +101,7 @@ struct xen_domctl_getdomaininfo { uint64_aligned_t shared_info_frame; /* GMFN of shared_info struct */ uint64_aligned_t cpu_time; uint32_t nr_online_vcpus; /* Number of VCPUs currently online. */ +#define XEN_INVALID_MAX_VCPU_ID (~0U) /* Domain has no vcpus? */ uint32_t max_vcpu_id; /* Maximum VCPUID in use by this domain. */ uint32_t ssidref; xen_domain_handle_t handle;