From 002d6a7e5517e27641d8a51b0e029f63e7aed6a0 Mon Sep 17 00:00:00 2001 From: Maxime Coquelin Date: Mon, 6 Nov 2017 21:38:11 +0100 Subject: [PATCH] vhost: add flag to enable IOMMU support Qemu versions from v2.7.0 to v2.9.0 have their reply-ack protocol feature implementation broken with multiqueue. The reply-ack protocol feature is optional except for IOMMU feature. This patch introduce a new RTE_VHOST_USER_IOMMU_SUPPORT flag to enable VIRTIO_F_IOMMU_PLATFORM virtio feature. By default, the IOMMU support is now disabled. Signed-off-by: Maxime Coquelin Acked-by: Yuanhan Liu Tested-by: Mark Kavanagh Acked-by: Mark Kavanagh --- doc/guides/prog_guide/vhost_lib.rst | 14 ++++++++++++++ doc/guides/rel_notes/release_17_11.rst | 3 ++- lib/librte_vhost/rte_vhost.h | 1 + lib/librte_vhost/socket.c | 6 ++++++ 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/doc/guides/prog_guide/vhost_lib.rst b/doc/guides/prog_guide/vhost_lib.rst index d02e3cf50d..e71bdbd51d 100644 --- a/doc/guides/prog_guide/vhost_lib.rst +++ b/doc/guides/prog_guide/vhost_lib.rst @@ -110,6 +110,20 @@ The following is an overview of some key Vhost API functions: of those segments, thus the fewer the segments, the quicker we will get the mapping. NOTE: we may speed it by using tree searching in future. + - ``RTE_VHOST_USER_IOMMU_SUPPORT`` + + IOMMU support will be enabled when this flag is set. It is disabled by + default. + + Enabling this flag makes possible to use guest vIOMMU to protect vhost + from accessing memory the virtio device isn't allowed to, when the feature + is negotiated and an IOMMU device is declared. + + However, this feature enables vhost-user's reply-ack protocol feature, + which implementation is buggy in Qemu v2.7.0-v2.9.0 when doing multiqueue. + Enabling this flag with these Qemu version results in Qemu being blocked + when multiple queue pairs are declared. + * ``rte_vhost_driver_set_features(path, features)`` This function sets the feature bits the vhost-user driver supports. The diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst index 4846448752..27818d481f 100644 --- a/doc/guides/rel_notes/release_17_11.rst +++ b/doc/guides/rel_notes/release_17_11.rst @@ -173,7 +173,8 @@ New Features * **Added IOMMU support to libvhost-user** Implemented device IOTLB in Vhost-user backend, and enabled Virtio's IOMMU - feature. + feature. The feature is disabled by default, and can be enabled by setting + RTE_VHOST_USER_IOMMU_SUPPORT flag at vhost device registration time. * **Added the Event Ethernet Adapter Library.** diff --git a/lib/librte_vhost/rte_vhost.h b/lib/librte_vhost/rte_vhost.h index fe5c94c699..f653644955 100644 --- a/lib/librte_vhost/rte_vhost.h +++ b/lib/librte_vhost/rte_vhost.h @@ -56,6 +56,7 @@ extern "C" { #define RTE_VHOST_USER_CLIENT (1ULL << 0) #define RTE_VHOST_USER_NO_RECONNECT (1ULL << 1) #define RTE_VHOST_USER_DEQUEUE_ZERO_COPY (1ULL << 2) +#define RTE_VHOST_USER_IOMMU_SUPPORT (1ULL << 3) /** * Information relating to memory regions including offsets to diff --git a/lib/librte_vhost/socket.c b/lib/librte_vhost/socket.c index 7018150213..422da002f8 100644 --- a/lib/librte_vhost/socket.c +++ b/lib/librte_vhost/socket.c @@ -68,6 +68,7 @@ struct vhost_user_socket { bool is_server; bool reconnect; bool dequeue_zero_copy; + bool iommu_support; /* * The "supported_features" indicates the feature bits the @@ -669,6 +670,11 @@ rte_vhost_driver_register(const char *path, uint64_t flags) vsocket->supported_features = VIRTIO_NET_SUPPORTED_FEATURES; vsocket->features = VIRTIO_NET_SUPPORTED_FEATURES; + if (!(flags & RTE_VHOST_USER_IOMMU_SUPPORT)) { + vsocket->supported_features &= ~(1ULL << VIRTIO_F_IOMMU_PLATFORM); + vsocket->features &= ~(1ULL << VIRTIO_F_IOMMU_PLATFORM); + } + if ((flags & RTE_VHOST_USER_CLIENT) != 0) { vsocket->reconnect = !(flags & RTE_VHOST_USER_NO_RECONNECT); if (vsocket->reconnect && reconn_tid == 0) { -- 2.20.1