Blame SOURCES/kvm-vhost-correctly-turn-on-VIRTIO_F_IOMMU_PLATFORM.patch

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