mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-24 21:45:21 +00:00
PowerPC : Add support for launching VM in 'compat' mode.
PowerISA allows processors to run VMs in binary compatibility ("compat") mode supporting an older version of ISA. QEMU has recently added support to explicitly denote a VM running in compatibility mode through commit 6d9412ea & 8dfa3a5e85. Now, a "compat" mode VM can be run by invoking this qemu commandline on a POWER8 host: -cpu host,compat=power7. This patch allows libvirt to exploit cpu mode 'host-model' to describe this new mode for PowerKVM guests. For example, when a user wants to request a power7 vm to run in compatibility mode on a Power8 host, this can be described in XML as follows : <cpu mode='host-model'> <model>power7</model> </cpu> Signed-off-by: Prerna Saxena <prerna@linux.vnet.ibm.com> Signed-off-by: Li Zhang <zhlcindy@linux.vnet.ibm.com> Signed-off-by: Pradipta Kr. Banerjee <bpradip@in.ibm.com> Acked-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
da636d83dc
commit
addce06c92
@ -619,6 +619,7 @@ virCPUDefFormatBuf(virBufferPtr buf,
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
formatModel = (def->mode == VIR_CPU_MODE_CUSTOM ||
|
formatModel = (def->mode == VIR_CPU_MODE_CUSTOM ||
|
||||||
|
def->mode == VIR_CPU_MODE_HOST_MODEL ||
|
||||||
(flags & VIR_DOMAIN_XML_UPDATE_CPU));
|
(flags & VIR_DOMAIN_XML_UPDATE_CPU));
|
||||||
formatFallback = (def->type == VIR_CPU_TYPE_GUEST &&
|
formatFallback = (def->type == VIR_CPU_TYPE_GUEST &&
|
||||||
(def->mode == VIR_CPU_MODE_HOST_MODEL ||
|
(def->mode == VIR_CPU_MODE_HOST_MODEL ||
|
||||||
|
@ -562,8 +562,8 @@ ppcUpdate(virCPUDefPtr guest,
|
|||||||
static virCPUDefPtr
|
static virCPUDefPtr
|
||||||
ppcBaseline(virCPUDefPtr *cpus,
|
ppcBaseline(virCPUDefPtr *cpus,
|
||||||
unsigned int ncpus,
|
unsigned int ncpus,
|
||||||
const char **models,
|
const char **models ATTRIBUTE_UNUSED,
|
||||||
unsigned int nmodels,
|
unsigned int nmodels ATTRIBUTE_UNUSED,
|
||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
struct ppc_map *map = NULL;
|
struct ppc_map *map = NULL;
|
||||||
@ -583,13 +583,6 @@ ppcBaseline(virCPUDefPtr *cpus,
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!cpuModelIsAllowed(model->name, models, nmodels)) {
|
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
|
||||||
_("CPU model %s is not supported by hypervisor"),
|
|
||||||
model->name);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < ncpus; i++) {
|
for (i = 0; i < ncpus; i++) {
|
||||||
const struct ppc_vendor *vnd;
|
const struct ppc_vendor *vnd;
|
||||||
|
|
||||||
|
@ -6226,7 +6226,9 @@ qemuBuildCpuModelArgStr(virQEMUDriverPtr driver,
|
|||||||
*hasHwVirt = hasSVM > 0 ? true : false;
|
*hasHwVirt = hasSVM > 0 ? true : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cpu->mode == VIR_CPU_MODE_HOST_PASSTHROUGH) {
|
if ((cpu->mode == VIR_CPU_MODE_HOST_PASSTHROUGH) ||
|
||||||
|
((cpu->mode == VIR_CPU_MODE_HOST_MODEL) &&
|
||||||
|
ARCH_IS_PPC64(def->os.arch))) {
|
||||||
const char *mode = virCPUModeTypeToString(cpu->mode);
|
const char *mode = virCPUModeTypeToString(cpu->mode);
|
||||||
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CPU_HOST)) {
|
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CPU_HOST)) {
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
@ -6241,6 +6243,12 @@ qemuBuildCpuModelArgStr(virQEMUDriverPtr driver,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
virBufferAddLit(buf, "host");
|
virBufferAddLit(buf, "host");
|
||||||
|
|
||||||
|
if (ARCH_IS_PPC64(def->os.arch) &&
|
||||||
|
cpu->mode == VIR_CPU_MODE_HOST_MODEL) {
|
||||||
|
virBufferAsprintf(buf, ",compat=%s", def->cpu->model);
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (VIR_ALLOC(guest) < 0)
|
if (VIR_ALLOC(guest) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user