[libvirt] [PATCH] Allow for CPU topology specification without model
Daniel P. Berrange
berrange at redhat.com
Tue Jan 12 20:21:48 UTC 2010
On Tue, Jan 12, 2010 at 03:25:36PM +0100, Jiri Denemark wrote:
> Currently CPU topology may only be specified together with CPU model:
> <cpu match='exact'>
> <model>name</model>
> <topology sockets='1' cores='2' threads='3'/>
> </cpu>
>
> This patch allows for CPU topology specification without the need for
> also specifying CPU model:
> <cpu>
> <topology sockets='1' cores='2' threads='3'/>
> </cpu>
>
> 'match' attribute and 'model' element are made optional with the
> restriction that 'match' attribute has to be set when 'model' is
> present.
>
> Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
> ---
> docs/schemas/domain.rng | 24 ++++++++++++--------
> src/conf/cpu_conf.c | 55 ++++++++++++++++++++++++++++++++--------------
> 2 files changed, 52 insertions(+), 27 deletions(-)
>
> diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng
> index 566b117..137bbc6 100644
> --- a/docs/schemas/domain.rng
> +++ b/docs/schemas/domain.rng
> @@ -1242,17 +1242,21 @@
> -->
> <define name="cpu">
> <element name="cpu">
> - <attribute name="match">
> - <choice>
> - <value>minimum</value>
> - <value>exact</value>
> - <value>strict</value>
> - </choice>
> - </attribute>
> + <optional>
> + <attribute name="match">
> + <choice>
> + <value>minimum</value>
> + <value>exact</value>
> + <value>strict</value>
> + </choice>
> + </attribute>
> + </optional>
> <interleave>
> - <element name="model">
> - <text/>
> - </element>
> + <optional>
> + <element name="model">
> + <text/>
> + </element>
> + </optional>
> <optional>
> <element name="topology">
> <attribute name="sockets">
> diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c
> index bbe2cc2..e7924c1 100644
> --- a/src/conf/cpu_conf.c
> +++ b/src/conf/cpu_conf.c
> @@ -1,7 +1,7 @@
> /*
> * cpu_conf.h: CPU XML handling
> *
> - * Copyright (C) 2009 Red Hat, Inc.
> + * Copyright (C) 2009, 2010 Red Hat, Inc.
> *
> * This library is free software; you can redistribute it and/or
> * modify it under the terms of the GNU Lesser General Public
> @@ -76,7 +76,6 @@ virCPUDefParseXML(virConnectPtr conn,
> {
> virCPUDefPtr def;
> xmlNodePtr *nodes = NULL;
> - char *match;
> int n;
> unsigned int i;
>
> @@ -85,18 +84,33 @@ virCPUDefParseXML(virConnectPtr conn,
> return NULL;
> }
>
> - match = virXMLPropString(node, "match");
> -
> - if (mode == VIR_CPU_TYPE_AUTO)
> - def->type = (match == NULL) ? VIR_CPU_TYPE_HOST : VIR_CPU_TYPE_GUEST;
> - else
> + if (mode == VIR_CPU_TYPE_AUTO) {
> + if (virXPathBoolean(conn, "boolean(./arch)", ctxt))
> + def->type = VIR_CPU_TYPE_HOST;
> + else
> + def->type = VIR_CPU_TYPE_GUEST;
> + } else
> def->type = mode;
>
> if (def->type == VIR_CPU_TYPE_GUEST) {
> - if ((def->match = virCPUMatchTypeFromString(match)) < 0) {
> - virCPUReportError(conn, VIR_ERR_INTERNAL_ERROR,
> - "%s", _("Invalid match attribute for CPU specification"));
> - goto error;
> + char *match = virXMLPropString(node, "match");
> +
> + if (!match) {
> + if (virXPathBoolean(conn, "boolean(./model)", ctxt)) {
> + virCPUReportError(conn, VIR_ERR_INTERNAL_ERROR,
> + "%s", _("Missing match attribute for CPU specification"));
> + goto error;
> + }
> + def->match = -1;
> + } else {
> + def->match = virCPUMatchTypeFromString(match);
> + VIR_FREE(match);
> +
> + if (def->match < 0) {
> + virCPUReportError(conn, VIR_ERR_INTERNAL_ERROR,
> + "%s", _("Invalid match attribute for CPU specification"));
> + goto error;
> + }
> }
> }
>
> @@ -109,7 +123,8 @@ virCPUDefParseXML(virConnectPtr conn,
> }
> }
>
> - if (!(def->model = virXPathString(conn, "string(./model[1])", ctxt))) {
> + if (!(def->model = virXPathString(conn, "string(./model[1])", ctxt)) &&
> + def->type == VIR_CPU_TYPE_HOST) {
> virCPUReportError(conn, VIR_ERR_INTERNAL_ERROR,
> "%s", _("Missing CPU model name"));
> goto error;
> @@ -158,6 +173,12 @@ virCPUDefParseXML(virConnectPtr conn,
> goto error;
>
> if (n > 0) {
> + if (!def->model) {
> + virCPUReportError(conn, VIR_ERR_INTERNAL_ERROR,
> + "%s", _("Non-empty feature list specified without CPU model"));
> + goto error;
> + }
> +
> if (VIR_ALLOC_N(def->features, n) < 0)
> goto no_memory;
> def->nfeatures = n;
> @@ -206,7 +227,6 @@ virCPUDefParseXML(virConnectPtr conn,
> }
>
> cleanup:
> - VIR_FREE(match);
> VIR_FREE(nodes);
>
> return def;
> @@ -263,14 +283,14 @@ virCPUDefFormatBuf(virConnectPtr conn,
> if (indent == NULL)
> indent = "";
>
> - if (!def->model) {
> + if (!def->model && def->nfeatures) {
> virCPUReportError(conn, VIR_ERR_INTERNAL_ERROR,
> - "%s", _("Missing CPU model"));
> + "%s", _("Non-empty feature list specified without CPU model"));
> return -1;
> }
>
> if (!(flags & VIR_CPU_FORMAT_EMBEDED)) {
> - if (def->type == VIR_CPU_TYPE_GUEST) {
> + if (def->type == VIR_CPU_TYPE_GUEST && def->model) {
> const char *match;
> if (!(match = virCPUMatchTypeToString(def->match))) {
> virCPUReportError(conn, VIR_ERR_INTERNAL_ERROR,
> @@ -287,7 +307,8 @@ virCPUDefFormatBuf(virConnectPtr conn,
> virBufferVSprintf(buf, "%s <arch>%s</arch>\n", indent, def->arch);
> }
>
> - virBufferVSprintf(buf, "%s <model>%s</model>\n", indent, def->model);
> + if (def->model)
> + virBufferVSprintf(buf, "%s <model>%s</model>\n", indent, def->model);
>
> if (def->sockets && def->cores && def->threads) {
> virBufferVSprintf(buf, "%s <topology", indent);
ACK
Daniel
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
More information about the libvir-list
mailing list