89 lines
3.5 KiB
Diff
89 lines
3.5 KiB
Diff
|
From 6eb76ae169aaf695a5fb6ef052859828e3ea91bc Mon Sep 17 00:00:00 2001
|
||
|
From: eperezma <eperezma@redhat.com>
|
||
|
Date: Mon, 11 Jan 2021 14:36:13 -0500
|
||
|
Subject: 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: <20210111143615.303645-4-eperezma@redhat.com>
|
||
|
Patchwork-id: 100571
|
||
|
O-Subject: [RHEL-AV-8.4.0 qemu-kvm PATCH 3/5] memory: Add IOMMU_NOTIFIER_DEVIOTLB_UNMAP IOMMUTLBNotificationType
|
||
|
Bugzilla: 1845758
|
||
|
RH-Acked-by: Xiao Wang <jasowang@redhat.com>
|
||
|
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||
|
RH-Acked-by: Peter Xu <peterx@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 56180b1c43..edc3090f91 100644
|
||
|
--- a/hw/i386/intel_iommu.c
|
||
|
+++ b/hw/i386/intel_iommu.c
|
||
|
@@ -2468,7 +2468,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 614ccc2bcb..28c7d78172 100644
|
||
|
--- a/hw/virtio/vhost.c
|
||
|
+++ b/hw/virtio/vhost.c
|
||
|
@@ -718,7 +718,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 e86b5e92da..521d9901d7 100644
|
||
|
--- a/include/exec/memory.h
|
||
|
+++ b/include/exec/memory.h
|
||
|
@@ -97,9 +97,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.18.4
|
||
|
|