]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: don't use chardev FD passing for vhostuser backend
authorDaniel P. Berrangé <berrange@redhat.com>
Wed, 4 Jul 2018 13:28:14 +0000 (14:28 +0100)
committerDaniel P. Berrangé <berrange@redhat.com>
Fri, 6 Jul 2018 13:31:29 +0000 (14:31 +0100)
QEMU chardevs have a bug which makes the vhostuser backend complain
about lack of support for FD passing when validating the chardev.
While this is ultimately QEMU's responsibility to fix, libvirt needs to
avoid tickling the bug.

Simply disabling chardev FD passing just for vhostuser's chardev is
the most prudent approach, avoiding need for a QEMU version number
check.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
(cherry picked from commit ed5aa85f371aebb0103e712f9a103d011ab9ae43)

src/qemu/qemu_command.c
tests/qemuxml2argvdata/net-vhostuser.args
tests/qemuxml2argvtest.c

index 0ee08826a5707a0df1f88e90f5e221b0394e276c..c1103809ceb07d9d1a120383a39feebd18ab3f07 100644 (file)
@@ -4938,6 +4938,7 @@ qemuOpenChrChardevUNIXSocket(const virDomainChrSourceDef *dev)
 enum {
     QEMU_BUILD_CHARDEV_TCP_NOWAIT = (1 << 0),
     QEMU_BUILD_CHARDEV_FILE_LOGD  = (1 << 1),
+    QEMU_BUILD_CHARDEV_UNIX_FD_PASS = (1 << 2),
 };
 
 /* This function outputs a -chardev command line option which describes only the
@@ -5081,7 +5082,8 @@ qemuBuildChrChardevStr(virLogManagerPtr logManager,
         break;
 
     case VIR_DOMAIN_CHR_TYPE_UNIX:
-        if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_FD_PASS)) {
+        if ((flags & QEMU_BUILD_CHARDEV_UNIX_FD_PASS) &&
+            virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_FD_PASS)) {
             if (qemuSecuritySetSocketLabel(secManager, (virDomainDefPtr)def) < 0)
                 goto cleanup;
             int fd = qemuOpenChrChardevUNIXSocket(dev);
@@ -5437,7 +5439,8 @@ qemuBuildMonitorCommandLine(virLogManagerPtr logManager,
                             qemuDomainObjPrivatePtr priv)
 {
     char *chrdev;
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
     if (priv->chardevStdioLogd)
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
 
@@ -5572,7 +5575,8 @@ qemuBuildRNGBackendChrdevStr(virLogManagerPtr logManager,
                              char **chr,
                              bool chardevStdioLogd)
 {
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
     if (chardevStdioLogd)
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
     *chr = NULL;
@@ -8691,7 +8695,8 @@ qemuBuildSmartcardCommandLine(virLogManagerPtr logManager,
     virBuffer opt = VIR_BUFFER_INITIALIZER;
     const char *database;
     const char *contAlias = NULL;
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
     if (chardevStdioLogd)
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
 
@@ -8927,7 +8932,8 @@ qemuBuildShmemCommandLine(virLogManagerPtr logManager,
     virBuffer buf = VIR_BUFFER_INITIALIZER;
     char *devstr = NULL;
     int rc;
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
     if (chardevStdioLogd)
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
 
@@ -9087,7 +9093,8 @@ qemuBuildSerialCommandLine(virLogManagerPtr logManager,
 {
     size_t i;
     bool havespice = false;
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
     if (chardevStdioLogd)
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
 
@@ -9150,7 +9157,8 @@ qemuBuildParallelsCommandLine(virLogManagerPtr logManager,
                               bool chardevStdioLogd)
 {
     size_t i;
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
     if (chardevStdioLogd)
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
 
@@ -9187,7 +9195,8 @@ qemuBuildChannelsCommandLine(virLogManagerPtr logManager,
                              bool chardevStdioLogd)
 {
     size_t i;
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
     if (chardevStdioLogd)
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
 
@@ -9244,7 +9253,8 @@ qemuBuildConsoleCommandLine(virLogManagerPtr logManager,
                             bool chardevStdioLogd)
 {
     size_t i;
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
     if (chardevStdioLogd)
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
 
@@ -9424,7 +9434,8 @@ qemuBuildRedirdevCommandLine(virLogManagerPtr logManager,
                              bool chardevStdioLogd)
 {
     size_t i;
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT;
+    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
+        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
     if (chardevStdioLogd)
         cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
 
index fc4557a1f2476d5e4f546d566756410f713c40a4..513fc535ab2253c0176e4e8a37ac54f799cadc6c 100644 (file)
@@ -14,8 +14,7 @@ QEMU_AUDIO_DRV=none \
 -display none \
 -no-user-config \
 -nodefaults \
--chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\
-server,nowait \
+-chardev socket,id=charmonitor,fd=1729,server,nowait \
 -mon chardev=charmonitor,id=monitor,mode=control \
 -rtc base=utc \
 -no-shutdown \
index c279ac4975cf039a16827335f5d39f1fc1aa65dc..a9d25cd80d2de96e37546b24e42039e06b707fa7 100644 (file)
@@ -1266,7 +1266,7 @@ mymain(void)
     DO_TEST("misc-no-reboot", NONE);
     DO_TEST("misc-uuid", NONE);
     DO_TEST_PARSE_ERROR("vhost_queues-invalid", NONE);
-    DO_TEST("net-vhostuser", NONE);
+    DO_TEST("net-vhostuser", QEMU_CAPS_CHARDEV_FD_PASS);
     DO_TEST("net-vhostuser-multiq",
             QEMU_CAPS_VHOSTUSER_MULTIQUEUE);
     DO_TEST_FAILURE("net-vhostuser-multiq", NONE);