[libvirt] [PATCH 2/4] PowerPC : Add support for launching VMs in 'compat' mode.

Prerna Saxena prerna at linux.vnet.ibm.com
Fri Oct 10 10:12:41 UTC 2014


>From 7228aacaa4b24907b1cbf33838ada8fb81890419 Mon Sep 17 00:00:00 2001
From: Prerna Saxena <prerna at linux.vnet.ibm.com>
Date: Tue, 7 Oct 2014 10:53:08 +0530

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 extend the "fallback" semantics of cpu model to
describe this new mode for PowerKVM guests.
As an 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='custom' match='exact'>
    <model fallback='compat'>power7</model>
  </cpu>

This has been introduced as a new mode since the behaviour of a guest in
compat mode is different from running natively on an older PowerISA.

Also, checks to cpuModelIsAllowed() have been removed, since QEMU for
PowerKVM no longer supports specifying a non-host CPU model using
'-cpu XXX'.

Signed-off-by: Prerna Saxena <prerna at linux.vnet.ibm.com>
Signed-off-by: Li Zhang <zhlcindy at linux.vnet.ibm.com>
Signed-off-by: Pradipta Kr. Banerjee <bpradip at in.ibm.com>
---
 docs/schemas/domaincommon.rng |  1 +
 src/conf/cpu_conf.c           |  3 ++-
 src/conf/cpu_conf.h           |  1 +
 src/cpu/cpu_powerpc.c         | 22 ++++------------------
 src/qemu/qemu_command.c       | 13 +++++++++++--
 5 files changed, 19 insertions(+), 21 deletions(-)

diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 20d81ae..ebab482 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -4067,6 +4067,7 @@
           <choice>
             <value>allow</value>
             <value>forbid</value>
+            <value>compat</value>
           </choice>
         </attribute>
       </optional>
diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c
index 9b7fbb0..32fd54f 100644
--- a/src/conf/cpu_conf.c
+++ b/src/conf/cpu_conf.c
@@ -47,7 +47,8 @@ VIR_ENUM_IMPL(virCPUMatch, VIR_CPU_MATCH_LAST,
 
 VIR_ENUM_IMPL(virCPUFallback, VIR_CPU_FALLBACK_LAST,
               "allow",
-              "forbid")
+              "forbid",
+              "compat")
 
 VIR_ENUM_IMPL(virCPUFeaturePolicy, VIR_CPU_FEATURE_LAST,
               "force",
diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h
index d45210b..69d8584 100644
--- a/src/conf/cpu_conf.h
+++ b/src/conf/cpu_conf.h
@@ -65,6 +65,7 @@ VIR_ENUM_DECL(virCPUMatch)
 typedef enum {
     VIR_CPU_FALLBACK_ALLOW,
     VIR_CPU_FALLBACK_FORBID,
+    VIR_CPU_FALLBACK_COMPAT,
 
     VIR_CPU_FALLBACK_LAST
 } virCPUFallback;
diff --git a/src/cpu/cpu_powerpc.c b/src/cpu/cpu_powerpc.c
index d591c18..9ab33c2 100644
--- a/src/cpu/cpu_powerpc.c
+++ b/src/cpu/cpu_powerpc.c
@@ -458,8 +458,8 @@ ppcCompare(virCPUDefPtr host,
 static int
 ppcDecode(virCPUDefPtr cpu,
           const virCPUData *data,
-          const char **models,
-          unsigned int nmodels,
+          const char **models ATTRIBUTE_UNUSED,
+          unsigned int nmodels ATTRIBUTE_UNUSED,
           const char *preferred ATTRIBUTE_UNUSED,
           unsigned int flags)
 {
@@ -479,13 +479,6 @@ ppcDecode(virCPUDefPtr cpu,
         goto cleanup;
     }
 
-    if (!cpuModelIsAllowed(model->name, models, nmodels)) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                       _("CPU model %s is not supported by hypervisor"),
-                       model->name);
-        goto cleanup;
-    }
-
     if (VIR_STRDUP(cpu->model, model->name) < 0 ||
         (model->vendor && VIR_STRDUP(cpu->vendor, model->vendor->name) < 0)) {
         goto cleanup;
@@ -562,8 +555,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 +576,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;
 
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 80ec9e8..74dc9d2 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -6221,7 +6221,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,
@@ -6260,7 +6262,14 @@ qemuBuildCpuModelArgStr(virQEMUDriverPtr driver,
                 goto cleanup;
         }
 
-        virBufferAdd(buf, guest->model, -1);
+        if (ARCH_IS_PPC64(def->os.arch) &&
+            cpu->fallback == VIR_CPU_FALLBACK_COMPAT) {
+            virBufferAddLit(buf, "host");
+            virBufferAsprintf(buf, ",compat=%s", guest->model);
+        } else {
+            virBufferAdd(buf, guest->model, -1);
+        }
+
         if (guest->vendor_id)
             virBufferAsprintf(buf, ",vendor=%s", guest->vendor_id);
         for (i = 0; i < guest->nfeatures; i++) {
-- 
1.8.3.1

-- 
Prerna Saxena

Linux Technology Centre,
IBM Systems and Technology Lab,
Bangalore, India




More information about the libvir-list mailing list