thebeanogamer / rpms / qemu-kvm

Forked from rpms/qemu-kvm 5 months ago
Clone

Blame SOURCES/kvm-memory-Add-IOMMU_NOTIFIER_DEVIOTLB_UNMAP-IOMMUTLBNot.patch

8fced6
From f0fa537af2e1e5f827eeb74dc5b3e12776917a67 Mon Sep 17 00:00:00 2001
8fced6
From: eperezma <eperezma@redhat.com>
8fced6
Date: Tue, 12 Jan 2021 14:36:36 -0500
8fced6
Subject: [PATCH 12/17] memory: Add IOMMU_NOTIFIER_DEVIOTLB_UNMAP
8fced6
 IOMMUTLBNotificationType
8fced6
MIME-Version: 1.0
8fced6
Content-Type: text/plain; charset=UTF-8
8fced6
Content-Transfer-Encoding: 8bit
8fced6
8fced6
RH-Author: eperezma <eperezma@redhat.com>
8fced6
Message-id: <20210112143638.374060-12-eperezma@redhat.com>
8fced6
Patchwork-id: 100604
8fced6
O-Subject: [RHEL-8.4.0 qemu-kvm PATCH v2 11/13] memory: Add IOMMU_NOTIFIER_DEVIOTLB_UNMAP IOMMUTLBNotificationType
8fced6
Bugzilla: 1843852
8fced6
RH-Acked-by: Xiao Wang <jasowang@redhat.com>
8fced6
RH-Acked-by: Peter Xu <peterx@redhat.com>
8fced6
RH-Acked-by: Auger Eric <eric.auger@redhat.com>
8fced6
8fced6
This allows us to differentiate between regular IOMMU map/unmap events
8fced6
and DEVIOTLB unmap. Doing so, notifiers that only need device IOTLB
8fced6
invalidations will not receive regular IOMMU unmappings.
8fced6
8fced6
Adapt intel and vhost to use it.
8fced6
8fced6
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
8fced6
Reviewed-by: Peter Xu <peterx@redhat.com>
8fced6
Reviewed-by: Juan Quintela <quintela@redhat.com>
8fced6
Acked-by: Jason Wang <jasowang@redhat.com>
8fced6
Message-Id: <20201116165506.31315-4-eperezma@redhat.com>
8fced6
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
8fced6
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
8fced6
(cherry picked from commit b68ba1ca57677acf870d5ab10579e6105c1f5338)
8fced6
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
8fced6
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
8fced6
---
8fced6
 hw/i386/intel_iommu.c | 2 +-
8fced6
 hw/virtio/vhost.c     | 2 +-
8fced6
 include/exec/memory.h | 7 ++++++-
8fced6
 3 files changed, 8 insertions(+), 3 deletions(-)
8fced6
8fced6
diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
8fced6
index 9fedbac82de..3640bc2ed15 100644
8fced6
--- a/hw/i386/intel_iommu.c
8fced6
+++ b/hw/i386/intel_iommu.c
8fced6
@@ -2411,7 +2411,7 @@ static bool vtd_process_device_iotlb_desc(IntelIOMMUState *s,
8fced6
         sz = VTD_PAGE_SIZE;
8fced6
     }
8fced6
 
8fced6
-    event.type = IOMMU_NOTIFIER_UNMAP;
8fced6
+    event.type = IOMMU_NOTIFIER_DEVIOTLB_UNMAP;
8fced6
     event.entry.target_as = &vtd_dev_as->as;
8fced6
     event.entry.addr_mask = sz - 1;
8fced6
     event.entry.iova = addr;
8fced6
diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
8fced6
index 9182a00495e..78a5df3b379 100644
8fced6
--- a/hw/virtio/vhost.c
8fced6
+++ b/hw/virtio/vhost.c
8fced6
@@ -704,7 +704,7 @@ static void vhost_iommu_region_add(MemoryListener *listener,
8fced6
     iommu_idx = memory_region_iommu_attrs_to_index(iommu_mr,
8fced6
                                                    MEMTXATTRS_UNSPECIFIED);
8fced6
     iommu_notifier_init(&iommu->n, vhost_iommu_unmap_notify,
8fced6
-                        IOMMU_NOTIFIER_UNMAP,
8fced6
+                        IOMMU_NOTIFIER_DEVIOTLB_UNMAP,
8fced6
                         section->offset_within_region,
8fced6
                         int128_get64(end),
8fced6
                         iommu_idx);
8fced6
diff --git a/include/exec/memory.h b/include/exec/memory.h
8fced6
index 80e36077cdb..403dc0c0572 100644
8fced6
--- a/include/exec/memory.h
8fced6
+++ b/include/exec/memory.h
8fced6
@@ -87,9 +87,14 @@ typedef enum {
8fced6
     IOMMU_NOTIFIER_UNMAP = 0x1,
8fced6
     /* Notify entry changes (newly created entries) */
8fced6
     IOMMU_NOTIFIER_MAP = 0x2,
8fced6
+    /* Notify changes on device IOTLB entries */
8fced6
+    IOMMU_NOTIFIER_DEVIOTLB_UNMAP = 0x04,
8fced6
 } IOMMUNotifierFlag;
8fced6
 
8fced6
-#define IOMMU_NOTIFIER_ALL (IOMMU_NOTIFIER_MAP | IOMMU_NOTIFIER_UNMAP)
8fced6
+#define IOMMU_NOTIFIER_IOTLB_EVENTS (IOMMU_NOTIFIER_MAP | IOMMU_NOTIFIER_UNMAP)
8fced6
+#define IOMMU_NOTIFIER_DEVIOTLB_EVENTS IOMMU_NOTIFIER_DEVIOTLB_UNMAP
8fced6
+#define IOMMU_NOTIFIER_ALL (IOMMU_NOTIFIER_IOTLB_EVENTS | \
8fced6
+                            IOMMU_NOTIFIER_DEVIOTLB_EVENTS)
8fced6
 
8fced6
 struct IOMMUNotifier;
8fced6
 typedef void (*IOMMUNotify)(struct IOMMUNotifier *notifier,
8fced6
-- 
8fced6
2.27.0
8fced6