From 2bdc300a34f07a43cc1362e785c2bfdcfc73bf31 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Fri, 8 Jul 2016 15:39:32 +0200 Subject: [PATCH] qemu: domain: Improve vCPU data checking in qemuDomainRefreshVcpu Validate the presence of the thread id according to state of the vCPU rather than just checking the vCPU count. Additionally put the new validation code into a separate function so that the information retrieval can be split from the validation. --- src/qemu/qemu_domain.c | 49 ++++++++++++++++++++++++++++++++++++------ src/qemu/qemu_domain.h | 1 + 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 5cde84103c..77fa27c78a 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5623,6 +5623,48 @@ qemuDomainGetVcpuPid(virDomainObjPtr vm, } +/** + * qemuDomainValidateVcpuInfo: + * + * Validates vcpu thread information. If vcpu thread IDs are reported by qemu, + * this function validates that online vcpus have thread info present and + * offline vcpus don't. + * + * Returns 0 on success -1 on error. + */ +int +qemuDomainValidateVcpuInfo(virDomainObjPtr vm) +{ + size_t maxvcpus = virDomainDefGetVcpusMax(vm->def); + virDomainVcpuDefPtr vcpu; + qemuDomainVcpuPrivatePtr vcpupriv; + size_t i; + + if (!qemuDomainHasVcpuPids(vm)) + return 0; + + for (i = 0; i < maxvcpus; i++) { + vcpu = virDomainDefGetVcpu(vm->def, i); + vcpupriv = QEMU_DOMAIN_VCPU_PRIVATE(vcpu); + + if (vcpu->online && vcpupriv->tid == 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("qemu didn't report thread id for vcpu '%zu'"), i); + return -1; + } + + if (!vcpu->online && vcpupriv->tid != 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("qemu reported thread id for inactive vcpu '%zu'"), + i); + return -1; + } + } + + return 0; +} + + /** * qemuDomainRefreshVcpuInfo: * @driver: qemu driver data @@ -5703,13 +5745,8 @@ qemuDomainRefreshVcpuInfo(virQEMUDriverPtr driver, QEMU_DOMAIN_VCPU_PRIVATE(vcpu)->tid = 0; } - if (ncpupids != virDomainDefGetVcpus(vm->def)) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("got wrong number of vCPU pids from QEMU monitor. " - "got %d, wanted %d"), - ncpupids, virDomainDefGetVcpus(vm->def)); + if (qemuDomainValidateVcpuInfo(vm) < 0) goto cleanup; - } ret = ncpupids; diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 31934273b5..06130937dd 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -647,6 +647,7 @@ int qemuDomainDefValidateMemoryHotplug(const virDomainDef *def, bool qemuDomainHasVcpuPids(virDomainObjPtr vm); pid_t qemuDomainGetVcpuPid(virDomainObjPtr vm, unsigned int vcpuid); +int qemuDomainValidateVcpuInfo(virDomainObjPtr vm); int qemuDomainRefreshVcpuInfo(virQEMUDriverPtr driver, virDomainObjPtr vm, int asyncJob); -- GitLab