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