]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Support numad
authorOsier Yang <jyang@redhat.com>
Thu, 8 Mar 2012 13:36:26 +0000 (21:36 +0800)
committerOsier Yang <jyang@redhat.com>
Thu, 15 Mar 2012 04:24:56 +0000 (12:24 +0800)
numad is an user-level daemon that monitors NUMA topology and
processes resource consumption to facilitate good NUMA resource
alignment of applications/virtual machines to improve performance
and minimize cost of remote memory latencies. It provides a
pre-placement advisory interface, so significant processes can
be pre-bound to nodes with sufficient available resources.

More details: http://fedoraproject.org/wiki/Features/numad

"numad -w ncpus:memory_amount" is the advisory interface numad
provides currently.

This patch add the support by introducing a new XML attribute
for <vcpu>. e.g.

  <vcpu placement="auto">4</vcpu>
  <vcpu placement="static" cpuset="1-10^6">4</vcpu>

The returned advisory nodeset from numad will be printed
in domain's dumped XML. e.g.
  <vcpu placement="auto" cpuset="1-10^6">4</vcpu>

If placement is "auto", the number of vcpus and the current
memory amount specified in domain XML will be used for numad
command line (numad uses MB for memory amount):
  numad -w $num_of_vcpus:$current_memory_amount / 1024

The advisory nodeset returned from numad will be used to set
domain process CPU affinity then. (e.g. qemuProcessInitCpuAffinity).

If the user specifies both CPU affinity policy (e.g.
(<vcpu cpuset="1-10,^7,^8">4</vcpu>) and placement == "auto"
the specified CPU affinity will be overridden.

Only QEMU/KVM drivers support it now.

See docs update in patch for more details.

28 files changed:
configure.ac
docs/formatdomain.html.in
docs/schemas/domaincommon.rng
src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms
src/qemu/qemu_process.c
tests/domainsnapshotxml2xmlout/disk_snapshot.xml
tests/domainsnapshotxml2xmlout/full_domain.xml
tests/domainsnapshotxml2xmlout/metadata.xml
tests/qemuxml2argvdata/qemuxml2argv-channel-guestfwd.xml
tests/qemuxml2argvdata/qemuxml2argv-channel-spicevmc-old.xml
tests/qemuxml2argvdata/qemuxml2argv-channel-spicevmc.xml
tests/qemuxml2argvdata/qemuxml2argv-channel-virtio-auto.xml
tests/qemuxml2argvdata/qemuxml2argv-channel-virtio.xml
tests/qemuxml2argvdata/qemuxml2argv-console-virtio-many.xml
tests/qemuxml2argvdata/qemuxml2argv-console-virtio.xml
tests/qemuxml2argvdata/qemuxml2argv-metadata.xml
tests/qemuxml2argvdata/qemuxml2argv-minimal.xml
tests/qemuxml2argvdata/qemuxml2argv-seclabel-dynamic-baselabel.xml
tests/qemuxml2argvdata/qemuxml2argv-seclabel-dynamic-override.xml
tests/qemuxml2argvdata/qemuxml2argv-seclabel-dynamic.xml
tests/qemuxml2argvdata/qemuxml2argv-seclabel-none.xml
tests/qemuxml2argvdata/qemuxml2argv-seclabel-static-relabel.xml
tests/qemuxml2argvdata/qemuxml2argv-seclabel-static.xml
tests/qemuxml2xmloutdata/qemuxml2xmlout-channel-virtio-auto.xml
tests/qemuxml2xmloutdata/qemuxml2xmlout-console-virtio.xml
tests/qemuxml2xmloutdata/qemuxml2xmlout-metadata.xml

index c9cdd7b926058a07f4876f527cc766fb95f60f0d..31f08351beb7cbc4ff11f5525113f23c5073c4fd 100644 (file)
@@ -1445,6 +1445,14 @@ AM_CONDITIONAL([HAVE_NUMACTL], [test "$with_numactl" != "no"])
 AC_SUBST([NUMACTL_CFLAGS])
 AC_SUBST([NUMACTL_LIBS])
 
+dnl Do we have numad?
+if test "$with_qemu" = "yes"; then
+    AC_PATH_PROG([NUMAD], [numad], [], [/bin:/usr/bin:/usr/local/bin:$PATH])
+
+    if test -n "$NUMAD"; then
+        AC_DEFINE_UNQUOTED([NUMAD],["$NUMAD"], [Location or name of the numad program])
+    fi
+fi
 
 dnl pcap lib
 LIBPCAP_CONFIG="pcap-config"
index bf0675e65ff9da1999a5b91ec9ae088287569983..624c6b2cd71a0a017197c42c365899194f1fa3f2 100644 (file)
 <pre>
 &lt;domain&gt;
   ...
-  &lt;vcpu cpuset="1-4,^3,6" current="1"&gt;2&lt;/vcpu&gt;
+  &lt;vcpu placement='static' cpuset="1-4,^3,6" current="1"&gt;2&lt;/vcpu&gt;
   ...
 &lt;/domain&gt;
 </pre>
         be excluded from a previous range.  <span class="since">Since
         0.8.5</span>, the optional attribute <code>current</code> can
         be used to specify whether fewer than the maximum number of
-        virtual CPUs should be enabled.
+        virtual CPUs should be enabled.  <span class="since">Since
+        0.9.11 (QEMU and KVM only), the optional attribute
+        <code>placement</code> can be used to indicate the CPU placement
+        mode for domain process, its value can be either "static" or
+        "auto", defaults to "static" if <code>cpuset</code> is specified,
+        "auto" indicates the domain process will be pinned to the advisory
+        nodeset from querying numad, and the value of attribute
+        <code>cpuset</code> will be overridden by the advisory nodeset
+        from numad if it's specified. If both <code>cpuset</code> and
+        <code>placement</code> are not specified, or if <code>placement</code>
+        is "static", but no <code>cpuset</code> is specified, the domain
+        process will be pinned to all the available physical CPUs.
       </dd>
     </dl>
 
         <span class='since'>Since 0.9.3</span>
       <dt><code>memory</code></dt>
       <dd>
-        The optional <code>memory</code> element specify how to allocate memory
+        The optional <code>memory</code> element specifies how to allocate memory
         for the domain process on a NUMA host. It contains two attributes,
         attribute <code>mode</code> is either 'interleave', 'strict',
         or 'preferred',
index 646a51b748549ba50fa8c19d2dfeefbf9b26e76c..b804a7074b40f78a3f627d0c8c74b21db4bd5740 100644 (file)
 
       <optional>
         <element name="vcpu">
+          <optional>
+            <attribute name="placement">
+              <choice>
+                <value>static</value>
+                <value>auto</value>
+              </choice>
+            </attribute>
+          </optional>
           <optional>
             <attribute name="cpuset">
               <ref name="cpuset"/>
index e2ed1150fc54d852aa5dae54ea4bab3f897fca82..f6f8b8ca88073ae040cb4fd15b44b3cc7cf33e29 100644 (file)
@@ -624,6 +624,11 @@ VIR_ENUM_IMPL(virDomainStartupPolicy, VIR_DOMAIN_STARTUP_POLICY_LAST,
               "requisite",
               "optional");
 
+VIR_ENUM_IMPL(virDomainCpuPlacementMode, VIR_DOMAIN_CPU_PLACEMENT_MODE_LAST,
+              "default",
+              "static",
+              "auto");
+
 #define virDomainReportError(code, ...)                              \
     virReportErrorHelper(VIR_FROM_DOMAIN, code, __FILE__,            \
                          __FUNCTION__, __LINE__, __VA_ARGS__)
@@ -7497,7 +7502,6 @@ error:
     goto cleanup;
 }
 
-
 static int virDomainDefMaybeAddController(virDomainDefPtr def,
                                           int type,
                                           int idx)
@@ -7611,6 +7615,7 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
     bool uuid_generated = false;
     virBitmapPtr bootMap = NULL;
     unsigned long bootMapSize = 0;
+    xmlNodePtr cur;
 
     if (VIR_ALLOC(def) < 0) {
         virReportOOMError();
@@ -7839,6 +7844,22 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
         VIR_FREE(tmp);
     }
 
+    tmp = virXPathString("string(./vcpu[1]/@placement)", ctxt);
+    if (tmp) {
+        if ((def->placement_mode =
+             virDomainCpuPlacementModeTypeFromString(tmp)) < 0) {
+             virDomainReportError(VIR_ERR_XML_ERROR,
+                                  _("Unsupported CPU placement mode '%s'"),
+                                  tmp);
+             VIR_FREE(tmp);
+             goto error;
+        }
+        VIR_FREE(tmp);
+    } else {
+        if (def->cpumasklen)
+            def->placement_mode = VIR_DOMAIN_CPU_PLACEMENT_MODE_STATIC;
+    }
+
     /* Extract cpu tunables. */
     if (virXPathULong("string(./cputune/shares[1])", ctxt,
                       &def->cputune.shares) < 0)
@@ -7886,47 +7907,74 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
     VIR_FREE(nodes);
 
     /* Extract numatune if exists. */
-    if ((n = virXPathNodeSet("./numatune", ctxt, NULL)) < 0) {
+    if ((n = virXPathNodeSet("./numatune", ctxt, &nodes)) < 0) {
         virDomainReportError(VIR_ERR_INTERNAL_ERROR,
                              "%s", _("cannot extract numatune nodes"));
         goto error;
     }
 
+    if (n > 1) {
+        virDomainReportError(VIR_ERR_XML_ERROR, "%s",
+                             _("only one numatune is supported"));
+        VIR_FREE(nodes);
+        goto error;
+    }
+
     if (n) {
-        tmp = virXPathString("string(./numatune/memory/@nodeset)", ctxt);
-        if (tmp) {
-            char *set = tmp;
-            int nodemasklen = VIR_DOMAIN_CPUMASK_LEN;
+        cur = nodes[0]->children;
+        while (cur != NULL) {
+            if (cur->type == XML_ELEMENT_NODE) {
+                if ((xmlStrEqual(cur->name, BAD_CAST "memory"))) {
+                    tmp = virXMLPropString(cur, "nodeset");
 
-            if (VIR_ALLOC_N(def->numatune.memory.nodemask, nodemasklen) < 0) {
-                goto no_memory;
-            }
+                    if (tmp) {
+                        char *set = tmp;
+                        int nodemasklen = VIR_DOMAIN_CPUMASK_LEN;
 
-            /* "nodeset" leads same syntax with "cpuset". */
-            if (virDomainCpuSetParse(set, 0, def->numatune.memory.nodemask,
-                                     nodemasklen) < 0)
-               goto error;
-            VIR_FREE(tmp);
-        } else {
-            virDomainReportError(VIR_ERR_INTERNAL_ERROR,
-                                "%s", _("nodeset for NUMA memory tuning must be set"));
-            goto error;
-        }
+                        if (VIR_ALLOC_N(def->numatune.memory.nodemask,
+                                        nodemasklen) < 0) {
+                            virReportOOMError();
+                            goto error;
+                        }
 
-        tmp = virXPathString("string(./numatune/memory/@mode)", ctxt);
-        if (tmp) {
-            if ((def->numatune.memory.mode =
-                virDomainNumatuneMemModeTypeFromString(tmp)) < 0) {
-                virDomainReportError(VIR_ERR_INTERNAL_ERROR,
-                                    _("Unsupported NUMA memory tuning mode '%s'"),
-                                    tmp);
-                goto error;
+                        /* "nodeset" leads same syntax with "cpuset". */
+                        if (virDomainCpuSetParse(set, 0,
+                                                 def->numatune.memory.nodemask,
+                                                 nodemasklen) < 0)
+                            goto error;
+                        VIR_FREE(tmp);
+                    } else {
+                        virDomainReportError(VIR_ERR_XML_ERROR, "%s",
+                                             _("nodeset for NUMA memory "
+                                               "tuning must be set"));
+                        goto error;
+                    }
+
+                    tmp = virXMLPropString(cur, "mode");
+                    if (tmp) {
+                        if ((def->numatune.memory.mode =
+                            virDomainNumatuneMemModeTypeFromString(tmp)) < 0) {
+                            virDomainReportError(VIR_ERR_XML_ERROR,
+                                                 _("Unsupported NUMA memory "
+                                                   "tuning mode '%s'"),
+                                                 tmp);
+                            goto error;
+                        }
+                        VIR_FREE(tmp);
+                    } else {
+                        def->numatune.memory.mode = VIR_DOMAIN_NUMATUNE_MEM_STRICT;
+                    }
+                } else {
+                    virDomainReportError(VIR_ERR_XML_ERROR,
+                                         _("unsupported XML element %s"),
+                                         (const char *)cur->name);
+                    goto error;
+                }
             }
-            VIR_FREE(tmp);
-        } else {
-            def->numatune.memory.mode = VIR_DOMAIN_NUMATUNE_MEM_STRICT;
+            cur = cur->next;
         }
     }
+    VIR_FREE(nodes);
 
     n = virXPathNodeSet("./features/*", ctxt, &nodes);
     if (n < 0)
@@ -12214,6 +12262,9 @@ virDomainDefFormatInternal(virDomainDefPtr def,
             allones = 0;
 
     virBufferAddLit(buf, "  <vcpu");
+    if (def->placement_mode)
+        virBufferAsprintf(buf, " placement='%s'",
+                          virDomainCpuPlacementModeTypeToString(def->placement_mode));
     if (!allones) {
         char *cpumask = NULL;
         if ((cpumask =
@@ -12265,22 +12316,24 @@ virDomainDefFormatInternal(virDomainDefPtr def,
         virBufferAddLit(buf, "  </cputune>\n");
 
     if (def->numatune.memory.nodemask) {
+        virBufferAddLit(buf, "  <numatune>\n");
         const char *mode;
         char *nodemask = NULL;
 
-        virBufferAddLit(buf, "  <numatune>\n");
         nodemask = virDomainCpuSetFormat(def->numatune.memory.nodemask,
                                          VIR_DOMAIN_CPUMASK_LEN);
         if (nodemask == NULL) {
             virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                          _("failed to format nodeset for NUMA memory tuning"));
+                                 _("failed to format nodeset for "
+                                   "NUMA memory tuning"));
             goto cleanup;
         }
 
         mode = virDomainNumatuneMemModeTypeToString(def->numatune.memory.mode);
         virBufferAsprintf(buf, "    <memory mode='%s' nodeset='%s'/>\n",
-                          mode, nodemask);
+                              mode, nodemask);
         VIR_FREE(nodemask);
+
         virBufferAddLit(buf, "  </numatune>\n");
     }
 
index 6da22f465197bfa7ea8bcbf1317f362aeff66931..0ab3b814fa767f1378d4e81ffea3d3fbef8ee1d4 100644 (file)
@@ -1394,6 +1394,14 @@ enum virDomainTimerModeType {
     VIR_DOMAIN_TIMER_MODE_LAST,
 };
 
+enum virDomainCpuPlacementMode {
+    VIR_DOMAIN_CPU_PLACEMENT_MODE_DEFAULT = 0,
+    VIR_DOMAIN_CPU_PLACEMENT_MODE_STATIC,
+    VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO,
+
+    VIR_DOMAIN_CPU_PLACEMENT_MODE_LAST,
+};
+
 typedef struct _virDomainTimerCatchupDef virDomainTimerCatchupDef;
 typedef virDomainTimerCatchupDef *virDomainTimerCatchupDefPtr;
 struct _virDomainTimerCatchupDef {
@@ -1520,6 +1528,7 @@ struct _virDomainDef {
     } mem;
     unsigned short vcpus;
     unsigned short maxvcpus;
+    int placement_mode;
     int cpumasklen;
     char *cpumask;
 
@@ -2161,6 +2170,7 @@ VIR_ENUM_DECL(virDomainTimerName)
 VIR_ENUM_DECL(virDomainTimerTrack)
 VIR_ENUM_DECL(virDomainTimerTickpolicy)
 VIR_ENUM_DECL(virDomainTimerMode)
+VIR_ENUM_DECL(virDomainCpuPlacementMode)
 
 VIR_ENUM_DECL(virDomainStartupPolicy)
 
index 1f55f5d3fddefc55dcbf0f2454168b382dd84bbf..d58082a2b5f137e9f5b6776a2972c8f8bf5f74a3 100644 (file)
@@ -271,6 +271,8 @@ virDomainControllerModelSCSITypeToString;
 virDomainControllerModelUSBTypeFromString;
 virDomainControllerModelUSBTypeToString;
 virDomainControllerTypeToString;
+virDomainCpuPlacementTypeFromString;
+virDomainCpuPlacementTypeToString;
 virDomainCpuSetFormat;
 virDomainCpuSetParse;
 virDomainDefAddImplicitControllers;
index ef311d17de17dd4ccf674a80172cac4009eea5ce..56cb531d81d9068da4fdd9830a0c90a87d3e5359 100644 (file)
@@ -1633,11 +1633,47 @@ qemuProcessInitNumaMemoryPolicy(virDomainObjPtr vm)
 }
 #endif
 
+#if defined(NUMAD)
+static char *
+qemuGetNumadAdvice(virDomainDefPtr def)
+{
+    virCommandPtr cmd = NULL;
+    char *args = NULL;
+    char *output = NULL;
+
+    if (virAsprintf(&args, "%d:%lu", def->vcpus, def->mem.cur_balloon) < 0) {
+        virReportOOMError();
+        goto out;
+    }
+    cmd = virCommandNewArgList(NUMAD, "-w", args, NULL);
+
+    virCommandSetOutputBuffer(cmd, &output);
+
+    if (virCommandRun(cmd, NULL) < 0)
+        qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                        _("Failed to query numad for the advisory nodeset"));
+
+out:
+    VIR_FREE(args);
+    virCommandFree(cmd);
+    return output;
+}
+#else
+static char *
+qemuGetNumadAdvice(virDomainDefPtr def ATTRIBUTE_UNUSED)
+{
+    qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                    _("numad is not available on this host"));
+    return NULL;
+}
+#endif
+
 /*
  * To be run between fork/exec of QEMU only
  */
 static int
-qemuProcessInitCpuAffinity(virDomainObjPtr vm)
+qemuProcessInitCpuAffinity(struct qemud_driver *driver,
+                           virDomainObjPtr vm)
 {
     int i, hostcpus, maxcpu = QEMUD_CPUMASK_LEN;
     virNodeInfo nodeinfo;
@@ -1661,19 +1697,53 @@ qemuProcessInitCpuAffinity(virDomainObjPtr vm)
         return -1;
     }
 
-    if (vm->def->cpumask) {
-        /* XXX why don't we keep 'cpumask' in the libvirt cpumap
-         * format to start with ?!?! */
-        for (i = 0 ; i < maxcpu && i < vm->def->cpumasklen ; i++)
-            if (vm->def->cpumask[i])
+    if (vm->def->placement_mode == VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO) {
+        char *tmp_cpumask = NULL;
+        char *nodeset = NULL;
+
+        nodeset = qemuGetNumadAdvice(vm->def);
+        if (!nodeset)
+            return -1;
+
+        if (VIR_ALLOC_N(tmp_cpumask, VIR_DOMAIN_CPUMASK_LEN) < 0) {
+            virReportOOMError();
+            return -1;
+        }
+
+        if (virDomainCpuSetParse(nodeset, 0, tmp_cpumask,
+                                 VIR_DOMAIN_CPUMASK_LEN) < 0) {
+            VIR_FREE(tmp_cpumask);
+            VIR_FREE(nodeset);
+            return -1;
+        }
+
+        for (i = 0; i < maxcpu && i < VIR_DOMAIN_CPUMASK_LEN; i++) {
+            if (tmp_cpumask[i])
                 VIR_USE_CPU(cpumap, i);
+        }
+
+        VIR_FREE(vm->def->cpumask);
+        vm->def->cpumask = tmp_cpumask;
+        if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) {
+            VIR_WARN("Unable to save status on vm %s after state change",
+                     vm->def->name);
+        }
+        VIR_FREE(nodeset);
     } else {
-        /* You may think this is redundant, but we can't assume libvirtd
-         * itself is running on all pCPUs, so we need to explicitly set
-         * the spawned QEMU instance to all pCPUs if no map is given in
-         * its config file */
-        for (i = 0 ; i < maxcpu ; i++)
-            VIR_USE_CPU(cpumap, i);
+        if (vm->def->cpumask) {
+            /* XXX why don't we keep 'cpumask' in the libvirt cpumap
+             * format to start with ?!?! */
+            for (i = 0 ; i < maxcpu && i < vm->def->cpumasklen ; i++)
+                if (vm->def->cpumask[i])
+                    VIR_USE_CPU(cpumap, i);
+        } else {
+            /* You may think this is redundant, but we can't assume libvirtd
+             * itself is running on all pCPUs, so we need to explicitly set
+             * the spawned QEMU instance to all pCPUs if no map is given in
+             * its config file */
+            for (i = 0 ; i < maxcpu ; i++)
+                VIR_USE_CPU(cpumap, i);
+        }
     }
 
     /* We are pressuming we are running between fork/exec of QEMU
@@ -2404,7 +2474,7 @@ static int qemuProcessHook(void *data)
     /* This must be done after cgroup placement to avoid resetting CPU
      * affinity */
     VIR_DEBUG("Setup CPU affinity");
-    if (qemuProcessInitCpuAffinity(h->vm) < 0)
+    if (qemuProcessInitCpuAffinity(h->driver, h->vm) < 0)
         goto cleanup;
 
     if (qemuProcessInitNumaMemoryPolicy(h->vm) < 0)
index 29f60be5519b0bf4a5b273b31175a93e62fe33af..0a4b1794e9e291870d49055a17bbe37abc3ccccc 100644 (file)
@@ -28,7 +28,7 @@
     <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
     <memory unit='KiB'>219100</memory>
     <currentMemory unit='KiB'>219100</currentMemory>
-    <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+    <vcpu placement='static' cpuset='1-4,8-20,525'>1</vcpu>
     <os>
       <type arch='i686' machine='pc'>hvm</type>
       <boot dev='hd'/>
index f77d6b0a08db9dd234027a013697dcff5a382ffb..27cf41d7d85fb55de14098257e1a223afb8459ea 100644 (file)
@@ -11,7 +11,7 @@
     <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
     <memory unit='KiB'>219100</memory>
     <currentMemory unit='KiB'>219100</currentMemory>
-    <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+    <vcpu placement='static' cpuset='1-4,8-20,525'>1</vcpu>
     <os>
       <type arch='i686' machine='pc'>hvm</type>
       <boot dev='hd'/>
index 1a27773ab4baf7306454d63fd6ef148085a8d202..93c9f39b18d57462f5e522b63247200c77b0e0dd 100644 (file)
@@ -15,7 +15,7 @@
     </metadata>
     <memory unit='KiB'>219100</memory>
     <currentMemory unit='KiB'>219100</currentMemory>
-    <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+    <vcpu placement='static' cpuset='1-4,8-20,525'>1</vcpu>
     <os>
       <type arch='i686' machine='pc'>hvm</type>
       <boot dev='hd'/>
index 7de7245c929383d58bc4bd51457bce5ecb2ff20b..60e853c1a01e481a9bde662fd43064b0d8c2e94d 100644 (file)
@@ -3,7 +3,7 @@
   <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
   <memory unit='KiB'>219100</memory>
   <currentMemory unit='KiB'>219100</currentMemory>
-  <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+  <vcpu placement='static' cpuset='1-4,8-20,525'>1</vcpu>
   <os>
     <type arch='i686' machine='pc'>hvm</type>
     <boot dev='hd'/>
index e4945e9a40157c0425a6c3a2cdf1e8e1adfc39e2..3269793f0179ce31a87ff64d5a3302c66098ca42 100644 (file)
@@ -2,7 +2,7 @@
   <name>QEMUGuest1</name>
   <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
   <memory unit='KiB'>219136</memory>
-  <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+  <vcpu placement='static' cpuset='1-4,8-20,525'>1</vcpu>
   <os>
     <type arch='i686' machine='pc'>hvm</type>
     <boot dev='hd'/>
index e4945e9a40157c0425a6c3a2cdf1e8e1adfc39e2..3269793f0179ce31a87ff64d5a3302c66098ca42 100644 (file)
@@ -2,7 +2,7 @@
   <name>QEMUGuest1</name>
   <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
   <memory unit='KiB'>219136</memory>
-  <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+  <vcpu placement='static' cpuset='1-4,8-20,525'>1</vcpu>
   <os>
     <type arch='i686' machine='pc'>hvm</type>
     <boot dev='hd'/>
index 91a973a14bdd22769448ea5c478c20d52d86ca23..a94084c8fc57af0a71c4ee4108e7804f77a63d8e 100644 (file)
@@ -3,7 +3,7 @@
   <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
   <memory unit='KiB'>219100</memory>
   <currentMemory unit='KiB'>219100</currentMemory>
-  <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+  <vcpu placement='static' cpuset='1-4,8-20,525'>1</vcpu>
   <os>
     <type arch='i686' machine='pc'>hvm</type>
     <boot dev='hd'/>
index 960442ae0a0d855bbc975af1b3374de8501ece3f..a280842c56ba867655633e786f6ea05f6036692b 100644 (file)
@@ -3,7 +3,7 @@
   <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
   <memory unit='KiB'>219100</memory>
   <currentMemory unit='KiB'>219100</currentMemory>
-  <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+  <vcpu placement='static' cpuset='1-4,8-20,525'>1</vcpu>
   <os>
     <type arch='i686' machine='pc'>hvm</type>
     <boot dev='hd'/>
index 626250c6a3ac63c737ff59ba2a6912d7d0d9a60b..6028a2cf801ed6cb1a835bbdba382a23b50c894b 100644 (file)
@@ -3,7 +3,7 @@
   <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
   <memory unit='KiB'>219100</memory>
   <currentMemory unit='KiB'>219100</currentMemory>
-  <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+  <vcpu placement='static' cpuset='1-4,8-20,525'>1</vcpu>
   <os>
     <type arch='i686' machine='pc'>hvm</type>
     <boot dev='hd'/>
index 0eb026ebbdd25c1c34d78f2e701d09e01799add2..812e5dde50c1a997dec49dd6f04b76183ba8b4cf 100644 (file)
@@ -3,7 +3,7 @@
   <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
   <memory unit='KiB'>219100</memory>
   <currentMemory unit='KiB'>219100</currentMemory>
-  <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+  <vcpu placement='static' cpuset='1-4,8-20,525'>1</vcpu>
   <os>
     <type arch='i686' machine='pc'>hvm</type>
     <boot dev='hd'/>
index e3c2b1078b6af4342c7c5f6655d0f69c2a3d4231..c741f0d110b59933af516f2e0e4164ae3e9e36ec 100644 (file)
@@ -3,7 +3,7 @@
   <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
   <memory unit='KiB'>219100</memory>
   <currentMemory unit='KiB'>219100</currentMemory>
-  <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+  <vcpu placement='static' cpuset='1-4,8-20,525'>1</vcpu>
   <os>
     <type arch='i686' machine='pc'>hvm</type>
     <boot dev='hd'/>
index 26790b1dfcecceb4f82f0a9d393b7d8b0435b152..26fdf0dc2ea443f41609433aa9f4373c60f24513 100644 (file)
@@ -8,7 +8,7 @@
   </description>
   <memory unit='KiB'>219100</memory>
   <currentMemory unit='KiB'>219100</currentMemory>
-  <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+  <vcpu placement='static' cpuset='1-4,8-20,525'>1</vcpu>
   <os>
     <type arch='i686' machine='pc'>hvm</type>
     <boot dev='hd'/>
index f27dc2eca16e8cc197fc4172247a875e413437d3..98362a736554f47e2f36086c3c6a1518caf744b9 100644 (file)
@@ -3,7 +3,7 @@
   <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
   <memory unit='KiB'>219100</memory>
   <currentMemory unit='KiB'>219100</currentMemory>
-  <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+  <vcpu placement='static' cpuset='1-4,8-20,525'>1</vcpu>
   <os>
     <type arch='i686' machine='pc'>hvm</type>
     <boot dev='hd'/>
index 233501f5ac8bc1fb5cc40f072c47c1d4f5b69b5c..4de435b9d22c43b128cfd021d86eef4832b81cd0 100644 (file)
@@ -3,7 +3,7 @@
   <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
   <memory unit='KiB'>219100</memory>
   <currentMemory unit='KiB'>219100</currentMemory>
-  <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+  <vcpu placement='static' cpuset='1-4,8-20,525'>1</vcpu>
   <os>
     <type arch='i686' machine='pc'>hvm</type>
     <boot dev='hd'/>
index d9fa37c1e3015d8b2f86abb53868cc19484b16b1..78a6b6a8a1b608619aceb0948a55c208b6129b94 100644 (file)
@@ -3,7 +3,7 @@
   <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
   <memory unit='KiB'>219100</memory>
   <currentMemory unit='KiB'>219100</currentMemory>
-  <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+  <vcpu placement='static' cpuset='1-4,8-20,525'>1</vcpu>
   <os>
     <type arch='i686' machine='pc'>hvm</type>
     <boot dev='hd'/>
index ec8e8c77da4ebdd69f48b454aefe120f3d1c196d..1a6878c2b19b811ecb9a7ea9a89745b26b0b5c4b 100644 (file)
@@ -3,7 +3,7 @@
   <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
   <memory unit='KiB'>219100</memory>
   <currentMemory unit='KiB'>219100</currentMemory>
-  <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+  <vcpu placement='static' cpuset='1-4,8-20,525'>1</vcpu>
   <os>
     <type arch='i686' machine='pc'>hvm</type>
     <boot dev='hd'/>
index d1ea84184ee543c6e1bf5a0005e14c40b9af11e6..70f9e11a43c5e05f61179972aba56467ea9fda0f 100644 (file)
@@ -3,7 +3,7 @@
   <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
   <memory unit='KiB'>219100</memory>
   <currentMemory unit='KiB'>219100</currentMemory>
-  <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+  <vcpu placement='static' cpuset='1-4,8-20,525'>1</vcpu>
   <os>
     <type arch='i686' machine='pc'>hvm</type>
     <boot dev='hd'/>
index a792d9b149e5646c12a33a85a007fb4cf9f6153e..31d5f58a6911c077d60d8735392b80b9941bf7d8 100644 (file)
@@ -3,7 +3,7 @@
   <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
   <memory unit='KiB'>219100</memory>
   <currentMemory unit='KiB'>219100</currentMemory>
-  <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+  <vcpu placement='static' cpuset='1-4,8-20,525'>1</vcpu>
   <os>
     <type arch='i686' machine='pc'>hvm</type>
     <boot dev='hd'/>
index cb345aa18a64b638ff23f9475148e7815b4ad97a..c257292f9e7a3f22845d18fe86b5d17466ca6731 100644 (file)
@@ -3,7 +3,7 @@
   <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
   <memory unit='KiB'>219100</memory>
   <currentMemory unit='KiB'>219100</currentMemory>
-  <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+  <vcpu placement='static' cpuset='1-4,8-20,525'>1</vcpu>
   <os>
     <type arch='i686' machine='pc'>hvm</type>
     <boot dev='hd'/>
index 93255a9ea1fd3e9a9221a1b56a8e34de67d817a8..031f821e62c7169ea882ede8d7c48f4c1fb6c45f 100644 (file)
@@ -3,7 +3,7 @@
   <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
   <memory unit='KiB'>219100</memory>
   <currentMemory unit='KiB'>219100</currentMemory>
-  <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+  <vcpu placement='static' cpuset='1-4,8-20,525'>1</vcpu>
   <os>
     <type arch='i686' machine='pc'>hvm</type>
     <boot dev='hd'/>
index 772ad173d801c3a2c77f0b60c9460574c31ee9d1..c3a55cf8621a0feb57e61ecfd51dd75608ae4d38 100644 (file)
@@ -7,7 +7,7 @@
   </metadata>
   <memory unit='KiB'>219100</memory>
   <currentMemory unit='KiB'>219100</currentMemory>
-  <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+  <vcpu placement='static' cpuset='1-4,8-20,525'>1</vcpu>
   <os>
     <type arch='i686' machine='pc'>hvm</type>
     <boot dev='hd'/>