diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 93a24cde15..a0f430f89f 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3853,6 +3853,30 @@ qemuProcessUpdateAndVerifyCPU(virQEMUDriverPtr driver, } +static virDomainCapsCPUModelsPtr +qemuProcessFetchCPUDefinitions(virQEMUDriverPtr driver, + virDomainObjPtr vm, + qemuDomainAsyncJob asyncJob) +{ + qemuDomainObjPrivatePtr priv = vm->privateData; + virDomainCapsCPUModelsPtr models = NULL; + + if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0) + goto error; + + models = virQEMUCapsFetchCPUDefinitions(priv->mon); + + if (qemuDomainObjExitMonitor(driver, vm) < 0) + goto error; + + return models; + + error: + virObjectUnref(models); + return NULL; +} + + static int qemuProcessUpdateCPU(virQEMUDriverPtr driver, virDomainObjPtr vm, @@ -3860,6 +3884,7 @@ qemuProcessUpdateCPU(virQEMUDriverPtr driver, { virCPUDataPtr cpu = NULL; virCPUDataPtr disabled = NULL; + virDomainCapsCPUModelsPtr models = NULL; int ret = -1; if (qemuProcessFetchGuestCPU(driver, vm, asyncJob, &cpu, &disabled) < 0) @@ -3868,11 +3893,16 @@ qemuProcessUpdateCPU(virQEMUDriverPtr driver, if (qemuProcessUpdateLiveGuestCPU(vm, cpu, disabled) < 0) goto cleanup; + if (!(models = qemuProcessFetchCPUDefinitions(driver, vm, asyncJob)) || + virCPUTranslate(vm->def->os.arch, vm->def->cpu, models) < 0) + goto cleanup; + ret = 0; cleanup: virCPUDataFree(cpu); virCPUDataFree(disabled); + virObjectUnref(models); return ret; }