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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list