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 | 16 +++++-----------
src/qemu/qemu_driver.c | 20 ++++++++++----------
src/qemu/qemu_process.c | 6 ++++++
3 files changed, 21 insertions(+), 21 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index f27f2f7..4cdd012 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -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,7 @@ qemuDomainRefreshVcpuInfo(virQEMUDriverPtr driver,
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
return -1;
ncpupids = qemuMonitorGetCPUInfo(qemuDomainGetMonitor(vm), &cpupids);
- if (qemuDomainObjExitMonitor(driver, vm) < 0) {
- ret = -2;
- goto cleanup;
- }
+ if (qemuDomainObjExitMonitor(driver, vm) < 0)
/* 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 +5742,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);
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 453572b..2199258 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -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;
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 9136ba5..2e405af 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -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;
--
2.9.2