* [Qemu-devel] [PATCH 0/5] vhost: enable for all targets
@ 2018-11-26 13:20 Paolo Bonzini
2018-11-26 13:20 ` [Qemu-devel] [PATCH 1/5] vhost-net: move stubs to a separate file Paolo Bonzini
` (5 more replies)
0 siblings, 6 replies; 16+ messages in thread
From: Paolo Bonzini @ 2018-11-26 13:20 UTC (permalink / raw)
To: qemu-devel; +Cc: Marc-André Lureau, Michael S. Tsirkin
vhost does not have to be supported only if KVM is present, in fact
vhost-user does not even need any kind of kernel support. This series
changes this. The rationale is that, when vhost-user-test.c will be
converted to qgraph, it will be able to test vhost-user support
for virtio-mmio backend even on x86.
Paolo Bonzini (5):
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-net: compile it on all targets that have virtio-net.
vhost-net: revamp configure logic
backends/Makefile.objs | 5 +--
configure | 101 ++++++++++++++++++++++++++++-----------------
default-configs/virtio.mak | 4 +-
hw/net/Makefile.objs | 4 +-
hw/net/vhost_net-stub.c | 95 ++++++++++++++++++++++++++++++++++++++++++
hw/net/vhost_net.c | 78 ++--------------------------------
hw/virtio/Makefile.objs | 5 ++-
hw/virtio/vhost-backend.c | 11 ++++-
include/exec/poison.h | 1 -
net/Makefile.objs | 4 +-
net/net.c | 2 +-
net/vhost-user-stub.c | 23 +++++++++++
tests/Makefile.include | 5 +--
13 files changed, 209 insertions(+), 129 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] 16+ messages in thread
* [Qemu-devel] [PATCH 1/5] vhost-net: move stubs to a separate file
2018-11-26 13:20 [Qemu-devel] [PATCH 0/5] vhost: enable for all targets Paolo Bonzini
@ 2018-11-26 13:20 ` Paolo Bonzini
2018-11-26 13:20 ` [Qemu-devel] [PATCH 2/5] vhost-net-user: add stubs for when no virtio-net device is present Paolo Bonzini
` (4 subsequent siblings)
5 siblings, 0 replies; 16+ messages in thread
From: Paolo Bonzini @ 2018-11-26 13:20 UTC (permalink / raw)
To: qemu-devel; +Cc: Marc-André Lureau, Michael S. Tsirkin
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.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
hw/net/Makefile.objs | 4 ++-
hw/net/vhost_net-stub.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++
hw/net/vhost_net.c | 74 --------------------------------------
3 files changed, 98 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 fa461d4..c2705e6 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..4de1dfb
--- /dev/null
+++ b/hw/net/vhost_net-stub.c
@@ -0,0 +1,95 @@
+/*
+ * 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. See
+ * the COPYING file in the top-level directory.
+ *
+ * Contributions after 2012-01-13 are licensed under the terms of the
+ * GNU GPL, version 2 or (at your option) any later version.
+ */
+
+#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] 16+ messages in thread
* [Qemu-devel] [PATCH 2/5] vhost-net-user: add stubs for when no virtio-net device is present
2018-11-26 13:20 [Qemu-devel] [PATCH 0/5] vhost: enable for all targets Paolo Bonzini
2018-11-26 13:20 ` [Qemu-devel] [PATCH 1/5] vhost-net: move stubs to a separate file Paolo Bonzini
@ 2018-11-26 13:20 ` Paolo Bonzini
2018-11-26 16:45 ` Philippe Mathieu-Daudé
2018-11-26 13:20 ` [Qemu-devel] [PATCH 3/5] vhost: restrict Linux dependency to kernel vhost Paolo Bonzini
` (3 subsequent siblings)
5 siblings, 1 reply; 16+ messages in thread
From: Paolo Bonzini @ 2018-11-26 13:20 UTC (permalink / raw)
To: qemu-devel; +Cc: Marc-André Lureau, Michael S. Tsirkin
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.
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 0a3c6a7..cda17ef 100755
--- a/configure
+++ b/configure
@@ -6513,7 +6513,7 @@ if test "$vhost_scsi" = "yes" ; then
echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
fi
if test "$vhost_net" = "yes" -a "$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..fe6202a 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_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 07c194a..95a74ad 100644
--- a/net/net.c
+++ b/net/net.c
@@ -955,7 +955,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] 16+ messages in thread
* [Qemu-devel] [PATCH 3/5] vhost: restrict Linux dependency to kernel vhost
2018-11-26 13:20 [Qemu-devel] [PATCH 0/5] vhost: enable for all targets Paolo Bonzini
2018-11-26 13:20 ` [Qemu-devel] [PATCH 1/5] vhost-net: move stubs to a separate file Paolo Bonzini
2018-11-26 13:20 ` [Qemu-devel] [PATCH 2/5] vhost-net-user: add stubs for when no virtio-net device is present Paolo Bonzini
@ 2018-11-26 13:20 ` Paolo Bonzini
2018-11-26 16:51 ` Philippe Mathieu-Daudé
2018-11-26 13:20 ` [Qemu-devel] [PATCH 4/5] vhost-net: compile it on all targets that have virtio-net Paolo Bonzini
` (2 subsequent siblings)
5 siblings, 1 reply; 16+ messages in thread
From: Paolo Bonzini @ 2018-11-26 13:20 UTC (permalink / raw)
To: qemu-devel; +Cc: Marc-André Lureau, Michael S. Tsirkin
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.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
backends/Makefile.objs | 5 ++---
default-configs/virtio.mak | 4 ++--
hw/net/vhost_net.c | 2 +-
hw/virtio/Makefile.objs | 5 +++--
hw/virtio/vhost-backend.c | 11 +++++++++--
5 files changed, 17 insertions(+), 10 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 1304849..340050a 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=y
CONFIG_VIRTIO_BALLOON=y
diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
index fe6202a..2a300ee 100644
--- a/hw/net/vhost_net.c
+++ b/hw/net/vhost_net.c
@@ -193,7 +193,7 @@ struct vhost_net *vhost_net_init(VhostNetOptions *options)
}
/* Set sane init value. Override when guest acks. */
-#ifdef CONFIG_VHOST_USER
+#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) {
diff --git a/hw/virtio/Makefile.objs b/hw/virtio/Makefile.objs
index 1b2799c..e8eff80 100644
--- a/hw/virtio/Makefile.objs
+++ b/hw/virtio/Makefile.objs
@@ -9,9 +9,10 @@ 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_USER) += vhost-user.o
obj-$(CONFIG_VHOST_VSOCK) += vhost-vsock.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
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..b5d2e30 100644
--- a/hw/virtio/vhost-backend.c
+++ b/hw/virtio/vhost-backend.c
@@ -9,12 +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"
+#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 +267,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;
--
1.8.3.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [Qemu-devel] [PATCH 4/5] vhost-net: compile it on all targets that have virtio-net.
2018-11-26 13:20 [Qemu-devel] [PATCH 0/5] vhost: enable for all targets Paolo Bonzini
` (2 preceding siblings ...)
2018-11-26 13:20 ` [Qemu-devel] [PATCH 3/5] vhost: restrict Linux dependency to kernel vhost Paolo Bonzini
@ 2018-11-26 13:20 ` Paolo Bonzini
2018-11-26 16:55 ` Philippe Mathieu-Daudé
2018-11-26 13:20 ` [Qemu-devel] [PATCH 5/5] vhost-net: revamp configure logic Paolo Bonzini
2018-11-26 22:43 ` [Qemu-devel] [PATCH 0/5] vhost: enable for all targets Michael S. Tsirkin
5 siblings, 1 reply; 16+ messages in thread
From: Paolo Bonzini @ 2018-11-26 13:20 UTC (permalink / raw)
To: qemu-devel; +Cc: Marc-André Lureau, Michael S. Tsirkin
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.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
configure | 11 ++++-------
hw/net/Makefile.objs | 4 ++--
include/exec/poison.h | 1 -
tests/Makefile.include | 5 +----
4 files changed, 7 insertions(+), 14 deletions(-)
diff --git a/configure b/configure
index cda17ef..b3b4464 100755
--- a/configure
+++ b/configure
@@ -6512,7 +6512,10 @@ fi
if test "$vhost_scsi" = "yes" ; then
echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
fi
-if test "$vhost_net" = "yes" -a "$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
@@ -7275,12 +7278,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 c2705e6..2d7ee0a 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/include/exec/poison.h b/include/exec/poison.h
index 32d5378..b158632 100644
--- a/include/exec/poison.h
+++ b/include/exec/poison.h
@@ -85,7 +85,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 fb0b449..03a64ce 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -204,10 +204,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)
--
1.8.3.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [Qemu-devel] [PATCH 5/5] vhost-net: revamp configure logic
2018-11-26 13:20 [Qemu-devel] [PATCH 0/5] vhost: enable for all targets Paolo Bonzini
` (3 preceding siblings ...)
2018-11-26 13:20 ` [Qemu-devel] [PATCH 4/5] vhost-net: compile it on all targets that have virtio-net Paolo Bonzini
@ 2018-11-26 13:20 ` Paolo Bonzini
2018-11-26 17:00 ` Philippe Mathieu-Daudé
2018-11-26 22:43 ` [Qemu-devel] [PATCH 0/5] vhost: enable for all targets Michael S. Tsirkin
5 siblings, 1 reply; 16+ messages in thread
From: Paolo Bonzini @ 2018-11-26 13:20 UTC (permalink / raw)
To: qemu-devel; +Cc: Marc-André Lureau, Michael S. Tsirkin
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.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
configure | 88 +++++++++++++++++++++++++++++++----------------
hw/virtio/Makefile.objs | 4 +--
hw/virtio/vhost-backend.c | 4 +--
3 files changed, 62 insertions(+), 34 deletions(-)
diff --git a/configure b/configure
index b3b4464..a15f143 100755
--- a/configure
+++ b/configure
@@ -366,10 +366,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"
@@ -774,6 +774,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"
@@ -874,10 +875,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"
@@ -1258,11 +1255,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"
;;
@@ -1463,11 +1456,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"
;;
@@ -1499,14 +1492,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"
@@ -1731,8 +1716,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
@@ -1756,7 +1744,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
@@ -1773,7 +1760,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
@@ -2150,6 +2136,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
@@ -6524,6 +6549,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 e8eff80..87402d1 100644
--- a/hw/virtio/Makefile.objs
+++ b/hw/virtio/Makefile.objs
@@ -11,8 +11,8 @@ obj-$(call land,$(CONFIG_VIRTIO_CRYPTO),$(CONFIG_VIRTIO_PCI)) += virtio-crypto-p
obj-$(CONFIG_VHOST_USER) += vhost-user.o
obj-$(CONFIG_VHOST_VSOCK) += vhost-vsock.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
endif
common-obj-$(CONFIG_ALL) += vhost-stub.o
diff --git a/hw/virtio/vhost-backend.c b/hw/virtio/vhost-backend.c
index b5d2e30..46d388b 100644
--- a/hw/virtio/vhost-backend.c
+++ b/hw/virtio/vhost-backend.c
@@ -13,7 +13,7 @@
#include "hw/virtio/vhost-backend.h"
#include "qemu/error-report.h"
-#ifdef CONFIG_LINUX
+#ifdef CONFIG_VHOST_KERNEL
#include <linux/vhost.h>
#include <sys/ioctl.h>
@@ -274,7 +274,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] 16+ messages in thread
* Re: [Qemu-devel] [PATCH 2/5] vhost-net-user: add stubs for when no virtio-net device is present
2018-11-26 13:20 ` [Qemu-devel] [PATCH 2/5] vhost-net-user: add stubs for when no virtio-net device is present Paolo Bonzini
@ 2018-11-26 16:45 ` Philippe Mathieu-Daudé
2018-11-26 22:43 ` Michael S. Tsirkin
0 siblings, 1 reply; 16+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-11-26 16:45 UTC (permalink / raw)
To: Paolo Bonzini, qemu-devel; +Cc: Marc-André Lureau, Michael S. Tsirkin
On 26/11/18 14:20, Paolo Bonzini wrote:
> 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.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@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 0a3c6a7..cda17ef 100755
> --- a/configure
> +++ b/configure
> @@ -6513,7 +6513,7 @@ if test "$vhost_scsi" = "yes" ; then
> echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
> fi
> if test "$vhost_net" = "yes" -a "$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..fe6202a 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_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 07c194a..95a74ad 100644
> --- a/net/net.c
> +++ b/net/net.c
> @@ -955,7 +955,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;
> +}
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Qemu-devel] [PATCH 3/5] vhost: restrict Linux dependency to kernel vhost
2018-11-26 13:20 ` [Qemu-devel] [PATCH 3/5] vhost: restrict Linux dependency to kernel vhost Paolo Bonzini
@ 2018-11-26 16:51 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 16+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-11-26 16:51 UTC (permalink / raw)
To: Paolo Bonzini, qemu-devel; +Cc: Marc-André Lureau, Michael S. Tsirkin
On 26/11/18 14:20, Paolo Bonzini wrote:
> 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.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> backends/Makefile.objs | 5 ++---
> default-configs/virtio.mak | 4 ++--
> hw/net/vhost_net.c | 2 +-
> hw/virtio/Makefile.objs | 5 +++--
> hw/virtio/vhost-backend.c | 11 +++++++++--
> 5 files changed, 17 insertions(+), 10 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
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
>
> common-obj-$(CONFIG_LINUX) += hostmem-memfd.o
> diff --git a/default-configs/virtio.mak b/default-configs/virtio.mak
> index 1304849..340050a 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=y
> CONFIG_VIRTIO_BALLOON=y
> diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
> index fe6202a..2a300ee 100644
> --- a/hw/net/vhost_net.c
> +++ b/hw/net/vhost_net.c
> @@ -193,7 +193,7 @@ struct vhost_net *vhost_net_init(VhostNetOptions *options)
> }
>
> /* Set sane init value. Override when guest acks. */
> -#ifdef CONFIG_VHOST_USER
> +#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) {
> diff --git a/hw/virtio/Makefile.objs b/hw/virtio/Makefile.objs
> index 1b2799c..e8eff80 100644
> --- a/hw/virtio/Makefile.objs
> +++ b/hw/virtio/Makefile.objs
> @@ -9,9 +9,10 @@ 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_USER) += vhost-user.o
> obj-$(CONFIG_VHOST_VSOCK) += vhost-vsock.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
> 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..b5d2e30 100644
> --- a/hw/virtio/vhost-backend.c
> +++ b/hw/virtio/vhost-backend.c
> @@ -9,12 +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"
>
> +#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 +267,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;
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Qemu-devel] [PATCH 4/5] vhost-net: compile it on all targets that have virtio-net.
2018-11-26 13:20 ` [Qemu-devel] [PATCH 4/5] vhost-net: compile it on all targets that have virtio-net Paolo Bonzini
@ 2018-11-26 16:55 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 16+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-11-26 16:55 UTC (permalink / raw)
To: Paolo Bonzini, qemu-devel; +Cc: Marc-André Lureau, Michael S. Tsirkin
On 26/11/18 14:20, Paolo Bonzini wrote:
> 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.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> ---
> configure | 11 ++++-------
> hw/net/Makefile.objs | 4 ++--
> include/exec/poison.h | 1 -
> tests/Makefile.include | 5 +----
> 4 files changed, 7 insertions(+), 14 deletions(-)
>
> diff --git a/configure b/configure
> index cda17ef..b3b4464 100755
> --- a/configure
> +++ b/configure
> @@ -6512,7 +6512,10 @@ fi
> if test "$vhost_scsi" = "yes" ; then
> echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
> fi
> -if test "$vhost_net" = "yes" -a "$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
> @@ -7275,12 +7278,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 c2705e6..2d7ee0a 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/include/exec/poison.h b/include/exec/poison.h
> index 32d5378..b158632 100644
> --- a/include/exec/poison.h
> +++ b/include/exec/poison.h
> @@ -85,7 +85,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 fb0b449..03a64ce 100644
> --- a/tests/Makefile.include
> +++ b/tests/Makefile.include
> @@ -204,10 +204,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)
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Qemu-devel] [PATCH 5/5] vhost-net: revamp configure logic
2018-11-26 13:20 ` [Qemu-devel] [PATCH 5/5] vhost-net: revamp configure logic Paolo Bonzini
@ 2018-11-26 17:00 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 16+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-11-26 17:00 UTC (permalink / raw)
To: Paolo Bonzini, qemu-devel; +Cc: Marc-André Lureau, Michael S. Tsirkin
On 26/11/18 14:20, Paolo Bonzini wrote:
> 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.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> configure | 88 +++++++++++++++++++++++++++++++----------------
> hw/virtio/Makefile.objs | 4 +--
> hw/virtio/vhost-backend.c | 4 +--
> 3 files changed, 62 insertions(+), 34 deletions(-)
>
> diff --git a/configure b/configure
> index b3b4464..a15f143 100755
> --- a/configure
> +++ b/configure
> @@ -366,10 +366,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"
> @@ -774,6 +774,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"
> @@ -874,10 +875,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"
> @@ -1258,11 +1255,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"
> ;;
> @@ -1463,11 +1456,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"
> ;;
> @@ -1499,14 +1492,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"
> @@ -1731,8 +1716,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
> @@ -1756,7 +1744,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
> @@ -1773,7 +1760,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
> @@ -2150,6 +2136,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
Easier to review, thanks.
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> +
> ##########################################
> # MinGW / Mingw-w64 localtime_r/gmtime_r check
>
> @@ -6524,6 +6549,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 e8eff80..87402d1 100644
> --- a/hw/virtio/Makefile.objs
> +++ b/hw/virtio/Makefile.objs
> @@ -11,8 +11,8 @@ obj-$(call land,$(CONFIG_VIRTIO_CRYPTO),$(CONFIG_VIRTIO_PCI)) += virtio-crypto-p
>
> obj-$(CONFIG_VHOST_USER) += vhost-user.o
> obj-$(CONFIG_VHOST_VSOCK) += vhost-vsock.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
> endif
>
> common-obj-$(CONFIG_ALL) += vhost-stub.o
> diff --git a/hw/virtio/vhost-backend.c b/hw/virtio/vhost-backend.c
> index b5d2e30..46d388b 100644
> --- a/hw/virtio/vhost-backend.c
> +++ b/hw/virtio/vhost-backend.c
> @@ -13,7 +13,7 @@
> #include "hw/virtio/vhost-backend.h"
> #include "qemu/error-report.h"
>
> -#ifdef CONFIG_LINUX
> +#ifdef CONFIG_VHOST_KERNEL
> #include <linux/vhost.h>
> #include <sys/ioctl.h>
>
> @@ -274,7 +274,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;
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Qemu-devel] [PATCH 0/5] vhost: enable for all targets
2018-11-26 13:20 [Qemu-devel] [PATCH 0/5] vhost: enable for all targets Paolo Bonzini
` (4 preceding siblings ...)
2018-11-26 13:20 ` [Qemu-devel] [PATCH 5/5] vhost-net: revamp configure logic Paolo Bonzini
@ 2018-11-26 22:43 ` Michael S. Tsirkin
2018-11-27 9:04 ` Paolo Bonzini
5 siblings, 1 reply; 16+ messages in thread
From: Michael S. Tsirkin @ 2018-11-26 22:43 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: qemu-devel, Marc-André Lureau
On Mon, Nov 26, 2018 at 02:20:38PM +0100, Paolo Bonzini wrote:
> vhost does not have to be supported only if KVM is present, in fact
> vhost-user does not even need any kind of kernel support. This series
> changes this. The rationale is that, when vhost-user-test.c will be
> converted to qgraph, it will be able to test vhost-user support
> for virtio-mmio backend even on x86.
The reason for limiting it to KVM was very simple:
it has the same set of problems with ordering
as mttcg.
So I guess it's fine but I think we must then limit it
to when tcg emits fence instructions.
Otherwise we'll get subtle race conditions.
> Paolo Bonzini (5):
> 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-net: compile it on all targets that have virtio-net.
> vhost-net: revamp configure logic
>
> backends/Makefile.objs | 5 +--
> configure | 101 ++++++++++++++++++++++++++++-----------------
> default-configs/virtio.mak | 4 +-
> hw/net/Makefile.objs | 4 +-
> hw/net/vhost_net-stub.c | 95 ++++++++++++++++++++++++++++++++++++++++++
> hw/net/vhost_net.c | 78 ++--------------------------------
> hw/virtio/Makefile.objs | 5 ++-
> hw/virtio/vhost-backend.c | 11 ++++-
> include/exec/poison.h | 1 -
> net/Makefile.objs | 4 +-
> net/net.c | 2 +-
> net/vhost-user-stub.c | 23 +++++++++++
> tests/Makefile.include | 5 +--
> 13 files changed, 209 insertions(+), 129 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] 16+ messages in thread
* Re: [Qemu-devel] [PATCH 2/5] vhost-net-user: add stubs for when no virtio-net device is present
2018-11-26 16:45 ` Philippe Mathieu-Daudé
@ 2018-11-26 22:43 ` Michael S. Tsirkin
2018-11-26 22:52 ` Philippe Mathieu-Daudé
0 siblings, 1 reply; 16+ messages in thread
From: Michael S. Tsirkin @ 2018-11-26 22:43 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: Paolo Bonzini, qemu-devel, Marc-André Lureau
On Mon, Nov 26, 2018 at 05:45:47PM +0100, Philippe Mathieu-Daudé wrote:
> On 26/11/18 14:20, Paolo Bonzini wrote:
> > 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.
> >
> > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
>
> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
whic hosts/targets and how did you test exactly?
> > ---
> > 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 0a3c6a7..cda17ef 100755
> > --- a/configure
> > +++ b/configure
> > @@ -6513,7 +6513,7 @@ if test "$vhost_scsi" = "yes" ; then
> > echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
> > fi
> > if test "$vhost_net" = "yes" -a "$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..fe6202a 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_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 07c194a..95a74ad 100644
> > --- a/net/net.c
> > +++ b/net/net.c
> > @@ -955,7 +955,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;
> > +}
> >
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Qemu-devel] [PATCH 2/5] vhost-net-user: add stubs for when no virtio-net device is present
2018-11-26 22:43 ` Michael S. Tsirkin
@ 2018-11-26 22:52 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 16+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-11-26 22:52 UTC (permalink / raw)
To: Michael S. Tsirkin; +Cc: Paolo Bonzini, qemu-devel, Marc-André Lureau
On 26/11/18 23:43, Michael S. Tsirkin wrote:
> On Mon, Nov 26, 2018 at 05:45:47PM +0100, Philippe Mathieu-Daudé wrote:
>> On 26/11/18 14:20, Paolo Bonzini wrote:
>>> 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.
>>>
>>> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
>>
>> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
>> Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
>
> whic hosts/targets and how did you test exactly?
This series is a buildsys refactor; after reviewing I building tested
linux (KVM) and win32 (default, --enable-vhost-user,
--enable-vhost-kernel). I did not test on BSD.
I did not test the running vhost code, simply assumed linking is enough.
>
>>> ---
>>> 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 0a3c6a7..cda17ef 100755
>>> --- a/configure
>>> +++ b/configure
>>> @@ -6513,7 +6513,7 @@ if test "$vhost_scsi" = "yes" ; then
>>> echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
>>> fi
>>> if test "$vhost_net" = "yes" -a "$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..fe6202a 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_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 07c194a..95a74ad 100644
>>> --- a/net/net.c
>>> +++ b/net/net.c
>>> @@ -955,7 +955,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;
>>> +}
>>>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Qemu-devel] [PATCH 0/5] vhost: enable for all targets
2018-11-26 22:43 ` [Qemu-devel] [PATCH 0/5] vhost: enable for all targets Michael S. Tsirkin
@ 2018-11-27 9:04 ` Paolo Bonzini
2018-11-27 16:27 ` Michael S. Tsirkin
0 siblings, 1 reply; 16+ messages in thread
From: Paolo Bonzini @ 2018-11-27 9:04 UTC (permalink / raw)
To: Michael S. Tsirkin; +Cc: qemu-devel, Marc-André Lureau
On 26/11/18 23:43, Michael S. Tsirkin wrote:
> On Mon, Nov 26, 2018 at 02:20:38PM +0100, Paolo Bonzini wrote:
>> vhost does not have to be supported only if KVM is present, in fact
>> vhost-user does not even need any kind of kernel support. This series
>> changes this. The rationale is that, when vhost-user-test.c will be
>> converted to qgraph, it will be able to test vhost-user support
>> for virtio-mmio backend even on x86.
>
> The reason for limiting it to KVM was very simple:
> it has the same set of problems with ordering
> as mttcg.
>
> So I guess it's fine but I think we must then limit it
> to when tcg emits fence instructions.
>
> Otherwise we'll get subtle race conditions.
Got it, I'll take a look. However, right now you _can_ use vhost with
tcg as long as e.g. qemu-system-x86_64 is compiled with KVM support, so
this patch is not changing anything in this respect; the bug is
independent of this series.
Paolo
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Qemu-devel] [PATCH 0/5] vhost: enable for all targets
2018-11-27 9:04 ` Paolo Bonzini
@ 2018-11-27 16:27 ` Michael S. Tsirkin
2018-11-27 17:00 ` Paolo Bonzini
0 siblings, 1 reply; 16+ messages in thread
From: Michael S. Tsirkin @ 2018-11-27 16:27 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: Marc-André Lureau, qemu-devel
On Tue, Nov 27, 2018 at 10:04:59AM +0100, Paolo Bonzini wrote:
> On 26/11/18 23:43, Michael S. Tsirkin wrote:
> > On Mon, Nov 26, 2018 at 02:20:38PM +0100, Paolo Bonzini wrote:
> >> vhost does not have to be supported only if KVM is present, in fact
> >> vhost-user does not even need any kind of kernel support. This series
> >> changes this. The rationale is that, when vhost-user-test.c will be
> >> converted to qgraph, it will be able to test vhost-user support
> >> for virtio-mmio backend even on x86.
> >
> > The reason for limiting it to KVM was very simple:
> > it has the same set of problems with ordering
> > as mttcg.
> >
> > So I guess it's fine but I think we must then limit it
> > to when tcg emits fence instructions.
> >
> > Otherwise we'll get subtle race conditions.
>
> Got it, I'll take a look. However, right now you _can_ use vhost with
> tcg as long as e.g. qemu-system-x86_64 is compiled with KVM support, so
> this patch is not changing anything in this respect; the bug is
> independent of this series.
>
> Paolo
>
Well qemu built with KVM implies host architecture == guest
architecture, right? That should ensure race conditions do not happen in
a very hacky way.
--
MST
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Qemu-devel] [PATCH 0/5] vhost: enable for all targets
2018-11-27 16:27 ` Michael S. Tsirkin
@ 2018-11-27 17:00 ` Paolo Bonzini
0 siblings, 0 replies; 16+ messages in thread
From: Paolo Bonzini @ 2018-11-27 17:00 UTC (permalink / raw)
To: Michael S. Tsirkin; +Cc: Marc-André Lureau, qemu-devel
On 27/11/18 17:27, Michael S. Tsirkin wrote:
> On Tue, Nov 27, 2018 at 10:04:59AM +0100, Paolo Bonzini wrote:
>> On 26/11/18 23:43, Michael S. Tsirkin wrote:
>>> On Mon, Nov 26, 2018 at 02:20:38PM +0100, Paolo Bonzini wrote:
>>>> vhost does not have to be supported only if KVM is present, in fact
>>>> vhost-user does not even need any kind of kernel support. This series
>>>> changes this. The rationale is that, when vhost-user-test.c will be
>>>> converted to qgraph, it will be able to test vhost-user support
>>>> for virtio-mmio backend even on x86.
>>>
>>> The reason for limiting it to KVM was very simple:
>>> it has the same set of problems with ordering
>>> as mttcg.
>>>
>>> So I guess it's fine but I think we must then limit it
>>> to when tcg emits fence instructions.
>>>
>>> Otherwise we'll get subtle race conditions.
>>
>> Got it, I'll take a look. However, right now you _can_ use vhost with
>> tcg as long as e.g. qemu-system-x86_64 is compiled with KVM support, so
>> this patch is not changing anything in this respect; the bug is
>> independent of this series.
>
> Well qemu built with KVM implies host architecture == guest
> architecture, right? That should ensure race conditions do not happen in
> a very hacky way.
It's not enough, event_idx requires smp_mb and single-threaded TCG does
not emit them. It is enough for smp_rmb/smp_wmb however, that makes sense.
Paolo
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2018-11-27 17:00 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-11-26 13:20 [Qemu-devel] [PATCH 0/5] vhost: enable for all targets Paolo Bonzini
2018-11-26 13:20 ` [Qemu-devel] [PATCH 1/5] vhost-net: move stubs to a separate file Paolo Bonzini
2018-11-26 13:20 ` [Qemu-devel] [PATCH 2/5] vhost-net-user: add stubs for when no virtio-net device is present Paolo Bonzini
2018-11-26 16:45 ` Philippe Mathieu-Daudé
2018-11-26 22:43 ` Michael S. Tsirkin
2018-11-26 22:52 ` Philippe Mathieu-Daudé
2018-11-26 13:20 ` [Qemu-devel] [PATCH 3/5] vhost: restrict Linux dependency to kernel vhost Paolo Bonzini
2018-11-26 16:51 ` Philippe Mathieu-Daudé
2018-11-26 13:20 ` [Qemu-devel] [PATCH 4/5] vhost-net: compile it on all targets that have virtio-net Paolo Bonzini
2018-11-26 16:55 ` Philippe Mathieu-Daudé
2018-11-26 13:20 ` [Qemu-devel] [PATCH 5/5] vhost-net: revamp configure logic Paolo Bonzini
2018-11-26 17:00 ` Philippe Mathieu-Daudé
2018-11-26 22:43 ` [Qemu-devel] [PATCH 0/5] vhost: enable for all targets Michael S. Tsirkin
2018-11-27 9:04 ` Paolo Bonzini
2018-11-27 16:27 ` Michael S. Tsirkin
2018-11-27 17:00 ` Paolo Bonzini
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.