]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: domain: Simplify return values of qemuDomainRefreshVcpuInfo
authorPeter Krempa <pkrempa@redhat.com>
Mon, 1 Aug 2016 05:35:50 +0000 (07:35 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 4 Aug 2016 06:08:40 +0000 (08:08 +0200)
Call the vcpu thread info validation separately to decrease complexity
of returned values by qemuDomainRefreshVcpuInfo.

This function now returns 0 on success and -1 on error. Certain
failures of qemu to report data are still considered as success. Any
error reported now is fatal.

src/qemu/qemu_domain.c
src/qemu/qemu_driver.c
src/qemu/qemu_process.c

index 77fa27c78ad1ba18e0d324dd27c985e9ae681e82..bb6f21e1abb3fce1e7d3878e39c0a2c509d651ff 100644 (file)
@@ -5671,10 +5671,10 @@ qemuDomainValidateVcpuInfo(virDomainObjPtr vm)
  * @vm: domain object
  * @asyncJob: current asynchronous job type
  *
- * Updates vCPU information private data of @vm.
+ * Updates vCPU information private data of @vm. Due to historical reasons this
+ * function returns success even if some data were not reported by qemu.
  *
- * Returns number of detected vCPU threads on success, -1 on error and reports
- * an appropriate error, -2 if the domain doesn't exist any more.
+ * Returns 0 on success and -1 on fatal error.
  */
 int
 qemuDomainRefreshVcpuInfo(virQEMUDriverPtr driver,
@@ -5722,10 +5722,8 @@ qemuDomainRefreshVcpuInfo(virQEMUDriverPtr driver,
     if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
         return -1;
     ncpupids = qemuMonitorGetCPUInfo(qemuDomainGetMonitor(vm), &cpupids);
-    if (qemuDomainObjExitMonitor(driver, vm) < 0) {
-        ret = -2;
+    if (qemuDomainObjExitMonitor(driver, vm) < 0)
         goto cleanup;
-    }
 
     /* 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
@@ -5745,10 +5743,7 @@ qemuDomainRefreshVcpuInfo(virQEMUDriverPtr driver,
             QEMU_DOMAIN_VCPU_PRIVATE(vcpu)->tid = 0;
     }
 
-    if (qemuDomainValidateVcpuInfo(vm) < 0)
-        goto cleanup;
-
-    ret = ncpupids;
+    ret = 0;
 
  cleanup:
     VIR_FREE(cpupids);
index 24ae3aa1513541c57ae1bd65c18b5d64975a19e5..5a7733c542d38eff3e22172371e7dfe97fb0efa2 100644 (file)
@@ -4615,6 +4615,7 @@ qemuDomainHotplugAddVcpu(virQEMUDriverPtr driver,
 {
     qemuDomainObjPrivatePtr priv = vm->privateData;
     virDomainVcpuDefPtr vcpuinfo = virDomainDefGetVcpu(vm->def, vcpu);
+    qemuDomainVcpuPrivatePtr vcpupriv = QEMU_DOMAIN_VCPU_PRIVATE(vcpuinfo);
     int ret = -1;
     int rc;
     int oldvcpus = virDomainDefGetVcpus(vm->def);
@@ -4639,15 +4640,14 @@ qemuDomainHotplugAddVcpu(virQEMUDriverPtr driver,
 
     vcpuinfo->online = true;
 
-    if ((rc = qemuDomainRefreshVcpuInfo(driver, vm, QEMU_ASYNC_JOB_NONE)) <= 0) {
-        /* vcpu pids were not detected, skip setting of affinity */
-        if (rc == 0)
-            ret = 0;
+    if (qemuDomainRefreshVcpuInfo(driver, vm, QEMU_ASYNC_JOB_NONE) < 0)
+        goto cleanup;
 
+    if (qemuDomainValidateVcpuInfo(vm) < 0)
         goto cleanup;
-    }
 
-    if (qemuProcessSetupVcpu(vm, vcpu) < 0)
+    if (vcpupriv->tid > 0 &&
+        qemuProcessSetupVcpu(vm, vcpu) < 0)
         goto cleanup;
 
     ret = 0;
@@ -4689,11 +4689,11 @@ qemuDomainHotplugDelVcpu(virQEMUDriverPtr driver,
         goto cleanup;
     }
 
-    if ((rc = qemuDomainRefreshVcpuInfo(driver, vm, QEMU_ASYNC_JOB_NONE)) < 0) {
-        /* rollback only if domain didn't exit */
-        if (rc == -2)
-            goto cleanup;
+    if (qemuDomainRefreshVcpuInfo(driver, vm, QEMU_ASYNC_JOB_NONE) < 0)
+        goto cleanup;
 
+    if (qemuDomainValidateVcpuInfo(vm) < 0) {
+        /* rollback vcpu count if the setting has failed */
         virDomainAuditVcpu(vm, oldvcpus, oldvcpus - 1, "update", false);
         vcpuinfo->online = true;
         goto cleanup;
index 6b662926e375b104c4a1ca94ae0588afde8b22e7..74816261ea4468992414d77c672d14f4d0a52aac 100644 (file)
@@ -5193,6 +5193,9 @@ qemuProcessLaunch(virConnectPtr conn,
     if (qemuDomainRefreshVcpuInfo(driver, vm, asyncJob) < 0)
         goto cleanup;
 
+    if (qemuDomainValidateVcpuInfo(vm) < 0)
+        goto cleanup;
+
     VIR_DEBUG("Detecting IOThread PIDs");
     if (qemuProcessDetectIOThreadPIDs(driver, vm, asyncJob) < 0)
         goto cleanup;
@@ -5985,6 +5988,9 @@ int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED,
     if (qemuDomainRefreshVcpuInfo(driver, vm, QEMU_ASYNC_JOB_NONE) < 0)
         goto error;
 
+    if (qemuDomainValidateVcpuInfo(vm) < 0)
+        goto error;
+
     VIR_DEBUG("Detecting IOThread PIDs");
     if (qemuProcessDetectIOThreadPIDs(driver, vm, QEMU_ASYNC_JOB_NONE) < 0)
         goto error;