]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
conf: add optional attribte primary to video <model> element
authorGuannan Ren <gren@redhat.com>
Mon, 17 Dec 2012 06:01:20 +0000 (14:01 +0800)
committerGuannan Ren <gren@redhat.com>
Mon, 17 Dec 2012 06:01:20 +0000 (14:01 +0800)
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
docs/schemas/domaincommon.rng
src/conf/domain_conf.c
src/conf/domain_conf.h

index b845a8aa0ec0ec18bcb3f5abe03b71224f80d201..292e032a66886c676049e5151ff52a66a7c507d0 100644 (file)
@@ -3500,7 +3500,11 @@ qemu-kvm -net nic,model=? /dev/null
         will add a default <code>video</code> according to the guest type.
         For a guest of type "kvm", the default <code>video</code> for it is:
         <code>type</code> with value "cirrus", <code>vram</code> with value
-        "9216", and <code>heads</code> with value "1".
+        "9216", and <code>heads</code> with value "1". By default, the first
+        video device in domain xml is the primary one, but the optional
+        attribute <code>primary</code> (<span class="since">since 1.0.2</span>)
+        with value 'yes' can be used to mark the primary in cases of mutiple
+        video device. The non-primary must be type of "qxl".
       </dd>
 
       <dt><code>model</code></dt>
index 14344e2029d8d904fddd9da0e6bc4cd087f63b9b..cdc511568e53426fd7ee0424d4730d8d466ac13a 100644 (file)
               <ref name="unsignedInt"/>
             </attribute>
           </optional>
+          <optional>
+            <attribute name="primary">
+              <choice>
+                <value>yes</value>
+                <value>no</value>
+              </choice>
+            </attribute>
+          </optional>
           <optional>
             <element name="acceleration">
               <optional>
index 12eeb5ee808883c192da878f1629c75c25e603bc..19af0584f45bcdf13e0d134774df43f683233e40 100644 (file)
@@ -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);
index e6659cd038a93988b507dbe643adba2ef0e3093f..bc9ef8886492a7ad5cb88df51adc8525eeba4792 100644 (file)
@@ -1121,6 +1121,7 @@ struct _virDomainVideoDef {
     int type;
     unsigned int vram;
     unsigned int heads;
+    bool primary;
     virDomainVideoAccelDefPtr accel;
     virDomainDeviceInfo info;
 };