[PATCH 4/5] vcpuinfo: add the code to fallback to try new API

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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.


Signd-off-by: Taku Izumi <izumi.taku@xxxxxxxxxxxxxx>
---
 tools/virsh.c |   48 ++++++++++++++++++++++++++++++++++--------------
 1 file changed, 34 insertions(+), 14 deletions(-)

Index: libvirt/tools/virsh.c
===================================================================
--- libvirt.orig/tools/virsh.c
+++ libvirt/tools/virsh.c
@@ -2903,10 +2903,11 @@ cmdVcpuinfo(vshControl *ctl, const vshCm
     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;
@@ -2925,15 +2926,14 @@ cmdVcpuinfo(vshControl *ctl, const vshCm
     }
 
     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:"),
@@ -2946,8 +2946,8 @@ cmdVcpuinfo(vshControl *ctl, const vshCm
                 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)) {
@@ -2955,14 +2955,34 @@ cmdVcpuinfo(vshControl *ctl, const vshCm
             }
         }
     } 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;

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list


[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]