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 <maxime.coquelin@redhat.com> Acked-by: Yuanhan Liu <yliu@fridaylinux.org> Tested-by: Mark Kavanagh <mark.b.kavanagh@intel.com> Acked-by: Mark Kavanagh <mark.b.kavanagh@intel.com>
This commit is contained in:
parent
6ea069651e
commit
002d6a7e55
@ -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
|
||||
|
@ -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.**
|
||||
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user