[libvirt] [PATCH v6 09/10] spice: introduce listen type none

Pavel Hrdina phrdina at redhat.com
Wed Jun 8 15:25:47 UTC 2016


This new listen type is currently supported only by spice graphics.
It's introduced to make it easier and clearer specify to not listen
anywhere in order to start a guest with OpenGL support.

The old way to do this was set spice graphics autoport='no' and don't
specify any ports.  The new way is to use <listen type='none'/>.  In
order to be able to migrate to old libvirt the migratable XML will be
generated without the listen element and with autoport='no'.  Also the
old configuration will be automatically converted to the this listen
type.

Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
---
 docs/formatdomain.html.in                          | 11 ++++
 docs/schemas/domaincommon.rng                      |  5 ++
 src/conf/domain_conf.c                             | 77 ++++++++++++++++++----
 src/qemu/qemu_command.c                            | 13 ++--
 .../qemuxml2argv-video-virtio-gpu-spice-gl.args    |  2 +-
 .../qemuxml2xmlout-video-virtio-gpu-spice-gl.xml   |  4 +-
 6 files changed, 89 insertions(+), 23 deletions(-)

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 29b24ed..cf983ca 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -5376,6 +5376,17 @@ qemu-kvm -net nic,model=? /dev/null
           attribute all <code>listen</code> elements are ignored.
         </p>
       </dd>
+      <dt><code>none</code> <span class="since">since 1.3.6 (QEMU only)</span></dt>
+      <dd>
+        <p>
+          This listen type doesn't have any other attribute. Libvirt supports
+          passing a file descriptor through our APIs virDomainOpenGraphics() and
+          virDomainOpenGraphicsFD(). No other listen types are allowed if this
+          one is used and the graphics device doesn't listen anywhere. You need
+          to use one of the two APIs to pass a FD to QEMU in order to connect to
+          this graphics device. Supported by graphics type <code>spice</code>.
+        </p>
+      </dd>
     </dl>
 
     <h4><a name="elementsVideo">Video devices</a></h4>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index f0640cc..02078d7 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -2986,6 +2986,11 @@
               </attribute>
             </optional>
           </group>
+          <group>
+            <attribute name="type">
+              <value>none</value>
+            </attribute>
+          </group>
         </choice>
       </element>
     </zeroOrMore>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index eaa0770..d1539d7 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -3921,6 +3921,33 @@ virDomainDefPostParseTimer(virDomainDefPtr def)
 }
 
 
+static void
+virDomainDefPostParseGraphics(virDomainDef *def)
+{
+    size_t i;
+
+    for (i = 0; i < def->ngraphics; i++) {
+        virDomainGraphicsDefPtr graphics = def->graphics[i];
+
+        /* If spice graphics is configured without ports and with autoport='no'
+         * then we start qemu with Spice to not listen anywhere.  Let's convert
+         * this configuration to the new listen type='none' which does the
+         * same. */
+        if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {
+            virDomainGraphicsListenDefPtr glisten = &graphics->listens[0];
+
+            if (glisten->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS &&
+                graphics->data.spice.port == 0 &&
+                graphics->data.spice.tlsPort == 0 &&
+                !graphics->data.spice.autoport) {
+                VIR_FREE(glisten->address);
+                glisten->type = VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE;
+            }
+        }
+    }
+}
+
+
 /* Check if a drive type address $controller:$bus:$target:$unit is already
  * taken by a disk or not.
  */
@@ -4463,6 +4490,8 @@ virDomainDefPostParseInternal(virDomainDefPtr def,
     /* clean up possibly duplicated metadata entries */
     virDomainDefMetadataSanitize(def);
 
+    virDomainDefPostParseGraphics(def);
+
     return 0;
 }
 
@@ -10942,13 +10971,28 @@ virDomainGraphicsListenDefParseXML(virDomainGraphicsListenDefPtr def,
     }
     def->type = typeVal;
 
-    if (def->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET &&
-        graphics->type != VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
-        graphics->type != VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                       _("listen type 'socket' is not available for "
-                         "graphics type '%s'"), graphicsType);
-        goto error;
+    switch (def->type) {
+    case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET:
+        if (graphics->type != VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
+            graphics->type != VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("listen type 'socket' is not available for "
+                             "graphics type '%s'"), graphicsType);
+            goto error;
+        }
+        break;
+    case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE:
+        if (graphics->type != VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("listen type 'none' is not available for "
+                             "graphics type '%s'"), graphicsType);
+            goto error;
+        }
+        break;
+    case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS:
+    case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK:
+    case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST:
+        break;
     }
 
     if (def->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS) {
@@ -21753,10 +21797,8 @@ virDomainGraphicsListenDefFormat(virBufferPtr buf,
         return;
 
     virBufferAddLit(buf, "<listen");
-    if (def->type) {
-        virBufferAsprintf(buf, " type='%s'",
-                          virDomainGraphicsListenTypeToString(def->type));
-    }
+    virBufferAsprintf(buf, " type='%s'",
+                      virDomainGraphicsListenTypeToString(def->type));
 
     if (def->address &&
         (def->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS ||
@@ -21943,6 +21985,10 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
             break;
 
         case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE:
+            if (flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE)
+                virBufferAddStr(buf, " autoport='no'");
+            break;
+
         case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET:
         case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST:
             break;
@@ -21964,8 +22010,6 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
     }
 
     for (i = 0; i < def->nListens; i++) {
-        if (def->listens[i].type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE)
-            continue;
         if (flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE) {
             /* If the listen is based on config options from qemu.conf we need
              * to skip it.  It's up to user to properly configure both host for
@@ -21982,6 +22026,13 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
                 def->listens[i].type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET &&
                 !def->listens[i].autoGenerated)
                 continue;
+
+            /* The new listen type none is in the migratable XML represented as
+             * port=0 and autoport=no because old libvirt support this
+             * configuration for spice. */
+            if (def->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE &&
+                def->listens[i].type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE)
+                continue;
         }
         if (!children) {
             virBufferAddLit(buf, ">\n");
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 1b46012..d03c6e0 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -7392,6 +7392,11 @@ qemuBuildGraphicsSPICECommandLine(virQEMUDriverConfigPtr cfg,
         break;
 
     case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE:
+        /* QEMU requires either port or tls-port to be specified if there is no
+         * other argument. Use a dummy port=0. */
+        virBufferAddLit(&opt, "port=0,");
+        hasInsecure = true;
+        break;
     case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST:
         break;
     }
@@ -7539,13 +7544,7 @@ qemuBuildGraphicsSPICECommandLine(virQEMUDriverConfigPtr cfg,
     virBufferTrim(&opt, ",", -1);
 
     virCommandAddArg(cmd, "-spice");
-    /* If we did not add any SPICE arguments, add a dummy 'port=0' one
-     * as -spice alone is not allowed on QEMU command line
-     */
-    if (virBufferUse(&opt) == 0)
-        virCommandAddArg(cmd, "port=0");
-    else
-        virCommandAddArgBuffer(cmd, &opt);
+    virCommandAddArgBuffer(cmd, &opt);
     if (graphics->data.spice.keymap)
         virCommandAddArgList(cmd, "-k",
                              graphics->data.spice.keymap, NULL);
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-video-virtio-gpu-spice-gl.args b/tests/qemuxml2argvdata/qemuxml2argv-video-virtio-gpu-spice-gl.args
index b80ad16..edecca1 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-video-virtio-gpu-spice-gl.args
+++ b/tests/qemuxml2argvdata/qemuxml2argv-video-virtio-gpu-spice-gl.args
@@ -19,6 +19,6 @@ QEMU_AUDIO_DRV=spice \
 -drive file=/var/lib/libvirt/images/QEMUGuest1,format=qcow2,if=none,\
 id=drive-ide0-0-0,cache=none \
 -device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
--spice gl=on \
+-spice port=0,gl=on \
 -device virtio-vga,id=video0,virgl=on,bus=pci.0,addr=0x2 \
 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-video-virtio-gpu-spice-gl.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-video-virtio-gpu-spice-gl.xml
index a6dddab..9fb533a 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-video-virtio-gpu-spice-gl.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-video-virtio-gpu-spice-gl.xml
@@ -29,8 +29,8 @@
     <controller type='pci' index='0' model='pci-root'/>
     <input type='mouse' bus='ps2'/>
     <input type='keyboard' bus='ps2'/>
-    <graphics type='spice' autoport='no'>
-      <listen type='address'/>
+    <graphics type='spice'>
+      <listen type='none'/>
       <gl enable='yes'/>
     </graphics>
     <video>
-- 
2.8.3




More information about the libvir-list mailing list