thebeanogamer / rpms / qemu-kvm

Forked from rpms/qemu-kvm 5 months ago
Clone

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

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