[libvirt] [PATCH] Allow for CPU topology specification without model

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@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); -- 1.6.6

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@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 :|

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.
ACK
Thanks, can someone push it, please? Jirka

2010/1/19 Jiri Denemark <jdenemar@redhat.com>:
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.
ACK
Thanks, can someone push it, please?
Jirka
Pushed. Matthias
participants (3)
-
Daniel P. Berrange
-
Jiri Denemark
-
Matthias Bolte