render / rpms / libvirt

Forked from rpms/libvirt 4 months ago
Clone
Daniel P. Berrangé 0676a0
From ed5aa85f371aebb0103e712f9a103d011ab9ae43 Mon Sep 17 00:00:00 2001
Daniel P. Berrangé 0676a0
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
Daniel P. Berrangé 0676a0
Date: Wed, 4 Jul 2018 14:28:14 +0100
Daniel P. Berrangé 0676a0
Subject: [PATCH 3/4] qemu: don't use chardev FD passing for vhostuser backend
Daniel P. Berrangé 0676a0
MIME-Version: 1.0
Daniel P. Berrangé 0676a0
Content-Type: text/plain; charset=UTF-8
Daniel P. Berrangé 0676a0
Content-Transfer-Encoding: 8bit
Daniel P. Berrangé 0676a0
Daniel P. Berrangé 0676a0
QEMU chardevs have a bug which makes the vhostuser backend complain
Daniel P. Berrangé 0676a0
about lack of support for FD passing when validating the chardev.
Daniel P. Berrangé 0676a0
While this is ultimately QEMU's responsibility to fix, libvirt needs to
Daniel P. Berrangé 0676a0
avoid tickling the bug.
Daniel P. Berrangé 0676a0
Daniel P. Berrangé 0676a0
Simply disabling chardev FD passing just for vhostuser's chardev is
Daniel P. Berrangé 0676a0
the most prudent approach, avoiding need for a QEMU version number
Daniel P. Berrangé 0676a0
check.
Daniel P. Berrangé 0676a0
Daniel P. Berrangé 0676a0
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Daniel P. Berrangé 0676a0
---
Daniel P. Berrangé 0676a0
 src/qemu/qemu_command.c                   | 31 +++++++++++++++--------
Daniel P. Berrangé 0676a0
 tests/qemuxml2argvdata/net-vhostuser.args |  3 +--
Daniel P. Berrangé 0676a0
 tests/qemuxml2argvtest.c                  |  2 +-
Daniel P. Berrangé 0676a0
 3 files changed, 23 insertions(+), 13 deletions(-)
Daniel P. Berrangé 0676a0
Daniel P. Berrangé 0676a0
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
Daniel P. Berrangé 0676a0
index 63c7ac0f82..82d8030a33 100644
Daniel P. Berrangé 0676a0
--- a/src/qemu/qemu_command.c
Daniel P. Berrangé 0676a0
+++ b/src/qemu/qemu_command.c
Daniel P. Berrangé 0676a0
@@ -4939,6 +4939,7 @@ qemuOpenChrChardevUNIXSocket(const virDomainChrSourceDef *dev)
Daniel P. Berrangé 0676a0
 enum {
Daniel P. Berrangé 0676a0
     QEMU_BUILD_CHARDEV_TCP_NOWAIT = (1 << 0),
Daniel P. Berrangé 0676a0
     QEMU_BUILD_CHARDEV_FILE_LOGD  = (1 << 1),
Daniel P. Berrangé 0676a0
+    QEMU_BUILD_CHARDEV_UNIX_FD_PASS = (1 << 2),
Daniel P. Berrangé 0676a0
 };
Daniel P. Berrangé 0676a0
 
Daniel P. Berrangé 0676a0
 /* This function outputs a -chardev command line option which describes only the
Daniel P. Berrangé 0676a0
@@ -5082,7 +5083,8 @@ qemuBuildChrChardevStr(virLogManagerPtr logManager,
Daniel P. Berrangé 0676a0
         break;
Daniel P. Berrangé 0676a0
 
Daniel P. Berrangé 0676a0
     case VIR_DOMAIN_CHR_TYPE_UNIX:
Daniel P. Berrangé 0676a0
-        if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_FD_PASS)) {
Daniel P. Berrangé 0676a0
+        if ((flags & QEMU_BUILD_CHARDEV_UNIX_FD_PASS) &&
Daniel P. Berrangé 0676a0
+            virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_FD_PASS)) {
Daniel P. Berrangé 0676a0
             if (qemuSecuritySetSocketLabel(secManager, (virDomainDefPtr)def) < 0)
Daniel P. Berrangé 0676a0
                 goto cleanup;
Daniel P. Berrangé 0676a0
             int fd = qemuOpenChrChardevUNIXSocket(dev);
Daniel P. Berrangé 0676a0
@@ -5438,7 +5440,8 @@ qemuBuildMonitorCommandLine(virLogManagerPtr logManager,
Daniel P. Berrangé 0676a0
                             qemuDomainObjPrivatePtr priv)
Daniel P. Berrangé 0676a0
 {
Daniel P. Berrangé 0676a0
     char *chrdev;
Daniel P. Berrangé 0676a0
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
Daniel P. Berrangé 0676a0
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
Daniel P. Berrangé 0676a0
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
Daniel P. Berrangé 0676a0
     if (priv->chardevStdioLogd)
Daniel P. Berrangé 0676a0
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
Daniel P. Berrangé 0676a0
 
Daniel P. Berrangé 0676a0
@@ -5573,7 +5576,8 @@ qemuBuildRNGBackendChrdevStr(virLogManagerPtr logManager,
Daniel P. Berrangé 0676a0
                              char **chr,
Daniel P. Berrangé 0676a0
                              bool chardevStdioLogd)
Daniel P. Berrangé 0676a0
 {
Daniel P. Berrangé 0676a0
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
Daniel P. Berrangé 0676a0
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
Daniel P. Berrangé 0676a0
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
Daniel P. Berrangé 0676a0
     if (chardevStdioLogd)
Daniel P. Berrangé 0676a0
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
Daniel P. Berrangé 0676a0
     *chr = NULL;
Daniel P. Berrangé 0676a0
@@ -8712,7 +8716,8 @@ qemuBuildSmartcardCommandLine(virLogManagerPtr logManager,
Daniel P. Berrangé 0676a0
     virBuffer opt = VIR_BUFFER_INITIALIZER;
Daniel P. Berrangé 0676a0
     const char *database;
Daniel P. Berrangé 0676a0
     const char *contAlias = NULL;
Daniel P. Berrangé 0676a0
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
Daniel P. Berrangé 0676a0
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
Daniel P. Berrangé 0676a0
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
Daniel P. Berrangé 0676a0
     if (chardevStdioLogd)
Daniel P. Berrangé 0676a0
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
Daniel P. Berrangé 0676a0
 
Daniel P. Berrangé 0676a0
@@ -8948,7 +8953,8 @@ qemuBuildShmemCommandLine(virLogManagerPtr logManager,
Daniel P. Berrangé 0676a0
     virBuffer buf = VIR_BUFFER_INITIALIZER;
Daniel P. Berrangé 0676a0
     char *devstr = NULL;
Daniel P. Berrangé 0676a0
     int rc;
Daniel P. Berrangé 0676a0
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
Daniel P. Berrangé 0676a0
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
Daniel P. Berrangé 0676a0
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
Daniel P. Berrangé 0676a0
     if (chardevStdioLogd)
Daniel P. Berrangé 0676a0
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
Daniel P. Berrangé 0676a0
 
Daniel P. Berrangé 0676a0
@@ -9108,7 +9114,8 @@ qemuBuildSerialCommandLine(virLogManagerPtr logManager,
Daniel P. Berrangé 0676a0
 {
Daniel P. Berrangé 0676a0
     size_t i;
Daniel P. Berrangé 0676a0
     bool havespice = false;
Daniel P. Berrangé 0676a0
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
Daniel P. Berrangé 0676a0
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
Daniel P. Berrangé 0676a0
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
Daniel P. Berrangé 0676a0
     if (chardevStdioLogd)
Daniel P. Berrangé 0676a0
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
Daniel P. Berrangé 0676a0
 
Daniel P. Berrangé 0676a0
@@ -9171,7 +9178,8 @@ qemuBuildParallelsCommandLine(virLogManagerPtr logManager,
Daniel P. Berrangé 0676a0
                               bool chardevStdioLogd)
Daniel P. Berrangé 0676a0
 {
Daniel P. Berrangé 0676a0
     size_t i;
Daniel P. Berrangé 0676a0
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
Daniel P. Berrangé 0676a0
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
Daniel P. Berrangé 0676a0
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
Daniel P. Berrangé 0676a0
     if (chardevStdioLogd)
Daniel P. Berrangé 0676a0
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
Daniel P. Berrangé 0676a0
 
Daniel P. Berrangé 0676a0
@@ -9208,7 +9216,8 @@ qemuBuildChannelsCommandLine(virLogManagerPtr logManager,
Daniel P. Berrangé 0676a0
                              bool chardevStdioLogd)
Daniel P. Berrangé 0676a0
 {
Daniel P. Berrangé 0676a0
     size_t i;
Daniel P. Berrangé 0676a0
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
Daniel P. Berrangé 0676a0
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
Daniel P. Berrangé 0676a0
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
Daniel P. Berrangé 0676a0
     if (chardevStdioLogd)
Daniel P. Berrangé 0676a0
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
Daniel P. Berrangé 0676a0
 
Daniel P. Berrangé 0676a0
@@ -9265,7 +9274,8 @@ qemuBuildConsoleCommandLine(virLogManagerPtr logManager,
Daniel P. Berrangé 0676a0
                             bool chardevStdioLogd)
Daniel P. Berrangé 0676a0
 {
Daniel P. Berrangé 0676a0
     size_t i;
Daniel P. Berrangé 0676a0
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
Daniel P. Berrangé 0676a0
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
Daniel P. Berrangé 0676a0
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
Daniel P. Berrangé 0676a0
     if (chardevStdioLogd)
Daniel P. Berrangé 0676a0
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
Daniel P. Berrangé 0676a0
 
Daniel P. Berrangé 0676a0
@@ -9445,7 +9455,8 @@ qemuBuildRedirdevCommandLine(virLogManagerPtr logManager,
Daniel P. Berrangé 0676a0
                              bool chardevStdioLogd)
Daniel P. Berrangé 0676a0
 {
Daniel P. Berrangé 0676a0
     size_t i;
Daniel P. Berrangé 0676a0
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
Daniel P. Berrangé 0676a0
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
Daniel P. Berrangé 0676a0
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
Daniel P. Berrangé 0676a0
     if (chardevStdioLogd)
Daniel P. Berrangé 0676a0
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
Daniel P. Berrangé 0676a0
 
Daniel P. Berrangé 0676a0
diff --git a/tests/qemuxml2argvdata/net-vhostuser.args b/tests/qemuxml2argvdata/net-vhostuser.args
Daniel P. Berrangé 0676a0
index fc4557a1f2..513fc535ab 100644
Daniel P. Berrangé 0676a0
--- a/tests/qemuxml2argvdata/net-vhostuser.args
Daniel P. Berrangé 0676a0
+++ b/tests/qemuxml2argvdata/net-vhostuser.args
Daniel P. Berrangé 0676a0
@@ -14,8 +14,7 @@ QEMU_AUDIO_DRV=none \
Daniel P. Berrangé 0676a0
 -display none \
Daniel P. Berrangé 0676a0
 -no-user-config \
Daniel P. Berrangé 0676a0
 -nodefaults \
Daniel P. Berrangé 0676a0
--chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\
Daniel P. Berrangé 0676a0
-server,nowait \
Daniel P. Berrangé 0676a0
+-chardev socket,id=charmonitor,fd=1729,server,nowait \
Daniel P. Berrangé 0676a0
 -mon chardev=charmonitor,id=monitor,mode=control \
Daniel P. Berrangé 0676a0
 -rtc base=utc \
Daniel P. Berrangé 0676a0
 -no-shutdown \
Daniel P. Berrangé 0676a0
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
Daniel P. Berrangé 0676a0
index d6911f9344..2d52f352b0 100644
Daniel P. Berrangé 0676a0
--- a/tests/qemuxml2argvtest.c
Daniel P. Berrangé 0676a0
+++ b/tests/qemuxml2argvtest.c
Daniel P. Berrangé 0676a0
@@ -1266,7 +1266,7 @@ mymain(void)
Daniel P. Berrangé 0676a0
     DO_TEST("misc-no-reboot", NONE);
Daniel P. Berrangé 0676a0
     DO_TEST("misc-uuid", NONE);
Daniel P. Berrangé 0676a0
     DO_TEST_PARSE_ERROR("vhost_queues-invalid", NONE);
Daniel P. Berrangé 0676a0
-    DO_TEST("net-vhostuser", NONE);
Daniel P. Berrangé 0676a0
+    DO_TEST("net-vhostuser", QEMU_CAPS_CHARDEV_FD_PASS);
Daniel P. Berrangé 0676a0
     DO_TEST("net-vhostuser-multiq",
Daniel P. Berrangé 0676a0
             QEMU_CAPS_VHOSTUSER_MULTIQUEUE);
Daniel P. Berrangé 0676a0
     DO_TEST_FAILURE("net-vhostuser-multiq", NONE);
Daniel P. Berrangé 0676a0
-- 
Daniel P. Berrangé 0676a0
2.17.1
Daniel P. Berrangé 0676a0