9c6c51
From 2f53c51bac4f9a9c7e490a13f1510eb553046bc3 Mon Sep 17 00:00:00 2001
9c6c51
Message-Id: <2f53c51bac4f9a9c7e490a13f1510eb553046bc3@dist-git>
9c6c51
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
9c6c51
Date: Fri, 6 Jul 2018 15:47:01 +0100
9c6c51
Subject: [PATCH] qemu: don't use chardev FD passing for vhostuser backend
9c6c51
MIME-Version: 1.0
9c6c51
Content-Type: text/plain; charset=UTF-8
9c6c51
Content-Transfer-Encoding: 8bit
9c6c51
9c6c51
https://bugzilla.redhat.com/show_bug.cgi?id=1597940
9c6c51
9c6c51
QEMU chardevs have a bug which makes the vhostuser backend complain
9c6c51
about lack of support for FD passing when validating the chardev.
9c6c51
While this is ultimately QEMU's responsibility to fix, libvirt needs to
9c6c51
avoid tickling the bug.
9c6c51
9c6c51
Simply disabling chardev FD passing just for vhostuser's chardev is
9c6c51
the most prudent approach, avoiding need for a QEMU version number
9c6c51
check.
9c6c51
9c6c51
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
9c6c51
(cherry picked from commit ed5aa85f371aebb0103e712f9a103d011ab9ae43)
9c6c51
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
9c6c51
---
9c6c51
 src/qemu/qemu_command.c                   | 31 +++++++++++++++--------
9c6c51
 tests/qemuxml2argvdata/net-vhostuser.args |  3 +--
9c6c51
 tests/qemuxml2argvtest.c                  |  2 +-
9c6c51
 3 files changed, 23 insertions(+), 13 deletions(-)
9c6c51
9c6c51
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
9c6c51
index 0c3ce98caf..637e787d25 100644
9c6c51
--- a/src/qemu/qemu_command.c
9c6c51
+++ b/src/qemu/qemu_command.c
9c6c51
@@ -4938,6 +4938,7 @@ qemuOpenChrChardevUNIXSocket(const virDomainChrSourceDef *dev)
9c6c51
 enum {
9c6c51
     QEMU_BUILD_CHARDEV_TCP_NOWAIT = (1 << 0),
9c6c51
     QEMU_BUILD_CHARDEV_FILE_LOGD  = (1 << 1),
9c6c51
+    QEMU_BUILD_CHARDEV_UNIX_FD_PASS = (1 << 2),
9c6c51
 };
9c6c51
 
9c6c51
 /* This function outputs a -chardev command line option which describes only the
9c6c51
@@ -5081,7 +5082,8 @@ qemuBuildChrChardevStr(virLogManagerPtr logManager,
9c6c51
         break;
9c6c51
 
9c6c51
     case VIR_DOMAIN_CHR_TYPE_UNIX:
9c6c51
-        if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_FD_PASS)) {
9c6c51
+        if ((flags & QEMU_BUILD_CHARDEV_UNIX_FD_PASS) &&
9c6c51
+            virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_FD_PASS)) {
9c6c51
             if (qemuSecuritySetSocketLabel(secManager, (virDomainDefPtr)def) < 0)
9c6c51
                 goto cleanup;
9c6c51
             int fd = qemuOpenChrChardevUNIXSocket(dev);
9c6c51
@@ -5437,7 +5439,8 @@ qemuBuildMonitorCommandLine(virLogManagerPtr logManager,
9c6c51
                             qemuDomainObjPrivatePtr priv)
9c6c51
 {
9c6c51
     char *chrdev;
9c6c51
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
9c6c51
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
9c6c51
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
9c6c51
     if (priv->chardevStdioLogd)
9c6c51
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
9c6c51
 
9c6c51
@@ -5572,7 +5575,8 @@ qemuBuildRNGBackendChrdevStr(virLogManagerPtr logManager,
9c6c51
                              char **chr,
9c6c51
                              bool chardevStdioLogd)
9c6c51
 {
9c6c51
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
9c6c51
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
9c6c51
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
9c6c51
     if (chardevStdioLogd)
9c6c51
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
9c6c51
     *chr = NULL;
9c6c51
@@ -8740,7 +8744,8 @@ qemuBuildSmartcardCommandLine(virLogManagerPtr logManager,
9c6c51
     virBuffer opt = VIR_BUFFER_INITIALIZER;
9c6c51
     const char *database;
9c6c51
     const char *contAlias = NULL;
9c6c51
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
9c6c51
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
9c6c51
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
9c6c51
     if (chardevStdioLogd)
9c6c51
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
9c6c51
 
9c6c51
@@ -8976,7 +8981,8 @@ qemuBuildShmemCommandLine(virLogManagerPtr logManager,
9c6c51
     virBuffer buf = VIR_BUFFER_INITIALIZER;
9c6c51
     char *devstr = NULL;
9c6c51
     int rc;
9c6c51
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
9c6c51
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
9c6c51
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
9c6c51
     if (chardevStdioLogd)
9c6c51
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
9c6c51
 
9c6c51
@@ -9136,7 +9142,8 @@ qemuBuildSerialCommandLine(virLogManagerPtr logManager,
9c6c51
 {
9c6c51
     size_t i;
9c6c51
     bool havespice = false;
9c6c51
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
9c6c51
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
9c6c51
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
9c6c51
     if (chardevStdioLogd)
9c6c51
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
9c6c51
 
9c6c51
@@ -9199,7 +9206,8 @@ qemuBuildParallelsCommandLine(virLogManagerPtr logManager,
9c6c51
                               bool chardevStdioLogd)
9c6c51
 {
9c6c51
     size_t i;
9c6c51
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
9c6c51
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
9c6c51
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
9c6c51
     if (chardevStdioLogd)
9c6c51
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
9c6c51
 
9c6c51
@@ -9236,7 +9244,8 @@ qemuBuildChannelsCommandLine(virLogManagerPtr logManager,
9c6c51
                              bool chardevStdioLogd)
9c6c51
 {
9c6c51
     size_t i;
9c6c51
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
9c6c51
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
9c6c51
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
9c6c51
     if (chardevStdioLogd)
9c6c51
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
9c6c51
 
9c6c51
@@ -9293,7 +9302,8 @@ qemuBuildConsoleCommandLine(virLogManagerPtr logManager,
9c6c51
                             bool chardevStdioLogd)
9c6c51
 {
9c6c51
     size_t i;
9c6c51
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
9c6c51
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
9c6c51
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
9c6c51
     if (chardevStdioLogd)
9c6c51
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
9c6c51
 
9c6c51
@@ -9473,7 +9483,8 @@ qemuBuildRedirdevCommandLine(virLogManagerPtr logManager,
9c6c51
                              bool chardevStdioLogd)
9c6c51
 {
9c6c51
     size_t i;
9c6c51
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
9c6c51
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
9c6c51
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
9c6c51
     if (chardevStdioLogd)
9c6c51
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
9c6c51
 
9c6c51
diff --git a/tests/qemuxml2argvdata/net-vhostuser.args b/tests/qemuxml2argvdata/net-vhostuser.args
9c6c51
index fc4557a1f2..513fc535ab 100644
9c6c51
--- a/tests/qemuxml2argvdata/net-vhostuser.args
9c6c51
+++ b/tests/qemuxml2argvdata/net-vhostuser.args
9c6c51
@@ -14,8 +14,7 @@ QEMU_AUDIO_DRV=none \
9c6c51
 -display none \
9c6c51
 -no-user-config \
9c6c51
 -nodefaults \
9c6c51
--chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\
9c6c51
-server,nowait \
9c6c51
+-chardev socket,id=charmonitor,fd=1729,server,nowait \
9c6c51
 -mon chardev=charmonitor,id=monitor,mode=control \
9c6c51
 -rtc base=utc \
9c6c51
 -no-shutdown \
9c6c51
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
9c6c51
index d6911f9344..2d52f352b0 100644
9c6c51
--- a/tests/qemuxml2argvtest.c
9c6c51
+++ b/tests/qemuxml2argvtest.c
9c6c51
@@ -1266,7 +1266,7 @@ mymain(void)
9c6c51
     DO_TEST("misc-no-reboot", NONE);
9c6c51
     DO_TEST("misc-uuid", NONE);
9c6c51
     DO_TEST_PARSE_ERROR("vhost_queues-invalid", NONE);
9c6c51
-    DO_TEST("net-vhostuser", NONE);
9c6c51
+    DO_TEST("net-vhostuser", QEMU_CAPS_CHARDEV_FD_PASS);
9c6c51
     DO_TEST("net-vhostuser-multiq",
9c6c51
             QEMU_CAPS_VHOSTUSER_MULTIQUEUE);
9c6c51
     DO_TEST_FAILURE("net-vhostuser-multiq", NONE);
9c6c51
-- 
9c6c51
2.18.0
9c6c51