mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-09-08 16:54:49 +00:00
qemu: Update host-model CPUs on reconnect
When libvirt starts a new QEMU domain, it replaces host-model CPUs with the appropriate custom CPU definition. However, when reconnecting to a domain started by older libvirt (< 2.3), the domain would still have a host-model CPU in its active definition. https://bugzilla.redhat.com/show_bug.cgi?id=1463957 Signed-off-by: Jiri Denemark <jdenemar@redhat.com> Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
This commit is contained in:
parent
aad362f93b
commit
7cf22b4879
@ -3746,6 +3746,30 @@ qemuProcessUpdateAndVerifyCPU(virQEMUDriverPtr driver,
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
qemuProcessUpdateCPU(virQEMUDriverPtr driver,
|
||||
virDomainObjPtr vm,
|
||||
qemuDomainAsyncJob asyncJob)
|
||||
{
|
||||
virCPUDataPtr cpu = NULL;
|
||||
virCPUDataPtr disabled = NULL;
|
||||
int ret = -1;
|
||||
|
||||
if (qemuProcessFetchGuestCPU(driver, vm, asyncJob, &cpu, &disabled) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (qemuProcessUpdateLiveGuestCPU(vm, cpu, disabled) < 0)
|
||||
goto cleanup;
|
||||
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
virCPUDataFree(cpu);
|
||||
virCPUDataFree(disabled);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
qemuPrepareNVRAM(virQEMUDriverConfigPtr cfg,
|
||||
virDomainObjPtr vm)
|
||||
@ -6841,6 +6865,30 @@ qemuProcessReconnect(void *opaque)
|
||||
ignore_value(qemuSecurityCheckAllLabel(driver->securityManager,
|
||||
obj->def));
|
||||
|
||||
/* If the domain with a host-model CPU was started by an old libvirt
|
||||
* (< 2.3) which didn't replace the CPU with a custom one, let's do it now
|
||||
* since the rest of our code does not really expect a host-model CPU in a
|
||||
* running domain.
|
||||
*/
|
||||
if (virQEMUCapsGuestIsNative(caps->host.arch, obj->def->os.arch) &&
|
||||
caps->host.cpu &&
|
||||
obj->def->cpu &&
|
||||
obj->def->cpu->mode == VIR_CPU_MODE_HOST_MODEL) {
|
||||
virCPUDefPtr host;
|
||||
|
||||
if (!(host = virCPUCopyMigratable(caps->host.cpu->arch, caps->host.cpu)))
|
||||
goto error;
|
||||
|
||||
if (virCPUUpdate(obj->def->os.arch, obj->def->cpu, host) < 0) {
|
||||
virCPUDefFree(host);
|
||||
goto error;
|
||||
}
|
||||
virCPUDefFree(host);
|
||||
|
||||
if (qemuProcessUpdateCPU(driver, obj, QEMU_ASYNC_JOB_NONE) < 0)
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (qemuDomainRefreshVcpuInfo(driver, obj, QEMU_ASYNC_JOB_NONE, true) < 0)
|
||||
goto error;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user