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.
This commit is contained in:
Peter Krempa 2016-08-04 14:23:25 +02:00
parent 8807f28b85
commit 20ef1232ec
3 changed files with 39 additions and 0 deletions

View File

@ -5999,3 +5999,37 @@ qemuDomainVcpuHotplugIsInOrder(virDomainDefPtr def)
return seenonlinevcpus == virDomainDefGetVcpus(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;
}
}
}

View File

@ -725,4 +725,7 @@ int qemuDomainPrepareChannel(virDomainChrDefPtr chr,
bool qemuDomainVcpuHotplugIsInOrder(virDomainDefPtr def) bool qemuDomainVcpuHotplugIsInOrder(virDomainDefPtr def)
ATTRIBUTE_NONNULL(1); ATTRIBUTE_NONNULL(1);
void qemuDomainVcpuPersistOrder(virDomainDefPtr def)
ATTRIBUTE_NONNULL(1);
#endif /* __QEMU_DOMAIN_H__ */ #endif /* __QEMU_DOMAIN_H__ */

View File

@ -5243,6 +5243,8 @@ qemuProcessLaunch(virConnectPtr conn,
if (qemuDomainValidateVcpuInfo(vm) < 0) if (qemuDomainValidateVcpuInfo(vm) < 0)
goto cleanup; goto cleanup;
qemuDomainVcpuPersistOrder(vm->def);
VIR_DEBUG("Detecting IOThread PIDs"); VIR_DEBUG("Detecting IOThread PIDs");
if (qemuProcessDetectIOThreadPIDs(driver, vm, asyncJob) < 0) if (qemuProcessDetectIOThreadPIDs(driver, vm, asyncJob) < 0)
goto cleanup; goto cleanup;