提交 ce4896fb 编写于 作者: J Jiri Denemark 提交者: Matthias Bolte

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: NJiri Denemark <jdenemar@redhat.com>
上级 16a4d22b
...@@ -1307,6 +1307,7 @@ ...@@ -1307,6 +1307,7 @@
--> -->
<define name="cpu"> <define name="cpu">
<element name="cpu"> <element name="cpu">
<optional>
<attribute name="match"> <attribute name="match">
<choice> <choice>
<value>minimum</value> <value>minimum</value>
...@@ -1314,10 +1315,13 @@ ...@@ -1314,10 +1315,13 @@
<value>strict</value> <value>strict</value>
</choice> </choice>
</attribute> </attribute>
</optional>
<interleave> <interleave>
<optional>
<element name="model"> <element name="model">
<text/> <text/>
</element> </element>
</optional>
<optional> <optional>
<element name="topology"> <element name="topology">
<attribute name="sockets"> <attribute name="sockets">
......
/* /*
* cpu_conf.h: CPU XML handling * 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 * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
...@@ -76,7 +76,6 @@ virCPUDefParseXML(virConnectPtr conn, ...@@ -76,7 +76,6 @@ virCPUDefParseXML(virConnectPtr conn,
{ {
virCPUDefPtr def; virCPUDefPtr def;
xmlNodePtr *nodes = NULL; xmlNodePtr *nodes = NULL;
char *match;
int n; int n;
unsigned int i; unsigned int i;
...@@ -85,20 +84,35 @@ virCPUDefParseXML(virConnectPtr conn, ...@@ -85,20 +84,35 @@ virCPUDefParseXML(virConnectPtr conn,
return NULL; return NULL;
} }
match = virXMLPropString(node, "match"); if (mode == VIR_CPU_TYPE_AUTO) {
if (virXPathBoolean(conn, "boolean(./arch)", ctxt))
if (mode == VIR_CPU_TYPE_AUTO) def->type = VIR_CPU_TYPE_HOST;
def->type = (match == NULL) ? VIR_CPU_TYPE_HOST : VIR_CPU_TYPE_GUEST;
else else
def->type = VIR_CPU_TYPE_GUEST;
} else
def->type = mode; def->type = mode;
if (def->type == VIR_CPU_TYPE_GUEST) { if (def->type == VIR_CPU_TYPE_GUEST) {
if ((def->match = virCPUMatchTypeFromString(match)) < 0) { 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, virCPUReportError(conn, VIR_ERR_INTERNAL_ERROR,
"%s", _("Invalid match attribute for CPU specification")); "%s", _("Invalid match attribute for CPU specification"));
goto error; goto error;
} }
} }
}
if (def->type == VIR_CPU_TYPE_HOST) { if (def->type == VIR_CPU_TYPE_HOST) {
def->arch = virXPathString(conn, "string(./arch[1])", ctxt); def->arch = virXPathString(conn, "string(./arch[1])", ctxt);
...@@ -109,7 +123,8 @@ virCPUDefParseXML(virConnectPtr conn, ...@@ -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, virCPUReportError(conn, VIR_ERR_INTERNAL_ERROR,
"%s", _("Missing CPU model name")); "%s", _("Missing CPU model name"));
goto error; goto error;
...@@ -158,6 +173,12 @@ virCPUDefParseXML(virConnectPtr conn, ...@@ -158,6 +173,12 @@ virCPUDefParseXML(virConnectPtr conn,
goto error; goto error;
if (n > 0) { 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) if (VIR_ALLOC_N(def->features, n) < 0)
goto no_memory; goto no_memory;
def->nfeatures = n; def->nfeatures = n;
...@@ -206,7 +227,6 @@ virCPUDefParseXML(virConnectPtr conn, ...@@ -206,7 +227,6 @@ virCPUDefParseXML(virConnectPtr conn,
} }
cleanup: cleanup:
VIR_FREE(match);
VIR_FREE(nodes); VIR_FREE(nodes);
return def; return def;
...@@ -263,14 +283,14 @@ virCPUDefFormatBuf(virConnectPtr conn, ...@@ -263,14 +283,14 @@ virCPUDefFormatBuf(virConnectPtr conn,
if (indent == NULL) if (indent == NULL)
indent = ""; indent = "";
if (!def->model) { if (!def->model && def->nfeatures) {
virCPUReportError(conn, VIR_ERR_INTERNAL_ERROR, virCPUReportError(conn, VIR_ERR_INTERNAL_ERROR,
"%s", _("Missing CPU model")); "%s", _("Non-empty feature list specified without CPU model"));
return -1; return -1;
} }
if (!(flags & VIR_CPU_FORMAT_EMBEDED)) { 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; const char *match;
if (!(match = virCPUMatchTypeToString(def->match))) { if (!(match = virCPUMatchTypeToString(def->match))) {
virCPUReportError(conn, VIR_ERR_INTERNAL_ERROR, virCPUReportError(conn, VIR_ERR_INTERNAL_ERROR,
...@@ -287,6 +307,7 @@ virCPUDefFormatBuf(virConnectPtr conn, ...@@ -287,6 +307,7 @@ virCPUDefFormatBuf(virConnectPtr conn,
virBufferVSprintf(buf, "%s <arch>%s</arch>\n", indent, def->arch); virBufferVSprintf(buf, "%s <arch>%s</arch>\n", indent, def->arch);
} }
if (def->model)
virBufferVSprintf(buf, "%s <model>%s</model>\n", indent, def->model); virBufferVSprintf(buf, "%s <model>%s</model>\n", indent, def->model);
if (def->sockets && def->cores && def->threads) { if (def->sockets && def->cores && def->threads) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册