[libvirt] [RFC PATCH v2 02/12] domain_conf: introduce cpu def helpers

Zhu Guihua zhugh.fnst at cn.fujitsu.com
Wed Feb 4 09:18:20 UTC 2015


virDomainCPUDefFree - free memory allocated
virDomainCPUDefParseXML - parse job type
virDomainCPUDefFormat - output job type

Signed-off-by: Zhu Guihua <zhugh.fnst at cn.fujitsu.com>
---
 docs/formatdomain.html.in     | 28 +++++++++++++++
 docs/schemas/domaincommon.rng |  3 ++
 src/conf/domain_conf.c        | 82 +++++++++++++++++++++++++++++++++++++++++++
 src/conf/domain_conf.h        |  1 +
 src/libvirt_private.syms      |  1 +
 5 files changed, 115 insertions(+)

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index f8d5f89..10cbd29 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -5830,6 +5830,34 @@ qemu-kvm -net nic,model=? /dev/null
     </dd>
   </dl>
 
+  <h4><a name="elementsCpu">CPU device</a></h4>
+  <p>
+    CPU device allows to be hot added to the guest.
+    <span class="since">Since 1.2.12, QEMU and KVM only</span>
+  </p>
+
+<pre>
+  ...
+  <devices>
+    <cpu match='exact'>
+      <model fallback='allow'>core2duo</model>
+      <vendor>Intel</vendor>
+      <topology sockets='1' cores='2' threads='1'/>
+      <feature policy='disable' name='lahf_lm'/>
+    </cpu>
+  <devices>
+  ...
+</pre>
+  <dl>
+    <dt><code>model</code></dt>
+    <dd>
+      <p>
+        The attribute can be omitted and will default to a model
+        started up by the guest.
+      </p>
+    </dd>
+  </dl>
+
     <h3><a name="seclabel">Security label</a></h3>
 
     <p>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 9d6c1ee..1ceb811 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -4003,6 +4003,9 @@
         <optional>
           <ref name="panic"/>
         </optional>
+        <optional>
+          <ref name='cpu'>
+        </optional>
       </interleave>
     </element>
   </define>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 0f4baaf..dfe0d65 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1913,6 +1913,18 @@ void virDomainRedirFilterDefFree(virDomainRedirFilterDefPtr def)
     VIR_FREE(def);
 }
 
+void virDomainCPUDefFree(virDomainCPUDefPtr def)
+{
+    if (!def)
+        return;
+
+    virCPUDefFree(def->virCPU);
+
+    virDomainDeviceInfoClear(&def->info);
+
+    VIR_FREE(def);
+}
+
 void virDomainDeviceDefFree(virDomainDeviceDefPtr def)
 {
     if (!def)
@@ -1983,6 +1995,8 @@ void virDomainDeviceDefFree(virDomainDeviceDefPtr def)
         virDomainPanicDefFree(def->data.panic);
         break;
     case VIR_DOMAIN_DEVICE_CPU:
+        virDomainCPUDefFree(def->data.cpu);
+        break;
     case VIR_DOMAIN_DEVICE_LAST:
     case VIR_DOMAIN_DEVICE_NONE:
         break;
@@ -11052,6 +11066,44 @@ virDomainPMStateParseXML(xmlXPathContextPtr ctxt,
     return ret;
 }
 
+static virDomainCPUDefPtr
+virDomainCPUDefParseXML(xmlNodePtr node,
+                        xmlXPathContextPtr ctxt,
+                        const virDomainDef *def,
+                        unsigned int flags)
+{
+    virDomainCPUDefPtr dev;
+
+    if (VIR_ALLOC(dev) < 0)
+        return NULL;
+
+    dev->virCPU = virCPUDefParseXML(node, ctxt, VIR_CPU_TYPE_AUTO);
+    if (!dev->virCPU)
+        goto cleanup;
+
+    if (!dev->virCPU->model) {
+        if (def->cpu->model) {
+            dev->virCPU->model = def->cpu->model;
+        } else if (def->os.arch == VIR_ARCH_I686) {
+            if (virAsprintf(&dev->virCPU->model, "qemu32") < 0)
+                goto cleanup;
+        } else {
+            if (virAsprintf(&dev->virCPU->model, "qemu64") < 0)
+                goto cleanup;
+        }
+    }
+
+    if (virDomainDeviceInfoParseXML(node, NULL, &dev->info, flags) < 0)
+        goto cleanup;
+
+    return dev;
+
+ cleanup:
+    virDomainCPUDefFree(dev);
+    dev = NULL;
+    return dev;
+}
+
 virDomainDeviceDefPtr
 virDomainDeviceDefParse(const char *xmlStr,
                         const virDomainDef *def,
@@ -11187,6 +11239,9 @@ virDomainDeviceDefParse(const char *xmlStr,
             goto error;
         break;
     case VIR_DOMAIN_DEVICE_CPU:
+        if (!(dev->data.cpu = virDomainCPUDefParseXML(node, ctxt, def, flags)))
+            goto error;
+        break;
     case VIR_DOMAIN_DEVICE_NONE:
     case VIR_DOMAIN_DEVICE_LAST:
         break;
@@ -18145,6 +18200,27 @@ virDomainChrDefFormat(virBufferPtr buf,
 }
 
 static int
+virDomainCPUDefFormat(virBufferPtr buf,
+                      virDomainCPUDefPtr def,
+                      unsigned int flags)
+{
+    if (virCPUDefFormatBufFull(buf, def->virCPU, false) < 0)
+        return -1;
+
+    virBufferTrim(buf, "</cpu>\n", -1);
+    virBufferTrim(buf, "", 4);
+    virBufferAdjustIndent(buf, 2);
+
+    if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
+        return -1;
+
+    virBufferAdjustIndent(buf, -2);
+    virBufferAddLit(buf, "</cpu>\n");
+
+    return 0;
+}
+
+static int
 virDomainSmartcardDefFormat(virBufferPtr buf,
                             virDomainSmartcardDefPtr def,
                             unsigned int flags)
@@ -20065,6 +20141,10 @@ virDomainDefFormatInternal(virDomainDefPtr def,
             goto error;
     }
 
+    for (n = 0; n < def->ncpus; n++)
+        if (virDomainCPUDefFormat(buf, def->cpus[n], flags) < 0)
+            goto error;
+
     if (def->nvram)
         virDomainNVRAMDefFormat(buf, def->nvram, flags);
 
@@ -21480,6 +21560,8 @@ virDomainDeviceDefCopy(virDomainDeviceDefPtr src,
         rc = virDomainPanicDefFormat(&buf, src->data.panic);
         break;
     case VIR_DOMAIN_DEVICE_CPU:
+        rc = virDomainCPUDefFormat(&buf, src->data.cpu, flags);
+        break;
     case VIR_DOMAIN_DEVICE_NONE:
     case VIR_DOMAIN_DEVICE_SMARTCARD:
     case VIR_DOMAIN_DEVICE_MEMBALLOON:
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index b9d4e7c..4096ecc 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2371,6 +2371,7 @@ void virDomainHostdevDefFree(virDomainHostdevDefPtr def);
 void virDomainHubDefFree(virDomainHubDefPtr def);
 void virDomainRedirdevDefFree(virDomainRedirdevDefPtr def);
 void virDomainRedirFilterDefFree(virDomainRedirFilterDefPtr def);
+void virDomainCPUDefFree(virDomainCPUDefPtr def);
 void virDomainShmemDefFree(virDomainShmemDefPtr def);
 void virDomainDeviceDefFree(virDomainDeviceDefPtr def);
 virDomainDeviceDefPtr virDomainDeviceDefCopy(virDomainDeviceDefPtr src,
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 75a6d83..897a598 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -181,6 +181,7 @@ virDomainControllerModelUSBTypeFromString;
 virDomainControllerModelUSBTypeToString;
 virDomainControllerRemove;
 virDomainControllerTypeToString;
+virDomainCPUDefFree;
 virDomainCpuPlacementModeTypeFromString;
 virDomainCpuPlacementModeTypeToString;
 virDomainDefAddImplicitControllers;
-- 
1.9.3




More information about the libvir-list mailing list