[libvirt] [PATCH 02/11] qemu: Split qemuDomainGetIOThreadsLive

John Ferlan jferlan at redhat.com
Sun Oct 7 13:00:15 UTC 2018


Separate out the fetch of the IOThread monitor call into a separate
helper so that a subsequent domain statistics change can fetch the raw
IOThread data and parse it as it sees fit.

Signed-off-by: John Ferlan <jferlan at redhat.com>
---
 src/qemu/qemu_driver.c | 59 ++++++++++++++++++++++++------------------
 1 file changed, 34 insertions(+), 25 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index ef87a6ef05..e0edb43557 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -5486,20 +5486,18 @@ qemuDomainGetMaxVcpus(virDomainPtr dom)
                                          VIR_DOMAIN_VCPU_MAXIMUM));
 }
 
+
 static int
-qemuDomainGetIOThreadsLive(virQEMUDriverPtr driver,
-                           virDomainObjPtr vm,
-                           virDomainIOThreadInfoPtr **info)
+qemuDomainGetIOThreadsMon(virQEMUDriverPtr driver,
+                          virDomainObjPtr vm,
+                          qemuMonitorIOThreadInfoPtr **iothreads)
 {
     qemuDomainObjPrivatePtr priv;
-    qemuMonitorIOThreadInfoPtr *iothreads = NULL;
-    virDomainIOThreadInfoPtr *info_ret = NULL;
     int niothreads = 0;
-    size_t i;
     int ret = -1;
 
     if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0)
-        goto cleanup;
+        return -1;
 
     if (!virDomainObjIsActive(vm)) {
         virReportError(VIR_ERR_OPERATION_INVALID, "%s",
@@ -5515,46 +5513,57 @@ qemuDomainGetIOThreadsLive(virQEMUDriverPtr driver,
     }
 
     qemuDomainObjEnterMonitor(driver, vm);
-    niothreads = qemuMonitorGetIOThreads(priv->mon, &iothreads);
-    if (qemuDomainObjExitMonitor(driver, vm) < 0)
-        goto endjob;
-    if (niothreads < 0)
+    niothreads = qemuMonitorGetIOThreads(priv->mon, iothreads);
+    if (qemuDomainObjExitMonitor(driver, vm) < 0 || niothreads < 0)
         goto endjob;
 
-    /* Nothing to do */
-    if (niothreads == 0) {
-        ret = 0;
-        goto endjob;
-    }
+    ret = niothreads;
+
+ endjob:
+    qemuDomainObjEndJob(driver, vm);
+
+    return ret;
+}
+
+
+static int
+qemuDomainGetIOThreadsLive(virQEMUDriverPtr driver,
+                           virDomainObjPtr vm,
+                           virDomainIOThreadInfoPtr **info)
+{
+    qemuMonitorIOThreadInfoPtr *iothreads = NULL;
+    virDomainIOThreadInfoPtr *info_ret = NULL;
+    int niothreads;
+    size_t i;
+    int ret = -1;
+
+    if ((niothreads = qemuDomainGetIOThreadsMon(driver, vm, &iothreads)) <= 0)
+        return niothreads;
 
     if (VIR_ALLOC_N(info_ret, niothreads) < 0)
-        goto endjob;
+        goto cleanup;
 
     for (i = 0; i < niothreads; i++) {
         virBitmapPtr map = NULL;
 
         if (VIR_ALLOC(info_ret[i]) < 0)
-            goto endjob;
+            goto cleanup;
         info_ret[i]->iothread_id = iothreads[i]->iothread_id;
 
         if (!(map = virProcessGetAffinity(iothreads[i]->thread_id)))
-            goto endjob;
+            goto cleanup;
 
         if (virBitmapToData(map, &info_ret[i]->cpumap,
                             &info_ret[i]->cpumaplen) < 0) {
             virBitmapFree(map);
-            goto endjob;
+            goto cleanup;
         }
         virBitmapFree(map);
     }
 
-    *info = info_ret;
-    info_ret = NULL;
+    VIR_STEAL_PTR(*info, info_ret);
     ret = niothreads;
 
- endjob:
-    qemuDomainObjEndJob(driver, vm);
-
  cleanup:
     if (info_ret) {
         for (i = 0; i < niothreads; i++)
-- 
2.17.1




More information about the libvir-list mailing list