diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 77fa27c78ad1ba18e0d324dd27c985e9ae681e82..bb6f21e1abb3fce1e7d3878e39c0a2c509d651ff 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,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); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 24ae3aa1513541c57ae1bd65c18b5d64975a19e5..5a7733c542d38eff3e22172371e7dfe97fb0efa2 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 6b662926e375b104c4a1ca94ae0588afde8b22e7..74816261ea4468992414d77c672d14f4d0a52aac 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;