[PATCH v2 06/21] qemu: domain: Prepare qemuDomainDetectVcpuPids for reuse

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

 



Free the old vcpupids array in case when this function is called again
during the run of the VM. It will be later reused in the vCPU hotplug
code. The function now returns the number of detected VCPUs.
---

Notes:
    v2:
    - fix comment spacing
    - fix leak of cpupids on monitor exit failure
    - change return value
    
    v2:
    - fix comment spacing
    - fix leak of cpupids on monitor exit failure

 src/qemu/qemu_domain.c | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 5ddf048..1895520 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -4290,7 +4290,8 @@ qemuDomainGetVcpuPid(virDomainObjPtr vm,
  *
  * Updates vCPU thread ids in the private data of @vm.
  *
- * Returns 0 on success -1 on error and reports an appropriate error.
+ * Returns number of detected vCPU threads on success, -1 on error and reports
+ * an appropriate error.
  */
 int
 qemuDomainDetectVcpuPids(virQEMUDriverPtr driver,
@@ -4298,7 +4299,7 @@ qemuDomainDetectVcpuPids(virQEMUDriverPtr driver,
                          int asyncJob)
 {
     pid_t *cpupids = NULL;
-    int ncpupids;
+    int ncpupids = 0;
     qemuDomainObjPrivatePtr priv = vm->privateData;

     /*
@@ -4329,26 +4330,23 @@ qemuDomainDetectVcpuPids(virQEMUDriverPtr driver,
      * Just disable CPU pinning with TCG until someone wants
      * to try to do this hard work.
      */
-    if (vm->def->virtType == VIR_DOMAIN_VIRT_QEMU) {
-        priv->nvcpupids = 0;
-        priv->vcpupids = NULL;
-        return 0;
-    }
+    if (vm->def->virtType == VIR_DOMAIN_VIRT_QEMU)
+        goto done;

     if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
         return -1;
     ncpupids = qemuMonitorGetCPUInfo(priv->mon, &cpupids);
-    if (qemuDomainObjExitMonitor(driver, vm) < 0)
+    if (qemuDomainObjExitMonitor(driver, vm) < 0) {
+        VIR_FREE(cpupids);
         return -1;
-    /* failure to get the VCPU<-> PID mapping or to execute the query
+    }
+    /* failure to get the VCPU <-> PID mapping or to execute the query
      * command will not be treated fatal as some versions of qemu don't
      * support this command */
     if (ncpupids <= 0) {
         virResetLastError();
-
-        priv->nvcpupids = 0;
-        priv->vcpupids = NULL;
-        return 0;
+        ncpupids = 0;
+        goto done;
     }

     if (ncpupids != virDomainDefGetVcpus(vm->def)) {
@@ -4360,7 +4358,9 @@ qemuDomainDetectVcpuPids(virQEMUDriverPtr driver,
         return -1;
     }

+ done:
+    VIR_FREE(priv->vcpupids);
     priv->nvcpupids = ncpupids;
     priv->vcpupids = cpupids;
-    return 0;
+    return ncpupids;
 }
-- 
2.6.2

--
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]