diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index f27b5813ce..ee127d8ef0 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -5246,7 +5246,12 @@ libxl_vcpuinfo *libxl_list_vcpu(libxl_ctx *ctx, uint32_t domid, GC_FREE; return NULL; } - *nr_cpus_out = libxl_get_max_cpus(ctx); + + if (domaininfo.max_vcpu_id == XEN_INVALID_MAX_VCPU_ID) { + GC_FREE; + return NULL; + } + ret = ptr = libxl__calloc(NOGC, domaininfo.max_vcpu_id + 1, sizeof(libxl_vcpuinfo)); diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index ea43761101..0882644392 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -4813,10 +4813,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 b6f9708c25..d9c26350a4 100644 --- a/xen/common/domctl.c +++ b/xen/common/domctl.c @@ -156,6 +156,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 f519524fe8..58b19e7c1f 100644 --- a/xen/include/public/domctl.h +++ b/xen/include/public/domctl.h @@ -108,6 +108,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;