[PATCH v2 3/6] Add support for cpu mode attribute

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The mode can be either of "custom" (default), "host-model",
"host-passthrough". The semantics of each mode is described in the
following examples:

- guest CPU is a default model with specified topology:
    <cpu>
      <topology sockets='1' cores='2' threads='1'/>
    </cpu>

- guest CPU matches selected model:
    <cpu mode='custom' match='exact'>
      <model>core2duo</model>
    </cpu>

- guest CPU should be a copy of host CPU as advertised by capabilities
  XML (this is a short cut for manually copying host CPU specification
  from capabilities to domain XML):
    <cpu mode='host-model'/>

  In case a hypervisor does not support the exact host model, libvirt
  automatically falls back to a closest supported CPU model and
  removes/adds features to match host. This behavior can be disabled by
    <cpu mode='host-model'>
      <model fallback='forbid'/>
    </cpu>

- the same as previous returned by virDomainGetXMLDesc with
  VIR_DOMAIN_XML_UPDATE_CPU flag:
    <cpu mode='host-model' match='exact'>
      <model fallback='allow'>Penryn</model>       --+
      <vendor>Intel</vendor>                         |
      <topology sockets='2' cores='4' threads='1'/>  + copied from
      <feature policy='require' name='dca'/>         | capabilities XML
      <feature policy='require' name='xtpr'/>        |
      ...                                          --+
    </cpu>

- guest CPU should be exactly the same as host CPU even in the aspects
  libvirt doesn't model (such domain cannot be migrated unless both
  hosts contain exactly the same CPUs):
    <cpu mode='host-passthrough'/>

- the same as previous returned by virDomainGetXMLDesc with
  VIR_DOMAIN_XML_UPDATE_CPU flag:
    <cpu mode='host-passthrough' match='minimal'>
      <model>Penryn</model>                        --+ copied from caps
      <vendor>Intel</vendor>                         | XML but doesn't
      <topology sockets='2' cores='4' threads='1'/>  | describe all
      <feature policy='require' name='dca'/>         | aspects of the
      <feature policy='require' name='xtpr'/>        | actual guest CPU
      ...                                          --+
    </cpu>
---
Notes:
    Version 2:
    - added documentation
    - fixed XML examples and schema

 docs/formatdomain.html.in                          |   51 +++++++
 docs/schemas/domaincommon.rng                      |   29 ++++-
 src/conf/capabilities.c                            |    2 +-
 src/conf/cpu_conf.c                                |  159 ++++++++++++++------
 src/conf/cpu_conf.h                                |   20 ++-
 src/conf/domain_conf.c                             |    2 +-
 src/cpu/cpu.c                                      |    2 +-
 tests/cputest.c                                    |    2 +-
 tests/cputestdata/x86-baseline-1-result.xml        |    2 +-
 tests/cputestdata/x86-baseline-2-result.xml        |    2 +-
 .../cputestdata/x86-baseline-no-vendor-result.xml  |    2 +-
 .../x86-baseline-some-vendors-result.xml           |    2 +-
 .../cputestdata/x86-host+guest,model486-result.xml |    2 +-
 .../x86-host+guest,models,Penryn-result.xml        |    2 +-
 .../x86-host+guest,models,qemu64-result.xml        |    2 +-
 tests/cputestdata/x86-host+guest,models-result.xml |    2 +-
 tests/cputestdata/x86-host+guest-result.xml        |    2 +-
 tests/cputestdata/x86-host+guest.xml               |    2 +-
 tests/cputestdata/x86-host+min.xml                 |    2 +-
 .../cputestdata/x86-host+nehalem-force-result.xml  |    2 +-
 tests/cputestdata/x86-host+pentium3.xml            |    2 +-
 .../x86-host+strict-force-extra-result.xml         |    2 +-
 .../x86-host-better+pentium3,core2duo-result.xml   |    2 +-
 .../x86-host-better+pentium3,pentium3-result.xml   |    2 +-
 .../x86-host-better+pentium3-result.xml            |    2 +-
 tests/cputestdata/x86-host-worse+guest-result.xml  |    2 +-
 .../qemuxml2xmlout-graphics-spice-timeout.xml      |    2 +-
 tests/testutilsqemu.c                              |    1 +
 28 files changed, 236 insertions(+), 70 deletions(-)

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 8961fed..bdb182d 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -566,6 +566,17 @@
   &lt;/cpu&gt;
   ...</pre>
 
+<pre>
+  &lt;cpu mode='host-model'&gt;
+    &lt;model fallback='forbid'/&gt;
+    &lt;topology sockets='1' cores='2' threads='1'/&gt;
+  &lt;/cpu&gt;
+  ...</pre>
+
+<pre>
+  &lt;cpu mode='host-passthrough'/&gt;
+  ...</pre>
+
     <p>
       In case no restrictions need to be put on CPU model and its features, a
       simpler <code>cpu</code> element can be used.
@@ -603,6 +614,46 @@
 
         <span class="since">Since 0.8.5</span> the <code>match</code>
         attribute can be omitted and will default to <code>exact</code>.
+
+        <span class="since">Since 0.9.10</span>, an optional <code>mode</code>
+        attribute may be used to make it easier to configure a guest CPU to be
+        as close to host CPU as possible. Possible values for the
+        <code>mode</code> attribute are:
+
+        <dl>
+          <dt><code>custom</code></dt>
+          <dd>In this mode, the <code>cpu</code> element describes the CPU
+          that should be presented to the guest. This is the default value
+          when no <code>mode</code> attribute is specified.</dd>
+          <dt><code>host-model</code></dt>
+          <dd>The <code>host-model</code> mode is essentially a shortcut to
+          copying host CPU definition from capabilities XML into domain XML.
+          Since the CPU definition is copied just before starting a domain,
+          exactly the same XML can be used on different hosts while still
+          providing the best guest CPU each host supports. Neither
+          <code>match</code> attribute nor any <code>feature</code> elements
+          can be used in this mode. Specifying CPU model is not supported
+          either, but <code>model</code>'s <code>fallback</code> attribute may
+          still be used. Libvirt does not model every aspect of each CPU so
+          the guest CPU will not match the host CPU exactly. On the other
+          hand, the ABI provided to the guest is reproducible. During
+          migration, complete CPU model definition is transferred to the
+          destination host so the migrated guest will see exactly the same CPU
+          model even if the destination host contains more capable CPUs.</dd>
+          <dt><code>host-passthrough</code></dt>
+          <dd>With this mode, the CPU visible to the guest should be exactly
+          the same as the host CPU even in the aspects that libvirt does not
+          understand. Though the downside of this mode is that the guest
+          environment cannot be reproduced on different hardware. Thus, if you
+          hit any bugs, you are on your own. Neither <code>model</code> nor
+          <code>feature</code> elements are allowed in this mode.</dd>
+        </dl>
+
+        In both <code>host-model</code> and <code>host-passthrough</code>
+        mode, the real (approximate in <code>host-passthrough</code> mode) CPU
+        definition which would be used on current host can be determined by
+        specifying <code>VIR_DOMAIN_XML_UPDATE_CPU</code> flag when calling
+        <code>virDomainGetXMLDesc</code> API.
       </dd>
 
       <dt><code>model</code></dt>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index a3ad3d3..d8eacf8 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -2426,6 +2426,20 @@
           </interleave>
         </group>
         <group>
+          <ref name="cpuMode"/>
+          <interleave>
+            <optional>
+              <ref name="cpuModel"/>
+            </optional>
+            <optional>
+              <ref name="cpuNuma"/>
+            </optional>
+          </interleave>
+        </group>
+        <group>
+          <optional>
+            <ref name="cpuMode"/>
+          </optional>
           <ref name="cpuMatch"/>
           <interleave>
             <ref name="cpuModel"/>
@@ -2447,6 +2461,16 @@
     </element>
   </define>
 
+  <define name="cpuMode">
+    <attribute name="mode">
+      <choice>
+        <value>custom</value>
+        <value>host-model</value>
+        <value>host-passthrough</value>
+      </choice>
+    </attribute>
+  </define>
+
   <define name="cpuMatch">
     <attribute name="match">
       <choice>
@@ -2467,7 +2491,10 @@
           </choice>
         </attribute>
       </optional>
-      <text/>
+      <choice>
+        <text/>
+        <empty/>
+      </choice>
     </element>
   </define>
 
diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c
index ac050df..ed0ae99 100644
--- a/src/conf/capabilities.c
+++ b/src/conf/capabilities.c
@@ -691,7 +691,7 @@ virCapabilitiesFormatXML(virCapsPtr caps)
     }
 
     virBufferAdjustIndent(&xml, 6);
-    virCPUDefFormatBuf(&xml, caps->host.cpu);
+    virCPUDefFormatBuf(&xml, caps->host.cpu, 0);
     virBufferAdjustIndent(&xml, -6);
 
     virBufferAddLit(&xml, "    </cpu>\n");
diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c
index c8e29e4..31862e2 100644
--- a/src/conf/cpu_conf.c
+++ b/src/conf/cpu_conf.c
@@ -39,6 +39,11 @@
 VIR_ENUM_IMPL(virCPU, VIR_CPU_TYPE_LAST,
               "host", "guest", "auto")
 
+VIR_ENUM_IMPL(virCPUMode, VIR_CPU_MODE_LAST,
+              "custom",
+              "host-model",
+              "host-passthrough")
+
 VIR_ENUM_IMPL(virCPUMatch, VIR_CPU_MATCH_LAST,
               "minimum",
               "exact",
@@ -100,6 +105,7 @@ virCPUDefCopy(const virCPUDefPtr cpu)
     copy->nfeatures_max = cpu->nfeatures;
 
     copy->type = cpu->type;
+    copy->mode = cpu->mode;
     copy->match = cpu->match;
     copy->fallback = cpu->fallback;
     copy->sockets = cpu->sockets;
@@ -151,6 +157,7 @@ virCPUDefParseXML(const xmlNodePtr node,
     xmlNodePtr *nodes = NULL;
     int n;
     unsigned int i;
+    char *cpuMode;
 
     if (!xmlStrEqual(node->name, BAD_CAST "cpu")) {
         virCPUReportError(VIR_ERR_INTERNAL_ERROR,
@@ -173,10 +180,35 @@ virCPUDefParseXML(const xmlNodePtr node,
                 goto error;
             }
             def->type = VIR_CPU_TYPE_HOST;
-        } else
+        } else {
             def->type = VIR_CPU_TYPE_GUEST;
-    } else
+        }
+    } else {
         def->type = mode;
+    }
+
+    if ((cpuMode = virXMLPropString(node, "mode"))) {
+        if (def->type == VIR_CPU_TYPE_HOST) {
+            VIR_FREE(cpuMode);
+            virCPUReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                              _("Attribute mode is only allowed for guest CPU"));
+            goto error;
+        } else {
+            def->mode = virCPUModeTypeFromString(cpuMode);
+            VIR_FREE(cpuMode);
+
+            if (def->mode < 0) {
+                virCPUReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                                  _("Invalid mode attribute"));
+                goto error;
+            }
+        }
+    } else {
+        if (def->type == VIR_CPU_TYPE_HOST)
+            def->mode = -1;
+        else
+            def->mode = VIR_CPU_MODE_CUSTOM;
+    }
 
     if (def->type == VIR_CPU_TYPE_GUEST) {
         char *match = virXMLPropString(node, "match");
@@ -214,7 +246,9 @@ virCPUDefParseXML(const xmlNodePtr node,
         goto error;
     }
 
-    if (def->model && def->type == VIR_CPU_TYPE_GUEST) {
+    if (def->type == VIR_CPU_TYPE_GUEST &&
+        def->mode != VIR_CPU_MODE_HOST_PASSTHROUGH &&
+        virXPathBoolean("boolean(./model[1]/@fallback)", ctxt)) {
         const char *fallback;
 
         fallback = virXPathString("string(./model[1]/@fallback)", ctxt);
@@ -311,9 +345,9 @@ virCPUDefParseXML(const xmlNodePtr node,
                         "%s", _("Invalid CPU feature policy"));
                 goto error;
             }
-        }
-        else
+        } else {
             policy = -1;
+        }
 
         if (!(name = virXMLPropString(nodes[i], "name")) || *name == 0) {
             VIR_FREE(name);
@@ -407,11 +441,12 @@ error:
 
 
 char *
-virCPUDefFormat(virCPUDefPtr def)
+virCPUDefFormat(virCPUDefPtr def,
+                unsigned int flags)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
 
-    if (virCPUDefFormatBufFull(&buf, def) < 0)
+    if (virCPUDefFormatBufFull(&buf, def, flags) < 0)
         goto cleanup;
 
     if (virBufferError(&buf))
@@ -429,29 +464,44 @@ cleanup:
 
 int
 virCPUDefFormatBufFull(virBufferPtr buf,
-                       virCPUDefPtr def)
+                       virCPUDefPtr def,
+                       unsigned int flags)
 {
     if (!def)
         return 0;
 
-    if (def->type == VIR_CPU_TYPE_GUEST && def->model) {
-        const char *match;
-        if (!(match = virCPUMatchTypeToString(def->match))) {
-            virCPUReportError(VIR_ERR_INTERNAL_ERROR,
-                              _("Unexpected CPU match policy %d"), def->match);
-            return -1;
+    virBufferAddLit(buf, "<cpu");
+    if (def->type == VIR_CPU_TYPE_GUEST) {
+        const char *tmp;
+
+        if (def->mode != VIR_CPU_MODE_CUSTOM || def->model) {
+            if (!(tmp = virCPUModeTypeToString(def->mode))) {
+                virCPUReportError(VIR_ERR_INTERNAL_ERROR,
+                                  _("Unexpected CPU mode %d"), def->mode);
+                return -1;
+            }
+            virBufferAsprintf(buf, " mode='%s'", tmp);
         }
 
-        virBufferAsprintf(buf, "<cpu match='%s'>\n", match);
-    } else {
-        virBufferAddLit(buf, "<cpu>\n");
+        if (def->model &&
+            (def->mode == VIR_CPU_MODE_CUSTOM ||
+             (flags & VIR_DOMAIN_XML_UPDATE_CPU))) {
+            if (!(tmp = virCPUMatchTypeToString(def->match))) {
+                virCPUReportError(VIR_ERR_INTERNAL_ERROR,
+                                  _("Unexpected CPU match policy %d"),
+                                  def->match);
+                return -1;
+            }
+            virBufferAsprintf(buf, " match='%s'", tmp);
+        }
     }
+    virBufferAddLit(buf, ">\n");
 
     if (def->arch)
         virBufferAsprintf(buf, "  <arch>%s</arch>\n", def->arch);
 
     virBufferAdjustIndent(buf, 2);
-    if (virCPUDefFormatBuf(buf, def) < 0)
+    if (virCPUDefFormatBuf(buf, def, flags) < 0)
         return -1;
     virBufferAdjustIndent(buf, -2);
 
@@ -462,22 +512,31 @@ virCPUDefFormatBufFull(virBufferPtr buf,
 
 int
 virCPUDefFormatBuf(virBufferPtr buf,
-                   virCPUDefPtr def)
+                   virCPUDefPtr def,
+                   unsigned int flags)
 {
     unsigned int i;
+    bool formatModel;
+    bool formatFallback;
 
     if (!def)
         return 0;
 
+    formatModel = (def->mode == VIR_CPU_MODE_CUSTOM ||
+                   (flags & VIR_DOMAIN_XML_UPDATE_CPU));
+    formatFallback = (def->type == VIR_CPU_TYPE_GUEST &&
+                      (def->mode == VIR_CPU_MODE_HOST_MODEL ||
+                       (def->mode == VIR_CPU_MODE_CUSTOM && def->model)));
+
     if (!def->model && def->nfeatures) {
         virCPUReportError(VIR_ERR_INTERNAL_ERROR,
                 "%s", _("Non-empty feature list specified without CPU model"));
         return -1;
     }
 
-    if (def->model) {
+    if ((formatModel && def->model) || formatFallback) {
         virBufferAddLit(buf, "<model");
-        if (def->type == VIR_CPU_TYPE_GUEST) {
+        if (formatFallback) {
             const char *fallback;
 
             fallback = virCPUFallbackTypeToString(def->fallback);
@@ -489,12 +548,15 @@ virCPUDefFormatBuf(virBufferPtr buf,
             }
             virBufferAsprintf(buf, " fallback='%s'", fallback);
         }
-        virBufferAsprintf(buf, ">%s</model>\n", def->model);
+        if (formatModel && def->model) {
+            virBufferAsprintf(buf, ">%s</model>\n", def->model);
+        } else {
+            virBufferAddLit(buf, "/>\n");
+        }
     }
 
-    if (def->vendor) {
+    if (formatModel && def->vendor)
         virBufferAsprintf(buf, "<vendor>%s</vendor>\n", def->vendor);
-    }
 
     if (def->sockets && def->cores && def->threads) {
         virBufferAddLit(buf, "<topology");
@@ -504,29 +566,32 @@ virCPUDefFormatBuf(virBufferPtr buf,
         virBufferAddLit(buf, "/>\n");
     }
 
-    for (i = 0 ; i < def->nfeatures ; i++) {
-        virCPUFeatureDefPtr feature = def->features + i;
+    if (formatModel) {
+        for (i = 0 ; i < def->nfeatures ; i++) {
+            virCPUFeatureDefPtr feature = def->features + i;
 
-        if (!feature->name) {
-            virCPUReportError(VIR_ERR_INTERNAL_ERROR,
-                    "%s", _("Missing CPU feature name"));
-            return -1;
-        }
-
-        if (def->type == VIR_CPU_TYPE_GUEST) {
-            const char *policy;
-
-            policy = virCPUFeaturePolicyTypeToString(feature->policy);
-            if (!policy) {
+            if (!feature->name) {
                 virCPUReportError(VIR_ERR_INTERNAL_ERROR,
-                        _("Unexpected CPU feature policy %d"), feature->policy);
+                        "%s", _("Missing CPU feature name"));
                 return -1;
             }
-            virBufferAsprintf(buf, "<feature policy='%s' name='%s'/>\n",
-                              policy, feature->name);
-        } else {
-            virBufferAsprintf(buf, "<feature name='%s'/>\n",
-                              feature->name);
+
+            if (def->type == VIR_CPU_TYPE_GUEST) {
+                const char *policy;
+
+                policy = virCPUFeaturePolicyTypeToString(feature->policy);
+                if (!policy) {
+                    virCPUReportError(VIR_ERR_INTERNAL_ERROR,
+                                      _("Unexpected CPU feature policy %d"),
+                                      feature->policy);
+                    return -1;
+                }
+                virBufferAsprintf(buf, "<feature policy='%s' name='%s'/>\n",
+                                  policy, feature->name);
+            } else {
+                virBufferAsprintf(buf, "<feature name='%s'/>\n",
+                                  feature->name);
+            }
         }
     }
 
@@ -603,6 +668,14 @@ virCPUDefIsEqual(virCPUDefPtr src,
         goto cleanup;
     }
 
+    if (src->mode != dst->mode) {
+        virCPUReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                          _("Target CPU mode %s does not match source %s"),
+                          virCPUModeTypeToString(dst->mode),
+                          virCPUModeTypeToString(src->mode));
+        goto cleanup;
+    }
+
     if (STRNEQ_NULLABLE(src->arch, dst->arch)) {
         virCPUReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                           _("Target CPU arch %s does not match source %s"),
diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h
index 0c50f90..4b0b35b 100644
--- a/src/conf/cpu_conf.h
+++ b/src/conf/cpu_conf.h
@@ -38,6 +38,16 @@ enum virCPUType {
 
 VIR_ENUM_DECL(virCPU)
 
+enum virCPUMode {
+    VIR_CPU_MODE_CUSTOM,
+    VIR_CPU_MODE_HOST_MODEL,
+    VIR_CPU_MODE_HOST_PASSTHROUGH,
+
+    VIR_CPU_MODE_LAST
+};
+
+VIR_ENUM_DECL(virCPUMode)
+
 enum virCPUMatch {
     VIR_CPU_MATCH_MINIMUM,
     VIR_CPU_MATCH_EXACT,
@@ -89,6 +99,7 @@ typedef struct _virCPUDef virCPUDef;
 typedef virCPUDef *virCPUDefPtr;
 struct _virCPUDef {
     int type;           /* enum virCPUType */
+    int mode;           /* enum virCPUMode */
     int match;          /* enum virCPUMatch */
     char *arch;
     char *model;
@@ -123,14 +134,17 @@ virCPUDefIsEqual(virCPUDefPtr src,
                  virCPUDefPtr dst);
 
 char *
-virCPUDefFormat(virCPUDefPtr def);
+virCPUDefFormat(virCPUDefPtr def,
+                unsigned int flags);
 
 int
 virCPUDefFormatBuf(virBufferPtr buf,
-                   virCPUDefPtr def);
+                   virCPUDefPtr def,
+                   unsigned int flags);
 int
 virCPUDefFormatBufFull(virBufferPtr buf,
-                       virCPUDefPtr def);
+                       virCPUDefPtr def,
+                       unsigned int flags);
 
 int
 virCPUDefAddFeature(virCPUDefPtr cpu,
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 180dd2b..173351b 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -11639,7 +11639,7 @@ virDomainDefFormatInternal(virDomainDefPtr def,
     }
 
     virBufferAdjustIndent(buf, 2);
-    if (virCPUDefFormatBufFull(buf, def->cpu) < 0)
+    if (virCPUDefFormatBufFull(buf, def->cpu, flags) < 0)
         goto cleanup;
     virBufferAdjustIndent(buf, -2);
 
diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c
index e4149e2..1f39934 100644
--- a/src/cpu/cpu.c
+++ b/src/cpu/cpu.c
@@ -322,7 +322,7 @@ cpuBaselineXML(const char **xmlCPUs,
     if (!(cpu = cpuBaseline(cpus, ncpus, models, nmodels)))
         goto error;
 
-    cpustr = virCPUDefFormat(cpu);
+    cpustr = virCPUDefFormat(cpu, 0);
 
 cleanup:
     if (cpus) {
diff --git a/tests/cputest.c b/tests/cputest.c
index 2dd89f2..d8c1713 100644
--- a/tests/cputest.c
+++ b/tests/cputest.c
@@ -176,7 +176,7 @@ cpuTestCompareXML(const char *arch,
     if (virtTestLoadFile(xml, &expected) < 0)
         goto cleanup;
 
-    if (!(actual = virCPUDefFormat(cpu)))
+    if (!(actual = virCPUDefFormat(cpu, 0)))
         goto cleanup;
 
     if (STRNEQ(expected, actual)) {
diff --git a/tests/cputestdata/x86-baseline-1-result.xml b/tests/cputestdata/x86-baseline-1-result.xml
index 99e43d0..96c4f43 100644
--- a/tests/cputestdata/x86-baseline-1-result.xml
+++ b/tests/cputestdata/x86-baseline-1-result.xml
@@ -1,4 +1,4 @@
-<cpu match='exact'>
+<cpu mode='custom' match='exact'>
   <model fallback='allow'>Conroe</model>
   <vendor>Intel</vendor>
   <feature policy='disable' name='lahf_lm'/>
diff --git a/tests/cputestdata/x86-baseline-2-result.xml b/tests/cputestdata/x86-baseline-2-result.xml
index 76c13aa..a11352d 100644
--- a/tests/cputestdata/x86-baseline-2-result.xml
+++ b/tests/cputestdata/x86-baseline-2-result.xml
@@ -1,4 +1,4 @@
-<cpu match='exact'>
+<cpu mode='custom' match='exact'>
   <model fallback='allow'>core2duo</model>
   <feature policy='disable' name='nx'/>
 </cpu>
diff --git a/tests/cputestdata/x86-baseline-no-vendor-result.xml b/tests/cputestdata/x86-baseline-no-vendor-result.xml
index 8b97d2c..a14bb7e 100644
--- a/tests/cputestdata/x86-baseline-no-vendor-result.xml
+++ b/tests/cputestdata/x86-baseline-no-vendor-result.xml
@@ -1,4 +1,4 @@
-<cpu match='exact'>
+<cpu mode='custom' match='exact'>
   <model fallback='allow'>Opteron_G2</model>
   <feature policy='disable' name='svm'/>
   <feature policy='disable' name='rdtscp'/>
diff --git a/tests/cputestdata/x86-baseline-some-vendors-result.xml b/tests/cputestdata/x86-baseline-some-vendors-result.xml
index bac0e5d..2927611 100644
--- a/tests/cputestdata/x86-baseline-some-vendors-result.xml
+++ b/tests/cputestdata/x86-baseline-some-vendors-result.xml
@@ -1,3 +1,3 @@
-<cpu match='exact'>
+<cpu mode='custom' match='exact'>
   <model fallback='allow'>Opteron_G1</model>
 </cpu>
diff --git a/tests/cputestdata/x86-host+guest,model486-result.xml b/tests/cputestdata/x86-host+guest,model486-result.xml
index 9fd67eb..e21c8b8 100644
--- a/tests/cputestdata/x86-host+guest,model486-result.xml
+++ b/tests/cputestdata/x86-host+guest,model486-result.xml
@@ -1,4 +1,4 @@
-<cpu match='exact'>
+<cpu mode='custom' match='exact'>
   <arch>x86_64</arch>
   <model fallback='allow'>486</model>
   <feature policy='require' name='svm'/>
diff --git a/tests/cputestdata/x86-host+guest,models,Penryn-result.xml b/tests/cputestdata/x86-host+guest,models,Penryn-result.xml
index 9ae11c9..6a31dcd 100644
--- a/tests/cputestdata/x86-host+guest,models,Penryn-result.xml
+++ b/tests/cputestdata/x86-host+guest,models,Penryn-result.xml
@@ -1,4 +1,4 @@
-<cpu match='exact'>
+<cpu mode='custom' match='exact'>
   <arch>x86_64</arch>
   <model fallback='allow'>Nehalem</model>
   <feature policy='require' name='svm'/>
diff --git a/tests/cputestdata/x86-host+guest,models,qemu64-result.xml b/tests/cputestdata/x86-host+guest,models,qemu64-result.xml
index 7582ddc..1f15d6e 100644
--- a/tests/cputestdata/x86-host+guest,models,qemu64-result.xml
+++ b/tests/cputestdata/x86-host+guest,models,qemu64-result.xml
@@ -1,4 +1,4 @@
-<cpu match='exact'>
+<cpu mode='custom' match='exact'>
   <arch>x86_64</arch>
   <model fallback='allow'>qemu64</model>
   <feature policy='require' name='lahf_lm'/>
diff --git a/tests/cputestdata/x86-host+guest,models-result.xml b/tests/cputestdata/x86-host+guest,models-result.xml
index 9ae11c9..6a31dcd 100644
--- a/tests/cputestdata/x86-host+guest,models-result.xml
+++ b/tests/cputestdata/x86-host+guest,models-result.xml
@@ -1,4 +1,4 @@
-<cpu match='exact'>
+<cpu mode='custom' match='exact'>
   <arch>x86_64</arch>
   <model fallback='allow'>Nehalem</model>
   <feature policy='require' name='svm'/>
diff --git a/tests/cputestdata/x86-host+guest-result.xml b/tests/cputestdata/x86-host+guest-result.xml
index e596c43..9d37dec 100644
--- a/tests/cputestdata/x86-host+guest-result.xml
+++ b/tests/cputestdata/x86-host+guest-result.xml
@@ -1,4 +1,4 @@
-<cpu match='exact'>
+<cpu mode='custom' match='exact'>
   <arch>x86_64</arch>
   <model fallback='allow'>Penryn</model>
   <feature policy='require' name='svm'/>
diff --git a/tests/cputestdata/x86-host+guest.xml b/tests/cputestdata/x86-host+guest.xml
index 2a786fd..137a3d6 100644
--- a/tests/cputestdata/x86-host+guest.xml
+++ b/tests/cputestdata/x86-host+guest.xml
@@ -1,4 +1,4 @@
-<cpu match='exact'>
+<cpu mode='custom' match='exact'>
   <model fallback='allow'>Penryn</model>
   <topology sockets='2' cores='4' threads='1'/>
   <feature policy='require' name='dca'/>
diff --git a/tests/cputestdata/x86-host+min.xml b/tests/cputestdata/x86-host+min.xml
index fe55058..8101151 100644
--- a/tests/cputestdata/x86-host+min.xml
+++ b/tests/cputestdata/x86-host+min.xml
@@ -1,4 +1,4 @@
-<cpu match='exact'>
+<cpu mode='custom' match='exact'>
   <model fallback='allow'>Penryn</model>
   <feature policy='require' name='dca'/>
   <feature policy='require' name='xtpr'/>
diff --git a/tests/cputestdata/x86-host+nehalem-force-result.xml b/tests/cputestdata/x86-host+nehalem-force-result.xml
index 41e7356..000bc0d 100644
--- a/tests/cputestdata/x86-host+nehalem-force-result.xml
+++ b/tests/cputestdata/x86-host+nehalem-force-result.xml
@@ -1,4 +1,4 @@
-<cpu match='exact'>
+<cpu mode='custom' match='exact'>
   <arch>x86_64</arch>
   <model fallback='allow'>Nehalem</model>
 </cpu>
diff --git a/tests/cputestdata/x86-host+pentium3.xml b/tests/cputestdata/x86-host+pentium3.xml
index e122ba5..d46525c 100644
--- a/tests/cputestdata/x86-host+pentium3.xml
+++ b/tests/cputestdata/x86-host+pentium3.xml
@@ -1,4 +1,4 @@
-<cpu match='exact'>
+<cpu mode='custom' match='exact'>
   <model fallback='allow'>pentium3</model>
   <feature policy='require' name='lahf_lm'/>
   <feature policy='require' name='lm'/>
diff --git a/tests/cputestdata/x86-host+strict-force-extra-result.xml b/tests/cputestdata/x86-host+strict-force-extra-result.xml
index f3d52a1..68db412 100644
--- a/tests/cputestdata/x86-host+strict-force-extra-result.xml
+++ b/tests/cputestdata/x86-host+strict-force-extra-result.xml
@@ -1,4 +1,4 @@
-<cpu match='exact'>
+<cpu mode='custom' match='exact'>
   <arch>x86_64</arch>
   <model fallback='allow'>Penryn</model>
   <feature policy='require' name='3dnow'/>
diff --git a/tests/cputestdata/x86-host-better+pentium3,core2duo-result.xml b/tests/cputestdata/x86-host-better+pentium3,core2duo-result.xml
index 5d4528b..0c436d9 100644
--- a/tests/cputestdata/x86-host-better+pentium3,core2duo-result.xml
+++ b/tests/cputestdata/x86-host-better+pentium3,core2duo-result.xml
@@ -1,4 +1,4 @@
-<cpu match='exact'>
+<cpu mode='custom' match='exact'>
   <arch>x86_64</arch>
   <model fallback='allow'>core2duo</model>
   <feature policy='require' name='lahf_lm'/>
diff --git a/tests/cputestdata/x86-host-better+pentium3,pentium3-result.xml b/tests/cputestdata/x86-host-better+pentium3,pentium3-result.xml
index 1530a07..1e4f488 100644
--- a/tests/cputestdata/x86-host-better+pentium3,pentium3-result.xml
+++ b/tests/cputestdata/x86-host-better+pentium3,pentium3-result.xml
@@ -1,4 +1,4 @@
-<cpu match='exact'>
+<cpu mode='custom' match='exact'>
   <arch>x86_64</arch>
   <model fallback='allow'>pentium3</model>
   <feature policy='require' name='lahf_lm'/>
diff --git a/tests/cputestdata/x86-host-better+pentium3-result.xml b/tests/cputestdata/x86-host-better+pentium3-result.xml
index 917d63f..07be0f7 100644
--- a/tests/cputestdata/x86-host-better+pentium3-result.xml
+++ b/tests/cputestdata/x86-host-better+pentium3-result.xml
@@ -1,4 +1,4 @@
-<cpu match='exact'>
+<cpu mode='custom' match='exact'>
   <arch>x86_64</arch>
   <model fallback='allow'>Nehalem</model>
   <feature policy='require' name='dca'/>
diff --git a/tests/cputestdata/x86-host-worse+guest-result.xml b/tests/cputestdata/x86-host-worse+guest-result.xml
index 78e170a..441259f 100644
--- a/tests/cputestdata/x86-host-worse+guest-result.xml
+++ b/tests/cputestdata/x86-host-worse+guest-result.xml
@@ -1,4 +1,4 @@
-<cpu match='exact'>
+<cpu mode='custom' match='exact'>
   <arch>x86_64</arch>
   <model fallback='allow'>Penryn</model>
   <feature policy='require' name='svm'/>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-timeout.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-timeout.xml
index caa5f0a..ac72822 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-timeout.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-timeout.xml
@@ -15,7 +15,7 @@
     <apic/>
     <pae/>
   </features>
-  <cpu match='exact'>
+  <cpu mode='custom' match='exact'>
     <model fallback='allow'>core2duo</model>
     <vendor>Intel</vendor>
     <topology sockets='1' cores='2' threads='1'/>
diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c
index c6adec9..8e621fe 100644
--- a/tests/testutilsqemu.c
+++ b/tests/testutilsqemu.c
@@ -112,6 +112,7 @@ virCapsPtr testQemuCapsInit(void) {
     };
     static virCPUDef host_cpu = {
         VIR_CPU_TYPE_HOST,      /* type */
+        0,                      /* mode */
         0,                      /* match */
         (char *) "x86_64",      /* arch */
         (char *) "core2duo",    /* model */
-- 
1.7.8.3

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list


[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]