]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: driver: Extract vcpu halted state directly
authorPeter Krempa <pkrempa@redhat.com>
Tue, 6 Feb 2018 14:50:05 +0000 (15:50 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 7 Feb 2018 12:57:00 +0000 (13:57 +0100)
Don't extract the halted state into a separate array, but rater access
the vcpu structures directly. We still need to call the vcpu helper to
retrieve the performance statistics though.

src/qemu/qemu_driver.c

index bff49e7be60a80f80482f089564b3a0f9dcb8d71..172a8a3f73972b0e6b22c270018dcfa6536c5db6 100644 (file)
@@ -19660,12 +19660,14 @@ qemuDomainGetStatsVcpu(virQEMUDriverPtr driver,
                        int *maxparams,
                        unsigned int privflags)
 {
+    virDomainVcpuDefPtr vcpu;
+    qemuDomainVcpuPrivatePtr vcpupriv;
     size_t i;
     int ret = -1;
     char param_name[VIR_TYPED_PARAM_FIELD_LENGTH];
     virVcpuInfoPtr cpuinfo = NULL;
     unsigned long long *cpuwait = NULL;
-    bool *cpuhalted = NULL;
+    bool vcpuhalted = false;
 
     if (virTypedParamsAddUInt(&record->params,
                               &record->nparams,
@@ -19691,14 +19693,14 @@ qemuDomainGetStatsVcpu(virQEMUDriverPtr driver,
             /* it's ok to be silent and go ahead, because halted vcpu info
              * wasn't here from the beginning */
             virResetLastError();
-        } else if (VIR_ALLOC_N(cpuhalted, virDomainDefGetVcpus(dom->def)) < 0) {
-            goto cleanup;
+        } else {
+            vcpuhalted = true;
         }
     }
 
     if (qemuDomainHelperGetVcpus(dom, cpuinfo, cpuwait,
                                  virDomainDefGetVcpus(dom->def),
-                                 NULL, 0, cpuhalted) < 0) {
+                                 NULL, 0, NULL) < 0) {
         virResetLastError();
         ret = 0; /* it's ok to be silent and go ahead */
         goto cleanup;
@@ -19735,14 +19737,20 @@ qemuDomainGetStatsVcpu(virQEMUDriverPtr driver,
                                     cpuwait[i]) < 0)
             goto cleanup;
 
-        if (cpuhalted) {
+        /* state below is extracted from the individual vcpu structs */
+        if (!(vcpu = virDomainDefGetVcpu(dom->def, cpuinfo[i].number)))
+            continue;
+
+        vcpupriv = QEMU_DOMAIN_VCPU_PRIVATE(vcpu);
+
+        if (vcpuhalted) {
             snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
                      "vcpu.%u.halted", cpuinfo[i].number);
             if (virTypedParamsAddBoolean(&record->params,
                                          &record->nparams,
                                          maxparams,
                                          param_name,
-                                         cpuhalted[i]) < 0)
+                                         vcpupriv->halted) < 0)
                 goto cleanup;
         }
     }
@@ -19752,7 +19760,6 @@ qemuDomainGetStatsVcpu(virQEMUDriverPtr driver,
  cleanup:
     VIR_FREE(cpuinfo);
     VIR_FREE(cpuwait);
-    VIR_FREE(cpuhalted);
     return ret;
 }