70 lines
2.6 KiB
Diff
70 lines
2.6 KiB
Diff
|
From e06655cfe0fa9473b1e8b311571f36d787472834 Mon Sep 17 00:00:00 2001
|
||
|
From: Thomas Huth <thuth@redhat.com>
|
||
|
Date: Fri, 29 May 2020 05:54:02 -0400
|
||
|
Subject: [PATCH 20/42] vhost: correctly turn on VIRTIO_F_IOMMU_PLATFORM
|
||
|
|
||
|
RH-Author: Thomas Huth <thuth@redhat.com>
|
||
|
Message-id: <20200529055420.16855-21-thuth@redhat.com>
|
||
|
Patchwork-id: 97041
|
||
|
O-Subject: [RHEL-8.3.0 qemu-kvm PATCH v2 20/38] vhost: correctly turn on VIRTIO_F_IOMMU_PLATFORM
|
||
|
Bugzilla: 1828317
|
||
|
RH-Acked-by: Claudio Imbrenda <cimbrend@redhat.com>
|
||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||
|
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||
|
|
||
|
From: Jason Wang <jasowang@redhat.com>
|
||
|
|
||
|
We turn on device IOTLB via VIRTIO_F_IOMMU_PLATFORM unconditionally on
|
||
|
platform without IOMMU support. This can lead unnecessary IOTLB
|
||
|
transactions which will damage the performance.
|
||
|
|
||
|
Fixing this by check whether the device is backed by IOMMU and disable
|
||
|
device IOTLB.
|
||
|
|
||
|
Reported-by: Halil Pasic <pasic@linux.ibm.com>
|
||
|
Tested-by: Halil Pasic <pasic@linux.ibm.com>
|
||
|
Reviewed-by: Halil Pasic <pasic@linux.ibm.com>
|
||
|
Signed-off-by: Jason Wang <jasowang@redhat.com>
|
||
|
Message-Id: <20200302042454.24814-1-jasowang@redhat.com>
|
||
|
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||
|
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||
|
(cherry picked from commit f7ef7e6e3ba6e994e070cc609eb154339d1c4a11)
|
||
|
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||
|
---
|
||
|
hw/virtio/vhost.c | 12 +++++++++++-
|
||
|
1 file changed, 11 insertions(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
|
||
|
index 9edfadc81d..9182a00495 100644
|
||
|
--- a/hw/virtio/vhost.c
|
||
|
+++ b/hw/virtio/vhost.c
|
||
|
@@ -290,7 +290,14 @@ static int vhost_dev_has_iommu(struct vhost_dev *dev)
|
||
|
{
|
||
|
VirtIODevice *vdev = dev->vdev;
|
||
|
|
||
|
- return virtio_host_has_feature(vdev, VIRTIO_F_IOMMU_PLATFORM);
|
||
|
+ /*
|
||
|
+ * For vhost, VIRTIO_F_IOMMU_PLATFORM means the backend support
|
||
|
+ * incremental memory mapping API via IOTLB API. For platform that
|
||
|
+ * does not have IOMMU, there's no need to enable this feature
|
||
|
+ * which may cause unnecessary IOTLB miss/update trnasactions.
|
||
|
+ */
|
||
|
+ return vdev->dma_as != &address_space_memory &&
|
||
|
+ virtio_host_has_feature(vdev, VIRTIO_F_IOMMU_PLATFORM);
|
||
|
}
|
||
|
|
||
|
static void *vhost_memory_map(struct vhost_dev *dev, hwaddr addr,
|
||
|
@@ -765,6 +772,9 @@ static int vhost_dev_set_features(struct vhost_dev *dev,
|
||
|
if (enable_log) {
|
||
|
features |= 0x1ULL << VHOST_F_LOG_ALL;
|
||
|
}
|
||
|
+ if (!vhost_dev_has_iommu(dev)) {
|
||
|
+ features &= ~(0x1ULL << VIRTIO_F_IOMMU_PLATFORM);
|
||
|
+ }
|
||
|
r = dev->vhost_ops->vhost_set_features(dev, features);
|
||
|
if (r < 0) {
|
||
|
VHOST_OPS_DEBUG("vhost_set_features failed");
|
||
|
--
|
||
|
2.27.0
|
||
|
|