virDomainCPUDefFree - free memory allocated
virDomainCPUDefParseXML - parse job type
virDomainCPUDefFormat - output job type
Signed-off-by: Zhu Guihua <zhugh.fnst(a)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