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; };