[libvirt] [PATCH v2 12/12] spice: introduce listen type none

Pavel Hrdina phrdina at redhat.com
Wed May 11 15:08:31 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'.

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

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 8f3e17f..35bbf3f 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -5375,6 +5375,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.5</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 only by <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 e3dbcc6..c1a26a8 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -3024,6 +3024,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 86b211c..99712ff 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -10809,13 +10809,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) {
@@ -10900,6 +10915,7 @@ virDomainGraphicsListensParseXML(virDomainGraphicsDefPtr def,
     xmlNodePtr *listenNodes = NULL;
     xmlNodePtr save = ctxt->node;
     virDomainGraphicsListenDef newListen = {0};
+    virDomainGraphicsListenDefPtr glisten = NULL;
     char *socketPath = NULL;
     int nListens;
     int ret = -1;
@@ -10953,6 +10969,19 @@ virDomainGraphicsListensParseXML(virDomainGraphicsDefPtr def,
             goto error;
     }
 
+    /* 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 (def->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {
+        glisten = &def->listens[0];
+
+        if (glisten->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS &&
+            glisten->port == 0 && glisten->tlsPort == 0 && !glisten->autoport) {
+            VIR_FREE(glisten->address);
+            glisten->type = VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE;
+        }
+    }
+
     ret = 0;
  error:
     if (ret < 0)
@@ -21429,10 +21458,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 ||
@@ -21609,6 +21636,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;
@@ -21630,8 +21661,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 (def->listens[i].fromConfig)
                 continue;
@@ -21644,6 +21673,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 b911076..64b383d 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -7635,6 +7635,9 @@ qemuBuildGraphicsSPICECommandLine(virQEMUDriverConfigPtr cfg,
         break;
 
     case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE:
+        /* QEMU requires either port or tls-port to be specified */
+        virBufferAddLit(&opt, "port=0,");
+        break;
     case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST:
         break;
     }
@@ -7755,13 +7758,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 fd260ea..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' autoport='no'/>
+    <graphics type='spice'>
+      <listen type='none'/>
       <gl enable='yes'/>
     </graphics>
     <video>
-- 
2.8.2




More information about the libvir-list mailing list