From 20ef1232ec9b51dc498d270f7c279235b6842d25 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Thu, 4 Aug 2016 14:23:25 +0200 Subject: [PATCH] qemu: process: Copy final vcpu order information into the vcpu definition The vcpu order information is extracted only for hotpluggable entities, while vcpu definitions belonging to the same hotpluggable entity need to all share the order information. We also can't overwrite it right away in the vcpu info detection code as the order is necessary to add the hotpluggable vcpus enabled on boot in the correct order. The helper will store the order information in places where we are certain that it's necessary. --- src/qemu/qemu_domain.c | 34 ++++++++++++++++++++++++++++++++++ src/qemu/qemu_domain.h | 3 +++ src/qemu/qemu_process.c | 2 ++ 3 files changed, 39 insertions(+) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 69e1e381be..aa93498394 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5999,3 +5999,37 @@ qemuDomainVcpuHotplugIsInOrder(virDomainDefPtr def) return seenonlinevcpus == virDomainDefGetVcpus(def); } + + +/** + * qemuDomainVcpuPersistOrder: + * @def: domain definition + * + * Saves the order of vcpus detected from qemu to the domain definition. + * The private data note the order only for the entry describing the + * hotpluggable entity. This function copies the order into the definition part + * of all sub entities. + */ +void +qemuDomainVcpuPersistOrder(virDomainDefPtr def) +{ + size_t maxvcpus = virDomainDefGetVcpusMax(def); + virDomainVcpuDefPtr vcpu; + qemuDomainVcpuPrivatePtr vcpupriv; + unsigned int prevorder = 0; + size_t i; + + for (i = 0; i < maxvcpus; i++) { + vcpu = virDomainDefGetVcpu(def, i); + vcpupriv = QEMU_DOMAIN_VCPU_PRIVATE(vcpu); + + if (!vcpu->online) { + vcpu->order = 0; + } else { + if (vcpupriv->enable_id != 0) + prevorder = vcpupriv->enable_id; + + vcpu->order = prevorder; + } + } +} diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index b873a8b49b..13c03729f3 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -725,4 +725,7 @@ int qemuDomainPrepareChannel(virDomainChrDefPtr chr, bool qemuDomainVcpuHotplugIsInOrder(virDomainDefPtr def) ATTRIBUTE_NONNULL(1); +void qemuDomainVcpuPersistOrder(virDomainDefPtr def) + ATTRIBUTE_NONNULL(1); + #endif /* __QEMU_DOMAIN_H__ */ diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 3cf9d8cd97..f3915a586b 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -5243,6 +5243,8 @@ qemuProcessLaunch(virConnectPtr conn, if (qemuDomainValidateVcpuInfo(vm) < 0) goto cleanup; + qemuDomainVcpuPersistOrder(vm->def); + VIR_DEBUG("Detecting IOThread PIDs"); if (qemuProcessDetectIOThreadPIDs(driver, vm, asyncJob) < 0) goto cleanup; -- GitLab