From 09938bb3b0f2b2735f30b515d3d6819095612e73 Mon Sep 17 00:00:00 2001 From: Guannan Ren Date: Mon, 17 Dec 2012 14:01:20 +0800 Subject: [PATCH] conf: add optional attribte primary to video element If there are multiple video devices primary = 'yes' marks this video device as the primary one. The rest are secondary video devices. No more than one could be mark as primary. If none of them has primary attribute, the first one will be the primary by default like what it was. The reason of this changing is that for qemu, only one primary video device is permitted which can be of any type. For secondary video devices, only qxl is allowd. Primary attribute removes the restriction that the first have to be the primary one. We always put the primary video device into the first position of video device structure array after parsing. --- docs/formatdomain.html.in | 6 +++++- docs/schemas/domaincommon.rng | 8 ++++++++ src/conf/domain_conf.c | 27 ++++++++++++++++++++++++++- src/conf/domain_conf.h | 1 + 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index b845a8aa0e..292e032a66 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -3500,7 +3500,11 @@ qemu-kvm -net nic,model=? /dev/null will add a default video according to the guest type. For a guest of type "kvm", the default video for it is: type with value "cirrus", vram with value - "9216", and heads with value "1". + "9216", and heads with value "1". By default, the first + video device in domain xml is the primary one, but the optional + attribute primary (since 1.0.2) + with value 'yes' can be used to mark the primary in cases of mutiple + video device. The non-primary must be type of "qxl".
model
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 14344e2029..cdc511568e 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -2259,6 +2259,14 @@ + + + + yes + no + + + diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 12eeb5ee80..19af0584f4 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -7275,6 +7275,7 @@ virDomainVideoDefParseXML(const xmlNodePtr node, char *type = NULL; char *heads = NULL; char *vram = NULL; + char *primary = NULL; if (VIR_ALLOC(def) < 0) { virReportOOMError(); @@ -7289,6 +7290,11 @@ virDomainVideoDefParseXML(const xmlNodePtr node, type = virXMLPropString(cur, "type"); vram = virXMLPropString(cur, "vram"); heads = virXMLPropString(cur, "heads"); + + if ((primary = virXMLPropString(cur, "primary")) != NULL) + if (STREQ(primary, "yes")) + def->primary = 1; + def->accel = virDomainVideoAccelDefParseXML(cur); } } @@ -8709,6 +8715,7 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, xmlNodePtr cur; bool usb_none = false; bool usb_other = false; + bool primaryVideo = false; if (VIR_ALLOC(def) < 0) { virReportOOMError(); @@ -9996,12 +10003,28 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, if (n && VIR_ALLOC_N(def->videos, n) < 0) goto no_memory; for (i = 0 ; i < n ; i++) { + size_t ii = def->nvideos; virDomainVideoDefPtr video = virDomainVideoDefParseXML(nodes[i], def, flags); if (!video) goto error; - def->videos[def->nvideos++] = video; + + if (video->primary) { + if (primaryVideo) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Only one primary video device is supported")); + goto error; + } + + ii = 0; + primaryVideo = true; + } + if (VIR_INSERT_ELEMENT_INPLACE(def->videos, + ii, + def->nvideos, + video) < 0) + goto error; } VIR_FREE(nodes); @@ -13151,6 +13174,8 @@ virDomainVideoDefFormat(virBufferPtr buf, virBufferAsprintf(buf, " vram='%u'", def->vram); if (def->heads) virBufferAsprintf(buf, " heads='%u'", def->heads); + if (def->primary) + virBufferAddLit(buf, " primary='yes'"); if (def->accel) { virBufferAddLit(buf, ">\n"); virDomainVideoAccelDefFormat(buf, def->accel); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index e6659cd038..bc9ef88864 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1121,6 +1121,7 @@ struct _virDomainVideoDef { int type; unsigned int vram; unsigned int heads; + bool primary; virDomainVideoAccelDefPtr accel; virDomainDeviceInfo info; };