aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTaku Izumi <izumi.taku@jp.fujitsu.com>2011-06-24 18:01:25 +0900
committerEric Blake <eblake@redhat.com>2011-06-24 17:00:22 -0600
commitffb552ebf023cfadc4ce290ad09936ff7e68ddc3 (patch)
tree94b9fe95f27c474a70905796438dc32dd90995c3 /tools/virsh.c
parentvcpupin: implement the remote protocol to address the new API (diff)
downloadlibvirt-ffb552ebf023cfadc4ce290ad09936ff7e68ddc3.tar.gz
libvirt-ffb552ebf023cfadc4ce290ad09936ff7e68ddc3.tar.bz2
libvirt-ffb552ebf023cfadc4ce290ad09936ff7e68ddc3.zip
vcpuinfo: add the code to fallback to try new API
The "virsh vcpuinfo" command results in failure when the target domain is inactive on KVM. This patch improves this behavior by adding the fallback to invoke virDomainGetVcpupinInfo API in case of virDomainGetVcpus API returns error and the target domain is inactive. Signed-off-by: Taku Izumi <izumi.taku@jp.fujitsu.com>
Diffstat (limited to 'tools/virsh.c')
-rw-r--r--tools/virsh.c48
1 files changed, 34 insertions, 14 deletions
diff --git a/tools/virsh.c b/tools/virsh.c
index 12a47ee13..dbbb117f8 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -2909,10 +2909,11 @@ cmdVcpuinfo(vshControl *ctl, const vshCmd *cmd)
virDomainPtr dom;
virNodeInfo nodeinfo;
virVcpuInfoPtr cpuinfo;
- unsigned char *cpumap;
- int ncpus;
+ unsigned char *cpumaps;
+ int ncpus, maxcpu;
size_t cpumaplen;
bool ret = true;
+ int n, m;
if (!vshConnectionUsability(ctl, ctl->conn))
return false;
@@ -2931,15 +2932,14 @@ cmdVcpuinfo(vshControl *ctl, const vshCmd *cmd)
}
cpuinfo = vshMalloc(ctl, sizeof(virVcpuInfo)*info.nrVirtCpu);
- cpumaplen = VIR_CPU_MAPLEN(VIR_NODEINFO_MAXCPUS(nodeinfo));
- cpumap = vshMalloc(ctl, info.nrVirtCpu * cpumaplen);
+ maxcpu = VIR_NODEINFO_MAXCPUS(nodeinfo);
+ cpumaplen = VIR_CPU_MAPLEN(maxcpu);
+ cpumaps = vshMalloc(ctl, info.nrVirtCpu * cpumaplen);
if ((ncpus = virDomainGetVcpus(dom,
cpuinfo, info.nrVirtCpu,
- cpumap, cpumaplen)) >= 0) {
- int n;
+ cpumaps, cpumaplen)) >= 0) {
for (n = 0 ; n < ncpus ; n++) {
- unsigned int m;
vshPrint(ctl, "%-15s %d\n", _("VCPU:"), n);
vshPrint(ctl, "%-15s %d\n", _("CPU:"), cpuinfo[n].cpu);
vshPrint(ctl, "%-15s %s\n", _("State:"),
@@ -2952,8 +2952,8 @@ cmdVcpuinfo(vshControl *ctl, const vshCmd *cmd)
vshPrint(ctl, "%-15s %.1lfs\n", _("CPU time:"), cpuUsed);
}
vshPrint(ctl, "%-15s ", _("CPU Affinity:"));
- for (m = 0 ; m < VIR_NODEINFO_MAXCPUS(nodeinfo) ; m++) {
- vshPrint(ctl, "%c", VIR_CPU_USABLE(cpumap, cpumaplen, n, m) ? 'y' : '-');
+ for (m = 0; m < maxcpu; m++) {
+ vshPrint(ctl, "%c", VIR_CPU_USABLE(cpumaps, cpumaplen, n, m) ? 'y' : '-');
}
vshPrint(ctl, "\n");
if (n < (ncpus - 1)) {
@@ -2961,14 +2961,34 @@ cmdVcpuinfo(vshControl *ctl, const vshCmd *cmd)
}
}
} else {
- if (info.state == VIR_DOMAIN_SHUTOFF) {
- vshError(ctl, "%s",
- _("Domain shut off, virtual CPUs not present."));
+ if (info.state == VIR_DOMAIN_SHUTOFF &&
+ (ncpus = virDomainGetVcpupinInfo(dom, info.nrVirtCpu,
+ cpumaps, cpumaplen,
+ VIR_DOMAIN_AFFECT_CONFIG)) >= 0) {
+
+ /* fallback plan to use virDomainGetVcpupinInfo */
+
+ for (n = 0; n < ncpus; n++) {
+ vshPrint(ctl, "%-15s %d\n", _("VCPU:"), n);
+ vshPrint(ctl, "%-15s %s\n", _("CPU:"), _("N/A"));
+ vshPrint(ctl, "%-15s %s\n", _("State:"), _("N/A"));
+ vshPrint(ctl, "%-15s %s\n", _("CPU time"), _("N/A"));
+ vshPrint(ctl, "%-15s ", _("CPU Affinity:"));
+ for (m = 0; m < maxcpu; m++) {
+ vshPrint(ctl, "%c",
+ VIR_CPU_USABLE(cpumaps, cpumaplen, n, m) ? 'y' : '-');
+ }
+ vshPrint(ctl, "\n");
+ if (n < (ncpus - 1)) {
+ vshPrint(ctl, "\n");
+ }
+ }
+ } else {
+ ret = false;
}
- ret = false;
}
- VIR_FREE(cpumap);
+ VIR_FREE(cpumaps);
VIR_FREE(cpuinfo);
virDomainFree(dom);
return ret;