All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v2 0/9] vhost: enable for all targets
@ 2019-02-14 17:35 Paolo Bonzini
  2019-02-14 17:35 ` [Qemu-devel] [PATCH 1/9] vhost-net: move stubs to a separate file Paolo Bonzini
                   ` (10 more replies)
  0 siblings, 11 replies; 15+ messages in thread
From: Paolo Bonzini @ 2019-02-14 17:35 UTC (permalink / raw)
  To: qemu-devel; +Cc: thuth, mst

See also "[PATCH for-3.2 00/10] vhost: preparation for qgraph
conversion of vhost-user-test".  Some of the other vhost-user-test
patches have gone in already, and this is what is left.

These patches are a prerequisite for both kconfig and qgraph.

I will probably test them on macOS myself before these are included
in a pull request, since the previous versions had some issues.
Michael, let me know if you want me to send the pull request.

Thanks,

Paolo

Paolo Bonzini (9):
  vhost-net: move stubs to a separate file
  vhost-net-user: add stubs for when no virtio-net device is present
  vhost: restrict Linux dependency to kernel vhost
  vhost-user: support cross-endian vnet headers
  vhost-net: compile it on all targets that have virtio-net.
  vhost-net: revamp configure logic
  vhost-user-test: create a main loop per TestServer
  vhost-user-test: small changes to init_hugepagefs
  vhost-user-test: create a temporary directory per TestServer

 backends/Makefile.objs     |   5 +-
 configure                  | 102 ++++++++++++++++++-----------
 default-configs/virtio.mak |   4 +-
 hw/net/Makefile.objs       |   4 +-
 hw/net/vhost_net-stub.c    |  92 ++++++++++++++++++++++++++
 hw/net/vhost_net.c         |  85 ++----------------------
 hw/virtio/Makefile.objs    |   8 ++-
 hw/virtio/vhost-backend.c  |  12 +++-
 hw/virtio/vhost-user.c     |  13 +++-
 hw/virtio/vhost.c          |   2 +-
 include/exec/poison.h      |   1 -
 net/Makefile.objs          |   4 +-
 net/net.c                  |   2 +-
 net/vhost-user-stub.c      |  23 +++++++
 net/vhost-user.c           |  13 ++++
 tests/Makefile.include     |   5 +-
 tests/vhost-user-test.c    | 160 +++++++++++++++++++++++----------------------
 17 files changed, 319 insertions(+), 216 deletions(-)
 create mode 100644 hw/net/vhost_net-stub.c
 create mode 100644 net/vhost-user-stub.c

-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [Qemu-devel] [PATCH 1/9] vhost-net: move stubs to a separate file
  2019-02-14 17:35 [Qemu-devel] [PATCH v2 0/9] vhost: enable for all targets Paolo Bonzini
@ 2019-02-14 17:35 ` Paolo Bonzini
  2019-02-14 17:35 ` [Qemu-devel] [PATCH 2/9] vhost-net-user: add stubs for when no virtio-net device is present Paolo Bonzini
                   ` (9 subsequent siblings)
  10 siblings, 0 replies; 15+ messages in thread
From: Paolo Bonzini @ 2019-02-14 17:35 UTC (permalink / raw)
  To: qemu-devel; +Cc: thuth, mst

There is no reason for CONFIG_VHOST_NET to be specific to a single target;
it is a host feature that can be add to all targets, as long as they support
the virtio-net device.  Currently CONFIG_VHOST_NET depends on CONFIG_KVM,
but ioeventfd support is present in the core memory API and works with
other accelerators as well.

As a first step, move the vhost-net stubs to a separate file.  Later, they
will become conditional on CONFIG_VIRTIO_NET, which is not available in .c
files.

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-Id: <1543851204-41186-2-git-send-email-pbonzini@redhat.com>
---
 hw/net/Makefile.objs    |  4 ++-
 hw/net/vhost_net-stub.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++
 hw/net/vhost_net.c      | 74 ---------------------------------------
 3 files changed, 95 insertions(+), 75 deletions(-)
 create mode 100644 hw/net/vhost_net-stub.c

diff --git a/hw/net/Makefile.objs b/hw/net/Makefile.objs
index a43351a..acfaea5 100644
--- a/hw/net/Makefile.objs
+++ b/hw/net/Makefile.objs
@@ -37,7 +37,9 @@ obj-$(CONFIG_PSERIES) += spapr_llan.o
 obj-$(CONFIG_XILINX_ETHLITE) += xilinx_ethlite.o
 
 obj-$(CONFIG_VIRTIO_NET) += virtio-net.o
-obj-y += vhost_net.o
+obj-$(CONFIG_VHOST_NET) += vhost_net.o
+common-obj-$(call lnot,$(CONFIG_VHOST_NET)) += vhost_net-stub.o
+common-obj-$(CONFIG_ALL) += vhost_net-stub.o
 
 obj-$(CONFIG_ETSEC) += fsl_etsec/etsec.o fsl_etsec/registers.o \
 			fsl_etsec/rings.o fsl_etsec/miim.o
diff --git a/hw/net/vhost_net-stub.c b/hw/net/vhost_net-stub.c
new file mode 100644
index 0000000..aac0e98
--- /dev/null
+++ b/hw/net/vhost_net-stub.c
@@ -0,0 +1,92 @@
+/*
+ * vhost-net support
+ *
+ * Copyright Red Hat, Inc. 2010
+ *
+ * Authors:
+ *  Michael S. Tsirkin <mst@redhat.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#include "qemu/osdep.h"
+#include "net/net.h"
+#include "net/tap.h"
+#include "net/vhost-user.h"
+
+#include "hw/virtio/virtio-net.h"
+#include "net/vhost_net.h"
+#include "qemu/error-report.h"
+
+
+uint64_t vhost_net_get_max_queues(VHostNetState *net)
+{
+    return 1;
+}
+
+struct vhost_net *vhost_net_init(VhostNetOptions *options)
+{
+    error_report("vhost-net support is not compiled in");
+    return NULL;
+}
+
+int vhost_net_start(VirtIODevice *dev,
+                    NetClientState *ncs,
+                    int total_queues)
+{
+    return -ENOSYS;
+}
+void vhost_net_stop(VirtIODevice *dev,
+                    NetClientState *ncs,
+                    int total_queues)
+{
+}
+
+void vhost_net_cleanup(struct vhost_net *net)
+{
+}
+
+uint64_t vhost_net_get_features(struct vhost_net *net, uint64_t features)
+{
+    return features;
+}
+
+void vhost_net_ack_features(struct vhost_net *net, uint64_t features)
+{
+}
+
+uint64_t vhost_net_get_acked_features(VHostNetState *net)
+{
+    return 0;
+}
+
+bool vhost_net_virtqueue_pending(VHostNetState *net, int idx)
+{
+    return false;
+}
+
+void vhost_net_virtqueue_mask(VHostNetState *net, VirtIODevice *dev,
+                              int idx, bool mask)
+{
+}
+
+int vhost_net_notify_migration_done(struct vhost_net *net, char* mac_addr)
+{
+    return -1;
+}
+
+VHostNetState *get_vhost_net(NetClientState *nc)
+{
+    return 0;
+}
+
+int vhost_set_vring_enable(NetClientState *nc, int enable)
+{
+    return 0;
+}
+
+int vhost_net_set_mtu(struct vhost_net *net, uint16_t mtu)
+{
+    return 0;
+}
diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
index e037db6..b901306 100644
--- a/hw/net/vhost_net.c
+++ b/hw/net/vhost_net.c
@@ -23,7 +23,6 @@
 #include "qemu/error-report.h"
 
 
-#ifdef CONFIG_VHOST_NET
 #include <linux/vhost.h>
 #include <sys/socket.h>
 #include <linux/kvm.h>
@@ -449,76 +448,3 @@ int vhost_net_set_mtu(struct vhost_net *net, uint16_t mtu)
 
     return vhost_ops->vhost_net_set_mtu(&net->dev, mtu);
 }
-
-#else
-uint64_t vhost_net_get_max_queues(VHostNetState *net)
-{
-    return 1;
-}
-
-struct vhost_net *vhost_net_init(VhostNetOptions *options)
-{
-    error_report("vhost-net support is not compiled in");
-    return NULL;
-}
-
-int vhost_net_start(VirtIODevice *dev,
-                    NetClientState *ncs,
-                    int total_queues)
-{
-    return -ENOSYS;
-}
-void vhost_net_stop(VirtIODevice *dev,
-                    NetClientState *ncs,
-                    int total_queues)
-{
-}
-
-void vhost_net_cleanup(struct vhost_net *net)
-{
-}
-
-uint64_t vhost_net_get_features(struct vhost_net *net, uint64_t features)
-{
-    return features;
-}
-
-void vhost_net_ack_features(struct vhost_net *net, uint64_t features)
-{
-}
-
-uint64_t vhost_net_get_acked_features(VHostNetState *net)
-{
-    return 0;
-}
-
-bool vhost_net_virtqueue_pending(VHostNetState *net, int idx)
-{
-    return false;
-}
-
-void vhost_net_virtqueue_mask(VHostNetState *net, VirtIODevice *dev,
-                              int idx, bool mask)
-{
-}
-
-int vhost_net_notify_migration_done(struct vhost_net *net, char* mac_addr)
-{
-    return -1;
-}
-
-VHostNetState *get_vhost_net(NetClientState *nc)
-{
-    return 0;
-}
-
-int vhost_set_vring_enable(NetClientState *nc, int enable)
-{
-    return 0;
-}
-
-int vhost_net_set_mtu(struct vhost_net *net, uint16_t mtu)
-{
-    return 0;
-}
-#endif
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [Qemu-devel] [PATCH 2/9] vhost-net-user: add stubs for when no virtio-net device is present
  2019-02-14 17:35 [Qemu-devel] [PATCH v2 0/9] vhost: enable for all targets Paolo Bonzini
  2019-02-14 17:35 ` [Qemu-devel] [PATCH 1/9] vhost-net: move stubs to a separate file Paolo Bonzini
@ 2019-02-14 17:35 ` Paolo Bonzini
  2019-02-14 17:35 ` [Qemu-devel] [PATCH 3/9] vhost: restrict Linux dependency to kernel vhost Paolo Bonzini
                   ` (8 subsequent siblings)
  10 siblings, 0 replies; 15+ messages in thread
From: Paolo Bonzini @ 2019-02-14 17:35 UTC (permalink / raw)
  To: qemu-devel; +Cc: thuth, mst

hw/net/vhost_net.c needs functions that are declared in net/vhost-user.c: the
vhost-user code is always compiled into QEMU, only the constructor
net_init_vhost_user is unreachable.  Also, net/vhost-user.c needs functions
declared in hw/virtio/vhost-stub.c even if no virtio device exists.

Break this dependency.  First, add a minimal version of net/vhost-user.c,
with no functionality and no dependency on vhost code.  Second, #ifdef out
the calls back to net/vhost-user.c from hw/net/vhost_net.c.

While at it, this patch fixes the CONFIG_VHOST_NET_USE*D* typo.

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Message-Id: <1543851204-41186-3-git-send-email-pbonzini@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 configure             |  2 +-
 hw/net/vhost_net.c    |  4 ++++
 net/Makefile.objs     |  4 +++-
 net/net.c             |  2 +-
 net/vhost-user-stub.c | 23 +++++++++++++++++++++++
 5 files changed, 32 insertions(+), 3 deletions(-)
 create mode 100644 net/vhost-user-stub.c

diff --git a/configure b/configure
index fbd0825..7ac76ec 100755
--- a/configure
+++ b/configure
@@ -6579,7 +6579,7 @@ if test "$vhost_scsi" = "yes" ; then
   echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
 fi
 if test "$vhost_net" = "yes" && test "$vhost_user" = "yes"; then
-  echo "CONFIG_VHOST_NET_USED=y" >> $config_host_mak
+  echo "CONFIG_VHOST_NET_USER=y" >> $config_host_mak
 fi
 if test "$vhost_crypto" = "yes" ; then
   echo "CONFIG_VHOST_CRYPTO=y" >> $config_host_mak
diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
index b901306..2a300ee 100644
--- a/hw/net/vhost_net.c
+++ b/hw/net/vhost_net.c
@@ -193,6 +193,7 @@ struct vhost_net *vhost_net_init(VhostNetOptions *options)
     }
 
     /* Set sane init value. Override when guest acks. */
+#ifdef CONFIG_VHOST_NET_USER
     if (net->nc->info->type == NET_CLIENT_DRIVER_VHOST_USER) {
         features = vhost_user_get_acked_features(net->nc);
         if (~net->dev.features & features) {
@@ -202,6 +203,7 @@ struct vhost_net *vhost_net_init(VhostNetOptions *options)
             goto fail;
         }
     }
+#endif
 
     vhost_net_ack_features(net, features);
 
@@ -413,10 +415,12 @@ VHostNetState *get_vhost_net(NetClientState *nc)
     case NET_CLIENT_DRIVER_TAP:
         vhost_net = tap_get_vhost_net(nc);
         break;
+#ifdef CONFIG_VHOST_NET_USER
     case NET_CLIENT_DRIVER_VHOST_USER:
         vhost_net = vhost_user_get_vhost_net(nc);
         assert(vhost_net);
         break;
+#endif
     default:
         break;
     }
diff --git a/net/Makefile.objs b/net/Makefile.objs
index b2bf88a..df2b409 100644
--- a/net/Makefile.objs
+++ b/net/Makefile.objs
@@ -3,7 +3,9 @@ common-obj-y += socket.o
 common-obj-y += dump.o
 common-obj-y += eth.o
 common-obj-$(CONFIG_L2TPV3) += l2tpv3.o
-common-obj-$(CONFIG_POSIX) += vhost-user.o
+common-obj-$(call land,$(CONFIG_VIRTIO_NET),$(CONFIG_VHOST_NET_USER)) += vhost-user.o
+common-obj-$(call land,$(call lnot,$(CONFIG_VIRTIO_NET)),$(CONFIG_VHOST_NET_USER)) += vhost-user-stub.o
+common-obj-$(CONFIG_ALL) += vhost-user-stub.o
 common-obj-$(CONFIG_SLIRP) += slirp.o
 common-obj-$(CONFIG_VDE) += vde.o
 common-obj-$(CONFIG_NETMAP) += netmap.o
diff --git a/net/net.c b/net/net.c
index 5dcff7f..f3a3c54 100644
--- a/net/net.c
+++ b/net/net.c
@@ -961,7 +961,7 @@ static int (* const net_client_init_fun[NET_CLIENT_DRIVER__MAX])(
         [NET_CLIENT_DRIVER_BRIDGE]    = net_init_bridge,
 #endif
         [NET_CLIENT_DRIVER_HUBPORT]   = net_init_hubport,
-#ifdef CONFIG_VHOST_NET_USED
+#ifdef CONFIG_VHOST_NET_USER
         [NET_CLIENT_DRIVER_VHOST_USER] = net_init_vhost_user,
 #endif
 #ifdef CONFIG_L2TPV3
diff --git a/net/vhost-user-stub.c b/net/vhost-user-stub.c
new file mode 100644
index 0000000..52ab4e1
--- /dev/null
+++ b/net/vhost-user-stub.c
@@ -0,0 +1,23 @@
+/*
+ * vhost-user-stub.c
+ *
+ * Copyright (c) 2018 Red Hat, Inc.
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ *
+ */
+
+#include "qemu/osdep.h"
+#include "clients.h"
+#include "net/vhost_net.h"
+#include "net/vhost-user.h"
+#include "qemu/error-report.h"
+#include "qapi/error.h"
+
+int net_init_vhost_user(const Netdev *netdev, const char *name,
+                        NetClientState *peer, Error **errp)
+{
+    error_setg(errp, "vhost-user requires frontend driver virtio-net-*");
+    return -1;
+}
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [Qemu-devel] [PATCH 3/9] vhost: restrict Linux dependency to kernel vhost
  2019-02-14 17:35 [Qemu-devel] [PATCH v2 0/9] vhost: enable for all targets Paolo Bonzini
  2019-02-14 17:35 ` [Qemu-devel] [PATCH 1/9] vhost-net: move stubs to a separate file Paolo Bonzini
  2019-02-14 17:35 ` [Qemu-devel] [PATCH 2/9] vhost-net-user: add stubs for when no virtio-net device is present Paolo Bonzini
@ 2019-02-14 17:35 ` Paolo Bonzini
  2019-02-14 17:35 ` [Qemu-devel] [PATCH 4/9] vhost-user: support cross-endian vnet headers Paolo Bonzini
                   ` (7 subsequent siblings)
  10 siblings, 0 replies; 15+ messages in thread
From: Paolo Bonzini @ 2019-02-14 17:35 UTC (permalink / raw)
  To: qemu-devel; +Cc: thuth, mst

vhost-user does not depend on Linux; it can run on any POSIX system.  Restrict
vhost-kernel to Linux in hw/virtio/vhost-backend.c, everything else can be
compiled on all POSIX systems.

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Message-Id: <1543851204-41186-4-git-send-email-pbonzini@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 backends/Makefile.objs     |  5 ++---
 default-configs/virtio.mak |  4 ++--
 hw/net/vhost_net.c         |  3 +--
 hw/virtio/Makefile.objs    |  8 +++++---
 hw/virtio/vhost-backend.c  | 12 ++++++++++--
 hw/virtio/vhost-user.c     | 13 ++++++++++++-
 hw/virtio/vhost.c          |  2 +-
 7 files changed, 33 insertions(+), 14 deletions(-)

diff --git a/backends/Makefile.objs b/backends/Makefile.objs
index 717fcbd..ff619d3 100644
--- a/backends/Makefile.objs
+++ b/backends/Makefile.objs
@@ -9,10 +9,9 @@ common-obj-$(CONFIG_POSIX) += hostmem-file.o
 common-obj-y += cryptodev.o
 common-obj-y += cryptodev-builtin.o
 
-ifeq ($(CONFIG_VIRTIO),y)
+ifeq ($(CONFIG_VIRTIO_CRYPTO),y)
 common-obj-y += cryptodev-vhost.o
-common-obj-$(call land,$(CONFIG_VHOST_USER),$(CONFIG_LINUX)) += \
-    cryptodev-vhost-user.o
+common-obj-$(CONFIG_VHOST_CRYPTO) += cryptodev-vhost-user.o
 endif
 
 common-obj-$(CONFIG_LINUX) += hostmem-memfd.o
diff --git a/default-configs/virtio.mak b/default-configs/virtio.mak
index ecb4420..b653aa0 100644
--- a/default-configs/virtio.mak
+++ b/default-configs/virtio.mak
@@ -1,5 +1,5 @@
-CONFIG_VHOST_USER_SCSI=$(call land,$(CONFIG_VHOST_USER),$(CONFIG_LINUX))
-CONFIG_VHOST_USER_BLK=$(call land,$(CONFIG_VHOST_USER),$(CONFIG_LINUX))
+CONFIG_VHOST_USER_SCSI=$(CONFIG_VHOST_USER)
+CONFIG_VHOST_USER_BLK=$(CONFIG_VHOST_USER)
 CONFIG_VIRTIO=y
 CONFIG_VIRTIO_9P=$(CONFIG_VIRTFS)
 CONFIG_VIRTIO_BALLOON=y
diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
index 2a300ee..ae3ca23 100644
--- a/hw/net/vhost_net.c
+++ b/hw/net/vhost_net.c
@@ -18,14 +18,13 @@
 #include "net/tap.h"
 #include "net/vhost-user.h"
 
+#include "standard-headers/linux/vhost_types.h"
 #include "hw/virtio/virtio-net.h"
 #include "net/vhost_net.h"
 #include "qemu/error-report.h"
 
 
-#include <linux/vhost.h>
 #include <sys/socket.h>
-#include <linux/kvm.h>
 #include <netpacket/packet.h>
 #include <net/ethernet.h>
 #include <net/if.h>
diff --git a/hw/virtio/Makefile.objs b/hw/virtio/Makefile.objs
index d335dd0..ce542e7 100644
--- a/hw/virtio/Makefile.objs
+++ b/hw/virtio/Makefile.objs
@@ -2,15 +2,18 @@ ifeq ($(CONFIG_VIRTIO),y)
 common-obj-y += virtio-bus.o
 obj-y += virtio.o
 
+obj-$(call lor,$(CONFIG_VHOST_USER),$(CONFIG_LINUX)) += vhost.o vhost-backend.o
+common-obj-$(call lnot,$(call lor,$(CONFIG_VHOST_USER),$(CONFIG_LINUX))) += vhost-stub.o
+obj-$(CONFIG_VHOST_USER) += vhost-user.o
+
 common-obj-$(CONFIG_VIRTIO_RNG) += virtio-rng.o
 common-obj-$(CONFIG_VIRTIO_PCI) += virtio-pci.o
 common-obj-$(CONFIG_VIRTIO_MMIO) += virtio-mmio.o
 obj-$(CONFIG_VIRTIO_BALLOON) += virtio-balloon.o
 obj-$(CONFIG_VIRTIO_CRYPTO) += virtio-crypto.o
 obj-$(call land,$(CONFIG_VIRTIO_CRYPTO),$(CONFIG_VIRTIO_PCI)) += virtio-crypto-pci.o
-
-obj-$(CONFIG_LINUX) += vhost.o vhost-backend.o vhost-user.o
 obj-$(CONFIG_VHOST_VSOCK) += vhost-vsock.o
+
 ifeq ($(CONFIG_VIRTIO_PCI),y)
 obj-$(CONFIG_VHOST_VSOCK) += vhost-vsock-pci.o
 obj-$(CONFIG_VHOST_USER_BLK) += vhost-user-blk-pci.o
@@ -28,5 +31,4 @@ obj-$(CONFIG_VIRTIO_SERIAL) += virtio-serial-pci.o
 endif
 endif
 
-common-obj-$(call lnot,$(call land,$(CONFIG_VIRTIO),$(CONFIG_LINUX))) += vhost-stub.o
 common-obj-$(CONFIG_ALL) += vhost-stub.o
diff --git a/hw/virtio/vhost-backend.c b/hw/virtio/vhost-backend.c
index 7f09efa..e0f0bb7 100644
--- a/hw/virtio/vhost-backend.c
+++ b/hw/virtio/vhost-backend.c
@@ -9,11 +9,14 @@
  */
 
 #include "qemu/osdep.h"
-#include <linux/vhost.h>
-#include <sys/ioctl.h>
 #include "hw/virtio/vhost.h"
 #include "hw/virtio/vhost-backend.h"
 #include "qemu/error-report.h"
+#include "standard-headers/linux/vhost_types.h"
+
+#ifdef CONFIG_LINUX
+#include <linux/vhost.h>
+#include <sys/ioctl.h>
 
 static int vhost_kernel_call(struct vhost_dev *dev, unsigned long int request,
                              void *arg)
@@ -265,18 +268,23 @@ static const VhostOps kernel_ops = {
         .vhost_set_iotlb_callback = vhost_kernel_set_iotlb_callback,
         .vhost_send_device_iotlb_msg = vhost_kernel_send_device_iotlb_msg,
 };
+#endif
 
 int vhost_set_backend_type(struct vhost_dev *dev, VhostBackendType backend_type)
 {
     int r = 0;
 
     switch (backend_type) {
+#ifdef CONFIG_LINUX
     case VHOST_BACKEND_TYPE_KERNEL:
         dev->vhost_ops = &kernel_ops;
         break;
+#endif
+#ifdef CONFIG_VHOST_USER
     case VHOST_BACKEND_TYPE_USER:
         dev->vhost_ops = &user_ops;
         break;
+#endif
     default:
         error_report("Unknown vhost backend type");
         r = -1;
diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c
index 564a31d..0d6c64e 100644
--- a/hw/virtio/vhost-user.c
+++ b/hw/virtio/vhost-user.c
@@ -27,8 +27,12 @@
 #include <sys/ioctl.h>
 #include <sys/socket.h>
 #include <sys/un.h>
-#include <linux/vhost.h>
+
+#include "standard-headers/linux/vhost_types.h"
+
+#ifdef CONFIG_LINUX
 #include <linux/userfaultfd.h>
+#endif
 
 #define VHOST_MEMORY_MAX_NREGIONS    8
 #define VHOST_USER_F_PROTOCOL_FEATURES 30
@@ -1110,6 +1114,7 @@ out:
     return ret;
 }
 
+#ifdef CONFIG_LINUX
 /*
  * Called back from the postcopy fault thread when a fault is received on our
  * ufd.
@@ -1177,6 +1182,7 @@ static int vhost_user_postcopy_waker(struct PostCopyFD *pcfd, RAMBlock *rb,
     trace_vhost_user_postcopy_waker_nomatch(qemu_ram_get_idstr(rb), offset);
     return 0;
 }
+#endif
 
 /*
  * Called at the start of an inbound postcopy on reception of the
@@ -1184,6 +1190,7 @@ static int vhost_user_postcopy_waker(struct PostCopyFD *pcfd, RAMBlock *rb,
  */
 static int vhost_user_postcopy_advise(struct vhost_dev *dev, Error **errp)
 {
+#ifdef CONFIG_LINUX
     struct vhost_user *u = dev->opaque;
     CharBackend *chr = u->user->chr;
     int ufd;
@@ -1227,6 +1234,10 @@ static int vhost_user_postcopy_advise(struct vhost_dev *dev, Error **errp)
     u->postcopy_fd.idstr = "vhost-user"; /* Need to find unique name */
     postcopy_register_shared_ufd(&u->postcopy_fd);
     return 0;
+#else
+    error_setg(errp, "Postcopy not supported on non-Linux systems");
+    return -1;
+#endif
 }
 
 /*
diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
index 569c405..311432f 100644
--- a/hw/virtio/vhost.c
+++ b/hw/virtio/vhost.c
@@ -21,7 +21,7 @@
 #include "qemu/range.h"
 #include "qemu/error-report.h"
 #include "qemu/memfd.h"
-#include <linux/vhost.h>
+#include "standard-headers/linux/vhost_types.h"
 #include "exec/address-spaces.h"
 #include "hw/virtio/virtio-bus.h"
 #include "hw/virtio/virtio-access.h"
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [Qemu-devel] [PATCH 4/9] vhost-user: support cross-endian vnet headers
  2019-02-14 17:35 [Qemu-devel] [PATCH v2 0/9] vhost: enable for all targets Paolo Bonzini
                   ` (2 preceding siblings ...)
  2019-02-14 17:35 ` [Qemu-devel] [PATCH 3/9] vhost: restrict Linux dependency to kernel vhost Paolo Bonzini
@ 2019-02-14 17:35 ` Paolo Bonzini
  2019-02-14 17:35 ` [Qemu-devel] [PATCH 5/9] vhost-net: compile it on all targets that have virtio-net Paolo Bonzini
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 15+ messages in thread
From: Paolo Bonzini @ 2019-02-14 17:35 UTC (permalink / raw)
  To: qemu-devel; +Cc: thuth, mst

vhost-user already has a way to communicate the endianness of the guest
via the vring endianness messages.  The vring endianness always matches
the vnet header endianness so there is no need to do anything else in
the backend.

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-Id: <1543851204-41186-9-git-send-email-pbonzini@redhat.com>
---
 net/vhost-user.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/net/vhost-user.c b/net/vhost-user.c
index a39f9c9..cd9659d 100644
--- a/net/vhost-user.c
+++ b/net/vhost-user.c
@@ -172,6 +172,17 @@ static void net_vhost_user_cleanup(NetClientState *nc)
     qemu_purge_queued_packets(nc);
 }
 
+static int vhost_user_set_vnet_endianness(NetClientState *nc,
+                                          bool enable)
+{
+    /* Nothing to do.  If the server supports
+     * VHOST_USER_PROTOCOL_F_CROSS_ENDIAN, it will get the
+     * vnet header endianness from there.  If it doesn't, negotiation
+     * fails.
+     */
+    return 0;
+}
+
 static bool vhost_user_has_vnet_hdr(NetClientState *nc)
 {
     assert(nc->info->type == NET_CLIENT_DRIVER_VHOST_USER);
@@ -193,6 +204,8 @@ static NetClientInfo net_vhost_user_info = {
         .cleanup = net_vhost_user_cleanup,
         .has_vnet_hdr = vhost_user_has_vnet_hdr,
         .has_ufo = vhost_user_has_ufo,
+        .set_vnet_be = vhost_user_set_vnet_endianness,
+        .set_vnet_le = vhost_user_set_vnet_endianness,
 };
 
 static gboolean net_vhost_user_watch(GIOChannel *chan, GIOCondition cond,
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [Qemu-devel] [PATCH 5/9] vhost-net: compile it on all targets that have virtio-net.
  2019-02-14 17:35 [Qemu-devel] [PATCH v2 0/9] vhost: enable for all targets Paolo Bonzini
                   ` (3 preceding siblings ...)
  2019-02-14 17:35 ` [Qemu-devel] [PATCH 4/9] vhost-user: support cross-endian vnet headers Paolo Bonzini
@ 2019-02-14 17:35 ` Paolo Bonzini
  2019-02-14 17:35 ` [Qemu-devel] [PATCH 6/9] vhost-net: revamp configure logic Paolo Bonzini
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 15+ messages in thread
From: Paolo Bonzini @ 2019-02-14 17:35 UTC (permalink / raw)
  To: qemu-devel; +Cc: thuth, mst

This shows a preexisting bug: if a KVM target did not have virtio-net enabled,
it would fail with undefined symbols when vhost was enabled.  This must now
be fixed, lest targets that have no virtio-net fail to compile.

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Message-Id: <1543851204-41186-5-git-send-email-pbonzini@redhat.com>
---
 configure               | 11 ++++-------
 hw/net/Makefile.objs    |  4 ++--
 hw/net/vhost_net.c      |  4 +---
 include/exec/poison.h   |  1 -
 tests/Makefile.include  |  5 +----
 tests/vhost-user-test.c | 16 +++++++++++-----
 6 files changed, 19 insertions(+), 22 deletions(-)

diff --git a/configure b/configure
index 7ac76ec..4553c17 100755
--- a/configure
+++ b/configure
@@ -6578,7 +6578,10 @@ fi
 if test "$vhost_scsi" = "yes" ; then
   echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
 fi
-if test "$vhost_net" = "yes" && test "$vhost_user" = "yes"; then
+if test "$vhost_net" = "yes" ; then
+  echo "CONFIG_VHOST_NET=y" >> $config_host_mak
+fi
+if test "$vhost_net_user" = "yes" ; then
   echo "CONFIG_VHOST_NET_USER=y" >> $config_host_mak
 fi
 if test "$vhost_crypto" = "yes" ; then
@@ -7354,12 +7357,6 @@ if supported_xen_target $target; then
 fi
 if supported_kvm_target $target; then
     echo "CONFIG_KVM=y" >> $config_target_mak
-    if test "$vhost_net" = "yes" ; then
-        echo "CONFIG_VHOST_NET=y" >> $config_target_mak
-        if test "$vhost_user" = "yes" ; then
-            echo "CONFIG_VHOST_USER_NET_TEST_$target_name=y" >> $config_host_mak
-        fi
-    fi
 fi
 if supported_hax_target $target; then
     echo "CONFIG_HAX=y" >> $config_target_mak
diff --git a/hw/net/Makefile.objs b/hw/net/Makefile.objs
index acfaea5..ea63715 100644
--- a/hw/net/Makefile.objs
+++ b/hw/net/Makefile.objs
@@ -37,8 +37,8 @@ obj-$(CONFIG_PSERIES) += spapr_llan.o
 obj-$(CONFIG_XILINX_ETHLITE) += xilinx_ethlite.o
 
 obj-$(CONFIG_VIRTIO_NET) += virtio-net.o
-obj-$(CONFIG_VHOST_NET) += vhost_net.o
-common-obj-$(call lnot,$(CONFIG_VHOST_NET)) += vhost_net-stub.o
+common-obj-$(call land,$(CONFIG_VIRTIO_NET),$(CONFIG_VHOST_NET)) += vhost_net.o
+common-obj-$(call lnot,$(call land,$(CONFIG_VIRTIO_NET),$(CONFIG_VHOST_NET))) += vhost_net-stub.o
 common-obj-$(CONFIG_ALL) += vhost_net-stub.o
 
 obj-$(CONFIG_ETSEC) += fsl_etsec/etsec.o fsl_etsec/registers.o \
diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
index ae3ca23..be3cc88 100644
--- a/hw/net/vhost_net.c
+++ b/hw/net/vhost_net.c
@@ -25,8 +25,6 @@
 
 
 #include <sys/socket.h>
-#include <netpacket/packet.h>
-#include <net/ethernet.h>
 #include <net/if.h>
 #include <netinet/in.h>
 
@@ -134,7 +132,7 @@ static int vhost_net_get_fd(NetClientState *backend)
         return tap_get_fd(backend);
     default:
         fprintf(stderr, "vhost-net requires tap backend\n");
-        return -EBADFD;
+        return -ENOSYS;
     }
 }
 
diff --git a/include/exec/poison.h b/include/exec/poison.h
index ecdc83c..1a7a57b 100644
--- a/include/exec/poison.h
+++ b/include/exec/poison.h
@@ -86,7 +86,6 @@
 #pragma GCC poison CONFIG_XTENSA_DIS
 
 #pragma GCC poison CONFIG_LINUX_USER
-#pragma GCC poison CONFIG_VHOST_NET
 #pragma GCC poison CONFIG_KVM
 #pragma GCC poison CONFIG_SOFTMMU
 
diff --git a/tests/Makefile.include b/tests/Makefile.include
index b39e989..048cf56 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -209,10 +209,7 @@ check-qtest-i386-$(CONFIG_USB_XHCI_NEC) += tests/usb-hcd-xhci-test$(EXESUF)
 check-qtest-i386-y += tests/cpu-plug-test$(EXESUF)
 check-qtest-i386-y += tests/q35-test$(EXESUF)
 check-qtest-i386-y += tests/vmgenid-test$(EXESUF)
-check-qtest-i386-$(CONFIG_VHOST_USER_NET_TEST_i386) += tests/vhost-user-test$(EXESUF)
-ifeq ($(CONFIG_VHOST_USER_NET_TEST_i386),)
-check-qtest-x86_64-$(CONFIG_VHOST_USER_NET_TEST_x86_64) += tests/vhost-user-test$(EXESUF)
-endif
+check-qtest-i386-$(CONFIG_VHOST_NET_USER) += tests/vhost-user-test$(EXESUF)
 check-qtest-i386-$(CONFIG_TPM_CRB) += tests/tpm-crb-swtpm-test$(EXESUF)
 check-qtest-i386-$(CONFIG_TPM_CRB) += tests/tpm-crb-test$(EXESUF)
 check-qtest-i386-$(CONFIG_TPM_TIS) += tests/tpm-tis-swtpm-test$(EXESUF)
diff --git a/tests/vhost-user-test.c b/tests/vhost-user-test.c
index d961bd0..cdbdf3d 100644
--- a/tests/vhost-user-test.c
+++ b/tests/vhost-user-test.c
@@ -27,10 +27,13 @@
 #include "libqos/malloc-pc.h"
 #include "hw/virtio/virtio-net.h"
 
-#include <linux/vhost.h>
-#include <linux/virtio_ids.h>
-#include <linux/virtio_net.h>
+#include "standard-headers/linux/vhost_types.h"
+#include "standard-headers/linux/virtio_ids.h"
+#include "standard-headers/linux/virtio_net.h"
+
+#ifdef CONFIG_LINUX
 #include <sys/vfs.h>
+#endif
 
 
 #define QEMU_CMD_MEM    " -m %d -object memory-backend-file,id=mem,size=%dM," \
@@ -459,6 +462,7 @@ static void chr_read(void *opaque, const uint8_t *buf, int size)
     g_mutex_unlock(&s->data_mutex);
 }
 
+#ifdef CONFIG_LINUX
 static const char *init_hugepagefs(const char *path)
 {
     struct statfs fs;
@@ -485,6 +489,7 @@ static const char *init_hugepagefs(const char *path)
 
     return path;
 }
+#endif
 
 static TestServer *test_server_new(const gchar *name)
 {
@@ -983,13 +988,14 @@ int main(int argc, char **argv)
     }
     g_assert(tmpfs);
 
+    root = tmpfs;
+#ifdef CONFIG_LINUX
     hugefs = getenv("QTEST_HUGETLBFS_PATH");
     if (hugefs) {
         root = init_hugepagefs(hugefs);
         g_assert(root);
-    } else {
-        root = tmpfs;
     }
+#endif
 
     loop = g_main_loop_new(NULL, FALSE);
     /* run the main loop thread so the chardev may operate */
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [Qemu-devel] [PATCH 6/9] vhost-net: revamp configure logic
  2019-02-14 17:35 [Qemu-devel] [PATCH v2 0/9] vhost: enable for all targets Paolo Bonzini
                   ` (4 preceding siblings ...)
  2019-02-14 17:35 ` [Qemu-devel] [PATCH 5/9] vhost-net: compile it on all targets that have virtio-net Paolo Bonzini
@ 2019-02-14 17:35 ` Paolo Bonzini
  2019-02-14 17:35 ` [Qemu-devel] [PATCH 7/9] vhost-user-test: create a main loop per TestServer Paolo Bonzini
                   ` (4 subsequent siblings)
  10 siblings, 0 replies; 15+ messages in thread
From: Paolo Bonzini @ 2019-02-14 17:35 UTC (permalink / raw)
  To: qemu-devel; +Cc: thuth, mst

Detect all invalid configurations (e.g. mingw32 with vhost-user,
non-Linux with vhost-kernel).  As a collateral benefit, all vhost-kernel
backends can be now disabled if one wants to reduce the attack surface.

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Message-Id: <1543851204-41186-6-git-send-email-pbonzini@redhat.com>
---
 configure                 | 89 +++++++++++++++++++++++++++++++----------------
 hw/virtio/Makefile.objs   |  4 +--
 hw/virtio/vhost-backend.c |  4 +--
 3 files changed, 63 insertions(+), 34 deletions(-)

diff --git a/configure b/configure
index 4553c17..6d58718 100755
--- a/configure
+++ b/configure
@@ -368,10 +368,10 @@ libattr=""
 xfs=""
 tcg="yes"
 membarrier=""
-vhost_net="no"
-vhost_crypto="no"
-vhost_scsi="no"
-vhost_vsock="no"
+vhost_net=""
+vhost_crypto=""
+vhost_scsi=""
+vhost_vsock=""
 vhost_user=""
 kvm="no"
 hax="no"
@@ -782,6 +782,7 @@ case $targetos in
 MINGW32*)
   mingw32="yes"
   hax="yes"
+  vhost_user="no"
   audio_possible_drivers="dsound sdl"
   if check_include dsound.h; then
     audio_drv_list="dsound"
@@ -882,10 +883,6 @@ Linux)
   linux="yes"
   linux_user="yes"
   kvm="yes"
-  vhost_net="yes"
-  vhost_crypto="yes"
-  vhost_scsi="yes"
-  vhost_vsock="yes"
   QEMU_INCLUDES="-I\$(SRC_PATH)/linux-headers -I$PWD/linux-headers $QEMU_INCLUDES"
   supported_os="yes"
   libudev="yes"
@@ -1261,11 +1258,7 @@ for opt do
   ;;
   --disable-vhost-crypto) vhost_crypto="no"
   ;;
-  --enable-vhost-crypto)
-      vhost_crypto="yes"
-      if test "$mingw32" = "yes"; then
-          error_exit "vhost-crypto isn't available on win32"
-      fi
+  --enable-vhost-crypto) vhost_crypto="yes"
   ;;
   --disable-vhost-scsi) vhost_scsi="no"
   ;;
@@ -1470,11 +1463,11 @@ for opt do
   ;;
   --disable-vhost-user) vhost_user="no"
   ;;
-  --enable-vhost-user)
-      vhost_user="yes"
-      if test "$mingw32" = "yes"; then
-          error_exit "vhost-user isn't available on win32"
-      fi
+  --enable-vhost-user) vhost_user="yes"
+  ;;
+  --disable-vhost-kernel) vhost_kernel="no"
+  ;;
+  --enable-vhost-kernel) vhost_kernel="yes"
   ;;
   --disable-capstone) capstone="no"
   ;;
@@ -1506,14 +1499,6 @@ for opt do
   esac
 done
 
-if test "$vhost_user" = ""; then
-    if test "$mingw32" = "yes"; then
-        vhost_user="no"
-    else
-        vhost_user="yes"
-    fi
-fi
-
 case "$cpu" in
     ppc)
            CPU_CFLAGS="-m32"
@@ -1736,8 +1721,12 @@ disabled with --disable-FEATURE, default is enabled if available:
   linux-aio       Linux AIO support
   cap-ng          libcap-ng support
   attr            attr and xattr support
-  vhost-net       vhost-net acceleration support
-  vhost-crypto    vhost-crypto acceleration support
+  vhost-net       vhost-net kernel acceleration support
+  vhost-vsock     virtio sockets device support
+  vhost-scsi      vhost-scsi kernel target support
+  vhost-crypto    vhost-user-crypto backend support
+  vhost-kernel    vhost kernel backend support
+  vhost-user      vhost-user backend support
   spice           spice
   rbd             rados block device (rbd)
   libiscsi        iscsi support
@@ -1763,7 +1752,6 @@ disabled with --disable-FEATURE, default is enabled if available:
   jemalloc        jemalloc support
   avx2            AVX2 optimization support
   replication     replication support
-  vhost-vsock     virtio sockets device support
   opengl          opengl support
   virglrenderer   virgl rendering support
   xfsctl          xfsctl support
@@ -1780,7 +1768,6 @@ disabled with --disable-FEATURE, default is enabled if available:
   parallels       parallels image format support
   sheepdog        sheepdog block driver support
   crypto-afalg    Linux AF_ALG crypto backend driver
-  vhost-user      vhost-user support
   capstone        capstone disassembler support
   debug-mutex     mutex debugging support
   libpmem         libpmem support
@@ -2171,6 +2158,45 @@ else
   l2tpv3=no
 fi
 
+#########################################
+# vhost interdependencies and host support
+
+# vhost backends
+test "$vhost_user" = "" && vhost_user=yes
+if test "$vhost_user" = "yes" && test "$mingw32" = "yes"; then
+  error_exit "vhost-user isn't available on win32"
+fi
+test "$vhost_kernel" = "" && vhost_kernel=$linux
+if test "$vhost_kernel" = "yes" && test "$linux" != "yes"; then
+  error_exit "vhost-kernel is only available on Linux"
+fi
+
+# vhost-kernel devices
+test "$vhost_scsi" = "" && vhost_scsi=$vhost_kernel
+if test "$vhost_scsi" = "yes" && test "$vhost_kernel" != "yes"; then
+  error_exit "--enable-vhost-scsi requires --enable-vhost-kernel"
+fi
+test "$vhost_vsock" = "" && vhost_vsock=$vhost_kernel
+if test "$vhost_vsock" = "yes" && test "$vhost_kernel" != "yes"; then
+  error_exit "--enable-vhost-vsock requires --enable-vhost-kernel"
+fi
+
+# vhost-user backends
+test "$vhost_net_user" = "" && vhost_net_user=$vhost_user
+if test "$vhost_net_user" = "yes" && test "$vhost_user" = "no"; then
+  error_exit "--enable-vhost-net-user requires --enable-vhost-user"
+fi
+test "$vhost_crypto" = "" && vhost_crypto=$vhost_user
+if test "$vhost_crypto" = "yes" && test "$vhost_user" = "no"; then
+  error_exit "--enable-vhost-crypto requires --enable-vhost-user"
+fi
+
+# OR the vhost-kernel and vhost-user values for simplicity
+if test "$vhost_net" = ""; then
+  test "$vhost_net_user" = "yes" && vhost_net=yes
+  test "$vhost_kernel" = "yes" && vhost_net=yes
+fi
+
 ##########################################
 # MinGW / Mingw-w64 localtime_r/gmtime_r check
 
@@ -6590,6 +6616,9 @@ fi
 if test "$vhost_vsock" = "yes" ; then
   echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
 fi
+if test "$vhost_kernel" = "yes" ; then
+  echo "CONFIG_VHOST_KERNEL=y" >> $config_host_mak
+fi
 if test "$vhost_user" = "yes" ; then
   echo "CONFIG_VHOST_USER=y" >> $config_host_mak
 fi
diff --git a/hw/virtio/Makefile.objs b/hw/virtio/Makefile.objs
index ce542e7..a3eb8ed 100644
--- a/hw/virtio/Makefile.objs
+++ b/hw/virtio/Makefile.objs
@@ -2,8 +2,8 @@ ifeq ($(CONFIG_VIRTIO),y)
 common-obj-y += virtio-bus.o
 obj-y += virtio.o
 
-obj-$(call lor,$(CONFIG_VHOST_USER),$(CONFIG_LINUX)) += vhost.o vhost-backend.o
-common-obj-$(call lnot,$(call lor,$(CONFIG_VHOST_USER),$(CONFIG_LINUX))) += vhost-stub.o
+obj-$(call lor,$(CONFIG_VHOST_USER),$(CONFIG_VHOST_KERNEL)) += vhost.o vhost-backend.o
+common-obj-$(call lnot,$(call lor,$(CONFIG_VHOST_USER),$(CONFIG_VHOST_KERNEL))) += vhost-stub.o
 obj-$(CONFIG_VHOST_USER) += vhost-user.o
 
 common-obj-$(CONFIG_VIRTIO_RNG) += virtio-rng.o
diff --git a/hw/virtio/vhost-backend.c b/hw/virtio/vhost-backend.c
index e0f0bb7..96b8d3c 100644
--- a/hw/virtio/vhost-backend.c
+++ b/hw/virtio/vhost-backend.c
@@ -14,7 +14,7 @@
 #include "qemu/error-report.h"
 #include "standard-headers/linux/vhost_types.h"
 
-#ifdef CONFIG_LINUX
+#ifdef CONFIG_VHOST_KERNEL
 #include <linux/vhost.h>
 #include <sys/ioctl.h>
 
@@ -275,7 +275,7 @@ int vhost_set_backend_type(struct vhost_dev *dev, VhostBackendType backend_type)
     int r = 0;
 
     switch (backend_type) {
-#ifdef CONFIG_LINUX
+#ifdef CONFIG_VHOST_KERNEL
     case VHOST_BACKEND_TYPE_KERNEL:
         dev->vhost_ops = &kernel_ops;
         break;
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [Qemu-devel] [PATCH 7/9] vhost-user-test: create a main loop per TestServer
  2019-02-14 17:35 [Qemu-devel] [PATCH v2 0/9] vhost: enable for all targets Paolo Bonzini
                   ` (5 preceding siblings ...)
  2019-02-14 17:35 ` [Qemu-devel] [PATCH 6/9] vhost-net: revamp configure logic Paolo Bonzini
@ 2019-02-14 17:35 ` Paolo Bonzini
  2019-02-14 17:35 ` [Qemu-devel] [PATCH 8/9] vhost-user-test: small changes to init_hugepagefs Paolo Bonzini
                   ` (3 subsequent siblings)
  10 siblings, 0 replies; 15+ messages in thread
From: Paolo Bonzini @ 2019-02-14 17:35 UTC (permalink / raw)
  To: qemu-devel; +Cc: thuth, mst

This makes the tests more independent and removes the need to defer test_server_free
via an idle event source.

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-Id: <1543851204-41186-13-git-send-email-pbonzini@redhat.com>
---
 tests/vhost-user-test.c | 53 +++++++++++++++++++++++++------------------------
 1 file changed, 27 insertions(+), 26 deletions(-)

diff --git a/tests/vhost-user-test.c b/tests/vhost-user-test.c
index cdbdf3d..33030e0 100644
--- a/tests/vhost-user-test.c
+++ b/tests/vhost-user-test.c
@@ -146,6 +146,9 @@ typedef struct TestServer {
     int fds_num;
     int fds[VHOST_MEMORY_MAX_NREGIONS];
     VhostUserMemory memory;
+    GMainContext *context;
+    GMainLoop *loop;
+    GThread *thread;
     GMutex data_mutex;
     GCond data_cond;
     int log_fd;
@@ -495,6 +498,12 @@ static TestServer *test_server_new(const gchar *name)
 {
     TestServer *server = g_new0(TestServer, 1);
 
+    server->context = g_main_context_new();
+    server->loop = g_main_loop_new(server->context, FALSE);
+
+    /* run the main loop thread so the chardev may operate */
+    server->thread = g_thread_new(NULL, thread_function, server->loop);
+
     server->socket_path = g_strdup_printf("%s/%s.sock", tmpfs, name);
     server->mig_path = g_strdup_printf("%s/%s.mig", tmpfs, name);
     server->chr_name = g_strdup_printf("chr-%s", name);
@@ -524,13 +533,13 @@ static void test_server_create_chr(TestServer *server, const gchar *opt)
     Chardev *chr;
 
     chr_path = g_strdup_printf("unix:%s%s", server->socket_path, opt);
-    chr = qemu_chr_new(server->chr_name, chr_path, NULL);
+    chr = qemu_chr_new(server->chr_name, chr_path, server->context);
     g_free(chr_path);
 
     g_assert_nonnull(chr);
     qemu_chr_fe_init(&server->chr, chr, &error_abort);
     qemu_chr_fe_set_handlers(&server->chr, chr_can_read, chr_read,
-                             chr_event, NULL, server, NULL, true);
+                             chr_event, NULL, server, server->context, true);
 }
 
 static void test_server_listen(TestServer *server)
@@ -538,10 +547,19 @@ static void test_server_listen(TestServer *server)
     test_server_create_chr(server, ",server,nowait");
 }
 
-static gboolean _test_server_free(TestServer *server)
+static void test_server_free(TestServer *server)
 {
     int i;
 
+    /* finish the helper thread and dispatch pending sources */
+    g_main_loop_quit(server->loop);
+    g_thread_join(server->thread);
+    while (g_main_context_pending(NULL)) {
+        g_main_context_iteration(NULL, TRUE);
+    }
+    g_main_loop_unref(server->loop);
+    g_main_context_unref(server->context);
+
     qemu_chr_fe_deinit(&server->chr, true);
 
     for (i = 0; i < server->fds_num; i++) {
@@ -563,13 +581,6 @@ static gboolean _test_server_free(TestServer *server)
     qpci_free_pc(server->bus);
 
     g_free(server);
-
-    return FALSE;
-}
-
-static void test_server_free(TestServer *server)
-{
-    g_idle_add((GSourceFunc)_test_server_free, server);
 }
 
 static void wait_for_log_fd(TestServer *s)
@@ -728,7 +739,7 @@ static void test_migrate(void)
                           sizeof(TestMigrateSource));
     ((TestMigrateSource *)source)->src = s;
     ((TestMigrateSource *)source)->dest = dest;
-    g_source_attach(source, NULL);
+    g_source_attach(source, s->context);
 
     /* slow down migration to have time to fiddle with log */
     /* TODO: qtest could learn to break on some places */
@@ -825,6 +836,7 @@ connect_thread(gpointer data)
 static void test_reconnect_subprocess(void)
 {
     TestServer *s = test_server_new("reconnect");
+    GSource *src;
     char *cmd;
 
     g_thread_new("connect", connect_thread, s);
@@ -842,7 +854,10 @@ static void test_reconnect_subprocess(void)
     /* reconnect */
     s->fds_num = 0;
     s->rings = 0;
-    g_idle_add(reconnect_cb, s);
+    src = g_idle_source_new();
+    g_source_set_callback(src, reconnect_cb, s, NULL);
+    g_source_attach(src, s->context);
+    g_source_unref(src);
     g_assert(wait_for_fds(s));
     wait_for_rings_started(s, 2);
 
@@ -974,8 +989,6 @@ int main(int argc, char **argv)
     const char *hugefs;
     int ret;
     char template[] = "/tmp/vhost-test-XXXXXX";
-    GMainLoop *loop;
-    GThread *thread;
 
     g_test_init(&argc, &argv, NULL);
 
@@ -997,10 +1010,6 @@ int main(int argc, char **argv)
     }
 #endif
 
-    loop = g_main_loop_new(NULL, FALSE);
-    /* run the main loop thread so the chardev may operate */
-    thread = g_thread_new(NULL, thread_function, loop);
-
     if (qemu_memfd_check(0)) {
         qtest_add_data_func("/vhost-user/read-guest-mem/memfd",
                             GINT_TO_POINTER(TEST_MEMFD_YES),
@@ -1028,14 +1037,6 @@ int main(int argc, char **argv)
 
     /* cleanup */
 
-    /* finish the helper thread and dispatch pending sources */
-    g_main_loop_quit(loop);
-    g_thread_join(thread);
-    while (g_main_context_pending(NULL)) {
-        g_main_context_iteration (NULL, TRUE);
-    }
-    g_main_loop_unref(loop);
-
     ret = rmdir(tmpfs);
     if (ret != 0) {
         g_test_message("unable to rmdir: path (%s): %s\n",
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [Qemu-devel] [PATCH 8/9] vhost-user-test: small changes to init_hugepagefs
  2019-02-14 17:35 [Qemu-devel] [PATCH v2 0/9] vhost: enable for all targets Paolo Bonzini
                   ` (6 preceding siblings ...)
  2019-02-14 17:35 ` [Qemu-devel] [PATCH 7/9] vhost-user-test: create a main loop per TestServer Paolo Bonzini
@ 2019-02-14 17:35 ` Paolo Bonzini
  2019-02-15  8:27   ` Thomas Huth
  2019-02-14 17:35 ` [Qemu-devel] [PATCH 9/9] vhost-user-test: create a temporary directory per TestServer Paolo Bonzini
                   ` (2 subsequent siblings)
  10 siblings, 1 reply; 15+ messages in thread
From: Paolo Bonzini @ 2019-02-14 17:35 UTC (permalink / raw)
  To: qemu-devel; +Cc: thuth, mst

After the conversion to qgraph, the equivalent of "main" will be in
a constructor and will run even if the tests are not being requested.
Therefore, it should not assert that init_hugepagefs succeeds and will
be called when creating the TestServer.  This patch changes the prototype
of init_hugepagefs, this way the next patch looks nicer.

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-Id: <1543851204-41186-14-git-send-email-pbonzini@redhat.com>
---
 tests/vhost-user-test.c | 26 ++++++++++++++------------
 1 file changed, 14 insertions(+), 12 deletions(-)

diff --git a/tests/vhost-user-test.c b/tests/vhost-user-test.c
index 33030e0..516e31c 100644
--- a/tests/vhost-user-test.c
+++ b/tests/vhost-user-test.c
@@ -465,14 +465,20 @@ static void chr_read(void *opaque, const uint8_t *buf, int size)
     g_mutex_unlock(&s->data_mutex);
 }
 
-#ifdef CONFIG_LINUX
-static const char *init_hugepagefs(const char *path)
+static const char *init_hugepagefs(void)
 {
+#ifdef CONFIG_LINUX
+    const char *path = getenv("QTEST_HUGETLBFS_PATH");
     struct statfs fs;
     int ret;
 
+    if (!path) {
+        return NULL;
+    }
+
     if (access(path, R_OK | W_OK | X_OK)) {
         g_test_message("access on path (%s): %s\n", path, strerror(errno));
+        abort();
         return NULL;
     }
 
@@ -482,17 +488,21 @@ static const char *init_hugepagefs(const char *path)
 
     if (ret != 0) {
         g_test_message("statfs on path (%s): %s\n", path, strerror(errno));
+        abort();
         return NULL;
     }
 
     if (fs.f_type != HUGETLBFS_MAGIC) {
         g_test_message("Warning: path not on HugeTLBFS: %s\n", path);
+        abort();
         return NULL;
     }
 
     return path;
-}
+#else
+    return NULL;
 #endif
+}
 
 static TestServer *test_server_new(const gchar *name)
 {
@@ -986,7 +996,6 @@ static void test_multiqueue(void)
 
 int main(int argc, char **argv)
 {
-    const char *hugefs;
     int ret;
     char template[] = "/tmp/vhost-test-XXXXXX";
 
@@ -1001,14 +1010,7 @@ int main(int argc, char **argv)
     }
     g_assert(tmpfs);
 
-    root = tmpfs;
-#ifdef CONFIG_LINUX
-    hugefs = getenv("QTEST_HUGETLBFS_PATH");
-    if (hugefs) {
-        root = init_hugepagefs(hugefs);
-        g_assert(root);
-    }
-#endif
+    root = init_hugepagefs() ? : tmpfs;
 
     if (qemu_memfd_check(0)) {
         qtest_add_data_func("/vhost-user/read-guest-mem/memfd",
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [Qemu-devel] [PATCH 9/9] vhost-user-test: create a temporary directory per TestServer
  2019-02-14 17:35 [Qemu-devel] [PATCH v2 0/9] vhost: enable for all targets Paolo Bonzini
                   ` (7 preceding siblings ...)
  2019-02-14 17:35 ` [Qemu-devel] [PATCH 8/9] vhost-user-test: small changes to init_hugepagefs Paolo Bonzini
@ 2019-02-14 17:35 ` Paolo Bonzini
  2019-02-14 19:05 ` [Qemu-devel] [PATCH v2 0/9] vhost: enable for all targets Michael S. Tsirkin
  2019-02-14 19:28 ` Michael S. Tsirkin
  10 siblings, 0 replies; 15+ messages in thread
From: Paolo Bonzini @ 2019-02-14 17:35 UTC (permalink / raw)
  To: qemu-devel; +Cc: thuth, mst

This makes the tests more independent, and also the source and destination
TestServers in the migration test.

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-Id: <1543851204-41186-15-git-send-email-pbonzini@redhat.com>
---
 tests/vhost-user-test.c | 77 ++++++++++++++++++++++---------------------------
 1 file changed, 35 insertions(+), 42 deletions(-)

diff --git a/tests/vhost-user-test.c b/tests/vhost-user-test.c
index 516e31c..1c550aa 100644
--- a/tests/vhost-user-test.c
+++ b/tests/vhost-user-test.c
@@ -142,6 +142,8 @@ typedef struct TestServer {
     gchar *socket_path;
     gchar *mig_path;
     gchar *chr_name;
+    const gchar *mem_path;
+    gchar *tmpfs;
     CharBackend chr;
     int fds_num;
     int fds[VHOST_MEMORY_MAX_NREGIONS];
@@ -163,9 +165,6 @@ static TestServer *test_server_new(const gchar *name);
 static void test_server_free(TestServer *server);
 static void test_server_listen(TestServer *server);
 
-static const char *tmpfs;
-static const char *root;
-
 enum test_memfd {
     TEST_MEMFD_AUTO,
     TEST_MEMFD_YES,
@@ -173,7 +172,7 @@ enum test_memfd {
 };
 
 static char *get_qemu_cmd(TestServer *s,
-                          int mem, enum test_memfd memfd, const char *mem_path,
+                          int mem, enum test_memfd memfd,
                           const char *chr_opts, const char *extra)
 {
     if (memfd == TEST_MEMFD_AUTO && qemu_memfd_check(0)) {
@@ -188,7 +187,7 @@ static char *get_qemu_cmd(TestServer *s,
     } else {
         return g_strdup_printf(QEMU_CMD_MEM QEMU_CMD_CHR
                                QEMU_CMD_NETDEV QEMU_CMD_NET "%s", mem, mem,
-                               mem_path, s->chr_name, s->socket_path,
+                               s->mem_path, s->chr_name, s->socket_path,
                                chr_opts, s->chr_name, extra);
     }
 }
@@ -507,6 +506,8 @@ static const char *init_hugepagefs(void)
 static TestServer *test_server_new(const gchar *name)
 {
     TestServer *server = g_new0(TestServer, 1);
+    char template[] = "/tmp/vhost-test-XXXXXX";
+    const char *tmpfs;
 
     server->context = g_main_context_new();
     server->loop = g_main_loop_new(server->context, FALSE);
@@ -514,6 +515,14 @@ static TestServer *test_server_new(const gchar *name)
     /* run the main loop thread so the chardev may operate */
     server->thread = g_thread_new(NULL, thread_function, server->loop);
 
+    tmpfs = mkdtemp(template);
+    if (!tmpfs) {
+        g_test_message("mkdtemp on path (%s): %s", template, strerror(errno));
+    }
+    g_assert(tmpfs);
+
+    server->tmpfs = g_strdup(tmpfs);
+    server->mem_path = init_hugepagefs() ? : server->tmpfs;
     server->socket_path = g_strdup_printf("%s/%s.sock", tmpfs, name);
     server->mig_path = g_strdup_printf("%s/%s.mig", tmpfs, name);
     server->chr_name = g_strdup_printf("chr-%s", name);
@@ -559,7 +568,7 @@ static void test_server_listen(TestServer *server)
 
 static void test_server_free(TestServer *server)
 {
-    int i;
+    int i, ret;
 
     /* finish the helper thread and dispatch pending sources */
     g_main_loop_quit(server->loop);
@@ -570,6 +579,18 @@ static void test_server_free(TestServer *server)
     g_main_loop_unref(server->loop);
     g_main_context_unref(server->context);
 
+    unlink(server->socket_path);
+    g_free(server->socket_path);
+
+    unlink(server->mig_path);
+    g_free(server->mig_path);
+
+    ret = rmdir(server->tmpfs);
+    if (ret != 0) {
+        g_test_message("unable to rmdir: path (%s): %s",
+                       server->tmpfs, strerror(errno));
+    }
+
     qemu_chr_fe_deinit(&server->chr, true);
 
     for (i = 0; i < server->fds_num; i++) {
@@ -580,12 +601,6 @@ static void test_server_free(TestServer *server)
         close(server->log_fd);
     }
 
-    unlink(server->socket_path);
-    g_free(server->socket_path);
-
-    unlink(server->mig_path);
-    g_free(server->mig_path);
-
     g_free(server->chr_name);
     g_assert(server->bus);
     qpci_free_pc(server->bus);
@@ -691,7 +706,7 @@ static void test_read_guest_mem(const void *arg)
                              "read-guest-memfd" : "read-guest-mem");
     test_server_listen(server);
 
-    qemu_cmd = get_qemu_cmd(server, 512, memfd, root, "", "");
+    qemu_cmd = get_qemu_cmd(server, 512, memfd, "", "");
 
     s = qtest_start(qemu_cmd);
     g_free(qemu_cmd);
@@ -726,7 +741,7 @@ static void test_migrate(void)
     test_server_listen(s);
     test_server_listen(dest);
 
-    cmd = get_qemu_cmd(s, 2, TEST_MEMFD_AUTO, root, "", "");
+    cmd = get_qemu_cmd(s, 2, TEST_MEMFD_AUTO, "", "");
     from = qtest_start(cmd);
     g_free(cmd);
 
@@ -739,7 +754,7 @@ static void test_migrate(void)
     g_assert_cmpint(size, ==, (2 * 1024 * 1024) / (VHOST_LOG_PAGE * 8));
 
     tmp = g_strdup_printf(" -incoming %s", uri);
-    cmd = get_qemu_cmd(dest, 2, TEST_MEMFD_AUTO, root, "", tmp);
+    cmd = get_qemu_cmd(dest, 2, TEST_MEMFD_AUTO, "", tmp);
     g_free(tmp);
     to = qtest_init(cmd);
     g_free(cmd);
@@ -850,7 +865,7 @@ static void test_reconnect_subprocess(void)
     char *cmd;
 
     g_thread_new("connect", connect_thread, s);
-    cmd = get_qemu_cmd(s, 2, TEST_MEMFD_AUTO, root, ",server", "");
+    cmd = get_qemu_cmd(s, 2, TEST_MEMFD_AUTO, ",server", "");
     qtest_start(cmd);
     g_free(cmd);
 
@@ -895,7 +910,7 @@ static void test_connect_fail_subprocess(void)
 
     s->test_fail = true;
     g_thread_new("connect", connect_thread, s);
-    cmd = get_qemu_cmd(s, 2, TEST_MEMFD_AUTO, root, ",server", "");
+    cmd = get_qemu_cmd(s, 2, TEST_MEMFD_AUTO, ",server", "");
     qtest_start(cmd);
     g_free(cmd);
 
@@ -928,7 +943,7 @@ static void test_flags_mismatch_subprocess(void)
 
     s->test_flags = TEST_FLAGS_DISCONNECT;
     g_thread_new("connect", connect_thread, s);
-    cmd = get_qemu_cmd(s, 2, TEST_MEMFD_AUTO, root, ",server", "");
+    cmd = get_qemu_cmd(s, 2, TEST_MEMFD_AUTO, ",server", "");
     qtest_start(cmd);
     g_free(cmd);
 
@@ -976,7 +991,7 @@ static void test_multiqueue(void)
         cmd = g_strdup_printf(
             QEMU_CMD_MEM QEMU_CMD_CHR QEMU_CMD_NETDEV ",queues=%d "
             "-device virtio-net-pci,netdev=net0,mq=on,vectors=%d",
-            512, 512, root, s->chr_name,
+            512, 512, s->mem_path, s->chr_name,
             s->socket_path, "", s->chr_name,
             s->queues, s->queues * 2 + 2);
     }
@@ -996,22 +1011,11 @@ static void test_multiqueue(void)
 
 int main(int argc, char **argv)
 {
-    int ret;
-    char template[] = "/tmp/vhost-test-XXXXXX";
-
     g_test_init(&argc, &argv, NULL);
 
     module_call_init(MODULE_INIT_QOM);
     qemu_add_opts(&qemu_chardev_opts);
 
-    tmpfs = mkdtemp(template);
-    if (!tmpfs) {
-        g_test_message("mkdtemp on path (%s): %s\n", template, strerror(errno));
-    }
-    g_assert(tmpfs);
-
-    root = init_hugepagefs() ? : tmpfs;
-
     if (qemu_memfd_check(0)) {
         qtest_add_data_func("/vhost-user/read-guest-mem/memfd",
                             GINT_TO_POINTER(TEST_MEMFD_YES),
@@ -1035,16 +1039,5 @@ int main(int argc, char **argv)
         qtest_add_func("/vhost-user/flags-mismatch", test_flags_mismatch);
     }
 
-    ret = g_test_run();
-
-    /* cleanup */
-
-    ret = rmdir(tmpfs);
-    if (ret != 0) {
-        g_test_message("unable to rmdir: path (%s): %s\n",
-                       tmpfs, strerror(errno));
-    }
-    g_assert_cmpint(ret, ==, 0);
-
-    return ret;
+    return g_test_run();
 }
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH v2 0/9] vhost: enable for all targets
  2019-02-14 17:35 [Qemu-devel] [PATCH v2 0/9] vhost: enable for all targets Paolo Bonzini
                   ` (8 preceding siblings ...)
  2019-02-14 17:35 ` [Qemu-devel] [PATCH 9/9] vhost-user-test: create a temporary directory per TestServer Paolo Bonzini
@ 2019-02-14 19:05 ` Michael S. Tsirkin
  2019-02-14 19:28 ` Michael S. Tsirkin
  10 siblings, 0 replies; 15+ messages in thread
From: Michael S. Tsirkin @ 2019-02-14 19:05 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel, thuth

On Thu, Feb 14, 2019 at 06:35:47PM +0100, Paolo Bonzini wrote:
> See also "[PATCH for-3.2 00/10] vhost: preparation for qgraph
> conversion of vhost-user-test".  Some of the other vhost-user-test
> patches have gone in already, and this is what is left.
> 
> These patches are a prerequisite for both kconfig and qgraph.
> 
> I will probably test them on macOS myself before these are included
> in a pull request, since the previous versions had some issues.
> Michael, let me know if you want me to send the pull request.
> 
> Thanks,
> 
> Paolo

Not sure why, it's all vhost so my tree seems appropriate.
BTW for the future, can you please try fixing the subject so all patches
have "v2"? I think it's generated by some tool you use,
and it seems that others are using it as well with the
same result. Makes it harder to see which patch belongs where.


> Paolo Bonzini (9):
>   vhost-net: move stubs to a separate file
>   vhost-net-user: add stubs for when no virtio-net device is present
>   vhost: restrict Linux dependency to kernel vhost
>   vhost-user: support cross-endian vnet headers
>   vhost-net: compile it on all targets that have virtio-net.
>   vhost-net: revamp configure logic
>   vhost-user-test: create a main loop per TestServer
>   vhost-user-test: small changes to init_hugepagefs
>   vhost-user-test: create a temporary directory per TestServer
> 
>  backends/Makefile.objs     |   5 +-
>  configure                  | 102 ++++++++++++++++++-----------
>  default-configs/virtio.mak |   4 +-
>  hw/net/Makefile.objs       |   4 +-
>  hw/net/vhost_net-stub.c    |  92 ++++++++++++++++++++++++++
>  hw/net/vhost_net.c         |  85 ++----------------------
>  hw/virtio/Makefile.objs    |   8 ++-
>  hw/virtio/vhost-backend.c  |  12 +++-
>  hw/virtio/vhost-user.c     |  13 +++-
>  hw/virtio/vhost.c          |   2 +-
>  include/exec/poison.h      |   1 -
>  net/Makefile.objs          |   4 +-
>  net/net.c                  |   2 +-
>  net/vhost-user-stub.c      |  23 +++++++
>  net/vhost-user.c           |  13 ++++
>  tests/Makefile.include     |   5 +-
>  tests/vhost-user-test.c    | 160 +++++++++++++++++++++++----------------------
>  17 files changed, 319 insertions(+), 216 deletions(-)
>  create mode 100644 hw/net/vhost_net-stub.c
>  create mode 100644 net/vhost-user-stub.c
> 
> -- 
> 1.8.3.1

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH v2 0/9] vhost: enable for all targets
  2019-02-14 17:35 [Qemu-devel] [PATCH v2 0/9] vhost: enable for all targets Paolo Bonzini
                   ` (9 preceding siblings ...)
  2019-02-14 19:05 ` [Qemu-devel] [PATCH v2 0/9] vhost: enable for all targets Michael S. Tsirkin
@ 2019-02-14 19:28 ` Michael S. Tsirkin
  2019-02-14 20:37   ` Paolo Bonzini
  10 siblings, 1 reply; 15+ messages in thread
From: Michael S. Tsirkin @ 2019-02-14 19:28 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel, thuth

On Thu, Feb 14, 2019 at 06:35:47PM +0100, Paolo Bonzini wrote:
> See also "[PATCH for-3.2 00/10] vhost: preparation for qgraph
> conversion of vhost-user-test".  Some of the other vhost-user-test
> patches have gone in already, and this is what is left.
> 
> These patches are a prerequisite for both kconfig and qgraph.
> 
> I will probably test them on macOS myself before these are included
> in a pull request, since the previous versions had some issues.
> Michael, let me know if you want me to send the pull request.
> 
> Thanks,
> 
> Paolo

what's the changelog from v1?

> Paolo Bonzini (9):
>   vhost-net: move stubs to a separate file
>   vhost-net-user: add stubs for when no virtio-net device is present
>   vhost: restrict Linux dependency to kernel vhost
>   vhost-user: support cross-endian vnet headers
>   vhost-net: compile it on all targets that have virtio-net.
>   vhost-net: revamp configure logic
>   vhost-user-test: create a main loop per TestServer
>   vhost-user-test: small changes to init_hugepagefs
>   vhost-user-test: create a temporary directory per TestServer
> 
>  backends/Makefile.objs     |   5 +-
>  configure                  | 102 ++++++++++++++++++-----------
>  default-configs/virtio.mak |   4 +-
>  hw/net/Makefile.objs       |   4 +-
>  hw/net/vhost_net-stub.c    |  92 ++++++++++++++++++++++++++
>  hw/net/vhost_net.c         |  85 ++----------------------
>  hw/virtio/Makefile.objs    |   8 ++-
>  hw/virtio/vhost-backend.c  |  12 +++-
>  hw/virtio/vhost-user.c     |  13 +++-
>  hw/virtio/vhost.c          |   2 +-
>  include/exec/poison.h      |   1 -
>  net/Makefile.objs          |   4 +-
>  net/net.c                  |   2 +-
>  net/vhost-user-stub.c      |  23 +++++++
>  net/vhost-user.c           |  13 ++++
>  tests/Makefile.include     |   5 +-
>  tests/vhost-user-test.c    | 160 +++++++++++++++++++++++----------------------
>  17 files changed, 319 insertions(+), 216 deletions(-)
>  create mode 100644 hw/net/vhost_net-stub.c
>  create mode 100644 net/vhost-user-stub.c
> 
> -- 
> 1.8.3.1

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH v2 0/9] vhost: enable for all targets
  2019-02-14 19:28 ` Michael S. Tsirkin
@ 2019-02-14 20:37   ` Paolo Bonzini
  2019-02-15  4:25     ` Michael S. Tsirkin
  0 siblings, 1 reply; 15+ messages in thread
From: Paolo Bonzini @ 2019-02-14 20:37 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: qemu-devel, thuth

On 14/02/19 20:28, Michael S. Tsirkin wrote:
> On Thu, Feb 14, 2019 at 06:35:47PM +0100, Paolo Bonzini wrote:
>> See also "[PATCH for-3.2 00/10] vhost: preparation for qgraph
>> conversion of vhost-user-test".  Some of the other vhost-user-test
>> patches have gone in already, and this is what is left.
>>
>> These patches are a prerequisite for both kconfig and qgraph.
>>
>> I will probably test them on macOS myself before these are included
>> in a pull request, since the previous versions had some issues.
>> Michael, let me know if you want me to send the pull request.
>>
>> Thanks,
>>
>> Paolo
> 
> what's the changelog from v1?

It's rebased and it includes the not-yet-merged parts of "vhost:
preparation for qgraph conversion of vhost-user-test", but otherwise
there are no changes.

Paolo

> 
>> Paolo Bonzini (9):
>>   vhost-net: move stubs to a separate file
>>   vhost-net-user: add stubs for when no virtio-net device is present
>>   vhost: restrict Linux dependency to kernel vhost
>>   vhost-user: support cross-endian vnet headers
>>   vhost-net: compile it on all targets that have virtio-net.
>>   vhost-net: revamp configure logic
>>   vhost-user-test: create a main loop per TestServer
>>   vhost-user-test: small changes to init_hugepagefs
>>   vhost-user-test: create a temporary directory per TestServer
>>
>>  backends/Makefile.objs     |   5 +-
>>  configure                  | 102 ++++++++++++++++++-----------
>>  default-configs/virtio.mak |   4 +-
>>  hw/net/Makefile.objs       |   4 +-
>>  hw/net/vhost_net-stub.c    |  92 ++++++++++++++++++++++++++
>>  hw/net/vhost_net.c         |  85 ++----------------------
>>  hw/virtio/Makefile.objs    |   8 ++-
>>  hw/virtio/vhost-backend.c  |  12 +++-
>>  hw/virtio/vhost-user.c     |  13 +++-
>>  hw/virtio/vhost.c          |   2 +-
>>  include/exec/poison.h      |   1 -
>>  net/Makefile.objs          |   4 +-
>>  net/net.c                  |   2 +-
>>  net/vhost-user-stub.c      |  23 +++++++
>>  net/vhost-user.c           |  13 ++++
>>  tests/Makefile.include     |   5 +-
>>  tests/vhost-user-test.c    | 160 +++++++++++++++++++++++----------------------
>>  17 files changed, 319 insertions(+), 216 deletions(-)
>>  create mode 100644 hw/net/vhost_net-stub.c
>>  create mode 100644 net/vhost-user-stub.c
>>
>> -- 
>> 1.8.3.1

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH v2 0/9] vhost: enable for all targets
  2019-02-14 20:37   ` Paolo Bonzini
@ 2019-02-15  4:25     ` Michael S. Tsirkin
  0 siblings, 0 replies; 15+ messages in thread
From: Michael S. Tsirkin @ 2019-02-15  4:25 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel, thuth, peter.maydell

On Thu, Feb 14, 2019 at 09:37:42PM +0100, Paolo Bonzini wrote:
> On 14/02/19 20:28, Michael S. Tsirkin wrote:
> > On Thu, Feb 14, 2019 at 06:35:47PM +0100, Paolo Bonzini wrote:
> >> See also "[PATCH for-3.2 00/10] vhost: preparation for qgraph
> >> conversion of vhost-user-test".  Some of the other vhost-user-test
> >> patches have gone in already, and this is what is left.
> >>
> >> These patches are a prerequisite for both kconfig and qgraph.
> >>
> >> I will probably test them on macOS myself before these are included
> >> in a pull request, since the previous versions had some issues.
> >> Michael, let me know if you want me to send the pull request.
> >>
> >> Thanks,
> >>
> >> Paolo
> > 
> > what's the changelog from v1?
> 
> It's rebased and it includes the not-yet-merged parts of "vhost:
> preparation for qgraph conversion of vhost-user-test", but otherwise
> there are no changes.
> 
> Paolo

Peter could you help out by trying my pci branch on
non-linux now? Did runtime failures get fixed?

Would be vry much appreciated.

Thanks a lot!


> > 
> >> Paolo Bonzini (9):
> >>   vhost-net: move stubs to a separate file
> >>   vhost-net-user: add stubs for when no virtio-net device is present
> >>   vhost: restrict Linux dependency to kernel vhost
> >>   vhost-user: support cross-endian vnet headers
> >>   vhost-net: compile it on all targets that have virtio-net.
> >>   vhost-net: revamp configure logic
> >>   vhost-user-test: create a main loop per TestServer
> >>   vhost-user-test: small changes to init_hugepagefs
> >>   vhost-user-test: create a temporary directory per TestServer
> >>
> >>  backends/Makefile.objs     |   5 +-
> >>  configure                  | 102 ++++++++++++++++++-----------
> >>  default-configs/virtio.mak |   4 +-
> >>  hw/net/Makefile.objs       |   4 +-
> >>  hw/net/vhost_net-stub.c    |  92 ++++++++++++++++++++++++++
> >>  hw/net/vhost_net.c         |  85 ++----------------------
> >>  hw/virtio/Makefile.objs    |   8 ++-
> >>  hw/virtio/vhost-backend.c  |  12 +++-
> >>  hw/virtio/vhost-user.c     |  13 +++-
> >>  hw/virtio/vhost.c          |   2 +-
> >>  include/exec/poison.h      |   1 -
> >>  net/Makefile.objs          |   4 +-
> >>  net/net.c                  |   2 +-
> >>  net/vhost-user-stub.c      |  23 +++++++
> >>  net/vhost-user.c           |  13 ++++
> >>  tests/Makefile.include     |   5 +-
> >>  tests/vhost-user-test.c    | 160 +++++++++++++++++++++++----------------------
> >>  17 files changed, 319 insertions(+), 216 deletions(-)
> >>  create mode 100644 hw/net/vhost_net-stub.c
> >>  create mode 100644 net/vhost-user-stub.c
> >>
> >> -- 
> >> 1.8.3.1

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH 8/9] vhost-user-test: small changes to init_hugepagefs
  2019-02-14 17:35 ` [Qemu-devel] [PATCH 8/9] vhost-user-test: small changes to init_hugepagefs Paolo Bonzini
@ 2019-02-15  8:27   ` Thomas Huth
  0 siblings, 0 replies; 15+ messages in thread
From: Thomas Huth @ 2019-02-15  8:27 UTC (permalink / raw)
  To: Paolo Bonzini, qemu-devel; +Cc: mst

On 14/02/2019 18.35, Paolo Bonzini wrote:
> After the conversion to qgraph, the equivalent of "main" will be in
> a constructor and will run even if the tests are not being requested.
> Therefore, it should not assert that init_hugepagefs succeeds and will
> be called when creating the TestServer.  This patch changes the prototype
> of init_hugepagefs, this way the next patch looks nicer.
> 
> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> Message-Id: <1543851204-41186-14-git-send-email-pbonzini@redhat.com>
> ---
>  tests/vhost-user-test.c | 26 ++++++++++++++------------
>  1 file changed, 14 insertions(+), 12 deletions(-)
> 
> diff --git a/tests/vhost-user-test.c b/tests/vhost-user-test.c
> index 33030e0..516e31c 100644
> --- a/tests/vhost-user-test.c
> +++ b/tests/vhost-user-test.c
> @@ -465,14 +465,20 @@ static void chr_read(void *opaque, const uint8_t *buf, int size)
>      g_mutex_unlock(&s->data_mutex);
>  }
>  
> -#ifdef CONFIG_LINUX
> -static const char *init_hugepagefs(const char *path)
> +static const char *init_hugepagefs(void)
>  {
> +#ifdef CONFIG_LINUX
> +    const char *path = getenv("QTEST_HUGETLBFS_PATH");
>      struct statfs fs;
>      int ret;
>  
> +    if (!path) {
> +        return NULL;
> +    }
> +
>      if (access(path, R_OK | W_OK | X_OK)) {
>          g_test_message("access on path (%s): %s\n", path, strerror(errno));
> +        abort();
>          return NULL;
>      }

I think I'd rather replace the whole if-statement with something like
this instead:

    g_assert_cmpint(access(path, R_OK | W_OK | X_OK), ==, 0);

> @@ -482,17 +488,21 @@ static const char *init_hugepagefs(const char *path)
>  
>      if (ret != 0) {
>          g_test_message("statfs on path (%s): %s\n", path, strerror(errno));
> +        abort();
>          return NULL;
>      }

Maybe simplify to:

    TFR(statfs_err = statfs(path, &fs));
    g_assert_cmpint(statfs_err, ==, 0);

>      if (fs.f_type != HUGETLBFS_MAGIC) {
>          g_test_message("Warning: path not on HugeTLBFS: %s\n", path);
> +        abort();
>          return NULL;
>      }

    g_assert_cmpint(fs.f_type, ==, HUGETLBFS_MAGIC);

?

>      return path;
> -}
> +#else
> +    return NULL;
>  #endif
> +}
>  
>  static TestServer *test_server_new(const gchar *name)
>  {
> @@ -986,7 +996,6 @@ static void test_multiqueue(void)
>  
>  int main(int argc, char **argv)
>  {
> -    const char *hugefs;
>      int ret;
>      char template[] = "/tmp/vhost-test-XXXXXX";
>  
> @@ -1001,14 +1010,7 @@ int main(int argc, char **argv)
>      }
>      g_assert(tmpfs);
>  
> -    root = tmpfs;
> -#ifdef CONFIG_LINUX
> -    hugefs = getenv("QTEST_HUGETLBFS_PATH");
> -    if (hugefs) {
> -        root = init_hugepagefs(hugefs);
> -        g_assert(root);
> -    }
> -#endif
> +    root = init_hugepagefs() ? : tmpfs;

I'd prefer the Elvis operator without space inbetween.

>      if (qemu_memfd_check(0)) {
>          qtest_add_data_func("/vhost-user/read-guest-mem/memfd",

Anyway, just nits, so still:

Reviewed-by: Thomas Huth <thuth@redhat.com>

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2019-02-15  8:41 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-02-14 17:35 [Qemu-devel] [PATCH v2 0/9] vhost: enable for all targets Paolo Bonzini
2019-02-14 17:35 ` [Qemu-devel] [PATCH 1/9] vhost-net: move stubs to a separate file Paolo Bonzini
2019-02-14 17:35 ` [Qemu-devel] [PATCH 2/9] vhost-net-user: add stubs for when no virtio-net device is present Paolo Bonzini
2019-02-14 17:35 ` [Qemu-devel] [PATCH 3/9] vhost: restrict Linux dependency to kernel vhost Paolo Bonzini
2019-02-14 17:35 ` [Qemu-devel] [PATCH 4/9] vhost-user: support cross-endian vnet headers Paolo Bonzini
2019-02-14 17:35 ` [Qemu-devel] [PATCH 5/9] vhost-net: compile it on all targets that have virtio-net Paolo Bonzini
2019-02-14 17:35 ` [Qemu-devel] [PATCH 6/9] vhost-net: revamp configure logic Paolo Bonzini
2019-02-14 17:35 ` [Qemu-devel] [PATCH 7/9] vhost-user-test: create a main loop per TestServer Paolo Bonzini
2019-02-14 17:35 ` [Qemu-devel] [PATCH 8/9] vhost-user-test: small changes to init_hugepagefs Paolo Bonzini
2019-02-15  8:27   ` Thomas Huth
2019-02-14 17:35 ` [Qemu-devel] [PATCH 9/9] vhost-user-test: create a temporary directory per TestServer Paolo Bonzini
2019-02-14 19:05 ` [Qemu-devel] [PATCH v2 0/9] vhost: enable for all targets Michael S. Tsirkin
2019-02-14 19:28 ` Michael S. Tsirkin
2019-02-14 20:37   ` Paolo Bonzini
2019-02-15  4:25     ` Michael S. Tsirkin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.