]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
PowerPC : Add support for launching VM in 'compat' mode.
authorPrerna Saxena <prerna@linux.vnet.ibm.com>
Tue, 4 Nov 2014 17:22:44 +0000 (22:52 +0530)
committerMichal Privoznik <mprivozn@redhat.com>
Fri, 7 Nov 2014 08:18:50 +0000 (09:18 +0100)
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>
src/conf/cpu_conf.c
src/cpu/cpu_powerpc.c
src/qemu/qemu_command.c

index 5475c073d305139c39ada40a5304eeb17d7ba2cd..1c74c666a1f3bc7ef0d971b2a8c234e005d37220 100644 (file)
@@ -619,6 +619,7 @@ virCPUDefFormatBuf(virBufferPtr buf,
         return 0;
 
     formatModel = (def->mode == VIR_CPU_MODE_CUSTOM ||
+                   def->mode == VIR_CPU_MODE_HOST_MODEL ||
                    (flags & VIR_DOMAIN_XML_UPDATE_CPU));
     formatFallback = (def->type == VIR_CPU_TYPE_GUEST &&
                       (def->mode == VIR_CPU_MODE_HOST_MODEL ||
index d591c184ab8d4e8bf45a27bb46dc163601c85a86..4ea1835d52640bca0930536c3610f7584f6eec33 100644 (file)
@@ -562,8 +562,8 @@ ppcUpdate(virCPUDefPtr guest,
 static virCPUDefPtr
 ppcBaseline(virCPUDefPtr *cpus,
             unsigned int ncpus,
-            const char **models,
-            unsigned int nmodels,
+            const char **models ATTRIBUTE_UNUSED,
+            unsigned int nmodels ATTRIBUTE_UNUSED,
             unsigned int flags)
 {
     struct ppc_map *map = NULL;
@@ -583,13 +583,6 @@ ppcBaseline(virCPUDefPtr *cpus,
         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++) {
         const struct ppc_vendor *vnd;
 
index bd56b05c9d394577b82f7dc93a0c26f13f4e7c41..e031dca0b792c6cbee7cc45f4aede9ca0ba94a67 100644 (file)
@@ -6226,7 +6226,9 @@ qemuBuildCpuModelArgStr(virQEMUDriverPtr driver,
         *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);
         if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CPU_HOST)) {
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
@@ -6241,6 +6243,12 @@ qemuBuildCpuModelArgStr(virQEMUDriverPtr driver,
             goto cleanup;
         }
         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 {
         if (VIR_ALLOC(guest) < 0)
             goto cleanup;