mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
qemu: Make sure host-model uses CPU model supported by QEMU
When reconnecting to a running domain started by old libvirt, which did not change host-model into a custom CPU definition, we replace the CPU definition with a specific CPU model from host capabilities. However, that CPU model may not be supported by the running qemu process. We need to translate the CPU model to one of the models which libvirt could have used when starting the domain. https://bugzilla.redhat.com/show_bug.cgi?id=1521202 Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
This commit is contained in:
parent
4486dcdb4a
commit
ce73de441d
@ -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
|
static int
|
||||||
qemuProcessUpdateCPU(virQEMUDriverPtr driver,
|
qemuProcessUpdateCPU(virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm,
|
virDomainObjPtr vm,
|
||||||
@ -3860,6 +3884,7 @@ qemuProcessUpdateCPU(virQEMUDriverPtr driver,
|
|||||||
{
|
{
|
||||||
virCPUDataPtr cpu = NULL;
|
virCPUDataPtr cpu = NULL;
|
||||||
virCPUDataPtr disabled = NULL;
|
virCPUDataPtr disabled = NULL;
|
||||||
|
virDomainCapsCPUModelsPtr models = NULL;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
if (qemuProcessFetchGuestCPU(driver, vm, asyncJob, &cpu, &disabled) < 0)
|
if (qemuProcessFetchGuestCPU(driver, vm, asyncJob, &cpu, &disabled) < 0)
|
||||||
@ -3868,11 +3893,16 @@ qemuProcessUpdateCPU(virQEMUDriverPtr driver,
|
|||||||
if (qemuProcessUpdateLiveGuestCPU(vm, cpu, disabled) < 0)
|
if (qemuProcessUpdateLiveGuestCPU(vm, cpu, disabled) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
if (!(models = qemuProcessFetchCPUDefinitions(driver, vm, asyncJob)) ||
|
||||||
|
virCPUTranslate(vm->def->os.arch, vm->def->cpu, models) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
virCPUDataFree(cpu);
|
virCPUDataFree(cpu);
|
||||||
virCPUDataFree(disabled);
|
virCPUDataFree(disabled);
|
||||||
|
virObjectUnref(models);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user