From 24d641eb1f8cf8b90e1276426c5e7889b7324807 Mon Sep 17 00:00:00 2001 Message-Id: <24d641eb1f8cf8b90e1276426c5e7889b7324807@dist-git> From: Jiri Denemark Date: Fri, 6 Oct 2017 12:57:15 +0200 Subject: [PATCH] qemu: Separate CPU updating code from qemuProcessReconnect The new function is called qemuProcessRefreshCPU. Signed-off-by: Jiri Denemark Reviewed-by: Pavel Hrdina (cherry picked from commit 4b87b3675ffd7794542de70da4391f3787ed76a2) https://bugzilla.redhat.com/show_bug.cgi?id=1508549 Signed-off-by: Jiri Denemark --- src/qemu/qemu_process.c | 68 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 23 deletions(-) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 8fe9ef36d7..4a8c4421a3 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -6662,6 +6662,49 @@ qemuProcessRefreshDisks(virQEMUDriverPtr driver, } +static int +qemuProcessRefreshCPU(virQEMUDriverPtr driver, + virDomainObjPtr vm) +{ + virCapsPtr caps = virQEMUDriverGetCapabilities(driver, false); + virCPUDefPtr host = NULL; + int ret = -1; + + if (!caps) + return -1; + + if (!virQEMUCapsGuestIsNative(caps->host.arch, vm->def->os.arch) || + !caps->host.cpu || + !vm->def->cpu) { + ret = 0; + goto cleanup; + } + + /* 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 (vm->def->cpu->mode == VIR_CPU_MODE_HOST_MODEL) { + if (!(host = virCPUCopyMigratable(caps->host.cpu->arch, caps->host.cpu))) + goto cleanup; + + if (virCPUUpdate(vm->def->os.arch, vm->def->cpu, host) < 0) + goto cleanup; + + if (qemuProcessUpdateCPU(driver, vm, QEMU_ASYNC_JOB_NONE) < 0) + goto cleanup; + } + + ret = 0; + + cleanup: + virCPUDefFree(host); + virObjectUnref(caps); + return ret; +} + + struct qemuProcessReconnectData { virConnectPtr conn; virQEMUDriverPtr driver; @@ -6820,29 +6863,8 @@ 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 (qemuProcessRefreshCPU(driver, obj) < 0) + goto error; if (qemuDomainRefreshVcpuInfo(driver, obj, QEMU_ASYNC_JOB_NONE, true) < 0) goto error; -- 2.15.0