|
|
76daa3 |
From e7b7a1c3047a40085acd97756d12750b06c2d8ad Mon Sep 17 00:00:00 2001
|
|
|
76daa3 |
From: Peter Xu <peterx@redhat.com>
|
|
|
76daa3 |
Date: Mon, 24 Apr 2017 02:52:49 +0200
|
|
|
76daa3 |
Subject: [PATCH 10/23] memory: add MemoryRegionIOMMUOps.replay() callback
|
|
|
76daa3 |
|
|
|
76daa3 |
RH-Author: Peter Xu <peterx@redhat.com>
|
|
|
76daa3 |
Message-id: <1493002373-13010-6-git-send-email-peterx@redhat.com>
|
|
|
76daa3 |
Patchwork-id: 74853
|
|
|
76daa3 |
O-Subject: [RHEL7.4 qemu-kvm-rhev PATCH v2 5/9] memory: add MemoryRegionIOMMUOps.replay() callback
|
|
|
76daa3 |
Bugzilla: 1335808
|
|
|
76daa3 |
RH-Acked-by: Marcel Apfelbaum <marcel@redhat.com>
|
|
|
76daa3 |
RH-Acked-by: Michael S. Tsirkin <mst@redhat.com>
|
|
|
76daa3 |
RH-Acked-by: Xiao Wang <jasowang@redhat.com>
|
|
|
76daa3 |
|
|
|
76daa3 |
Originally we have one memory_region_iommu_replay() function, which is
|
|
|
76daa3 |
the default behavior to replay the translations of the whole IOMMU
|
|
|
76daa3 |
region. However, on some platform like x86, we may want our own replay
|
|
|
76daa3 |
logic for IOMMU regions. This patch adds one more hook for IOMMUOps for
|
|
|
76daa3 |
the callback, and it'll override the default if set.
|
|
|
76daa3 |
|
|
|
76daa3 |
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
|
|
|
76daa3 |
Reviewed-by: Eric Auger <eric.auger@redhat.com>
|
|
|
76daa3 |
Reviewed-by: \"Michael S. Tsirkin\" <mst@redhat.com>
|
|
|
76daa3 |
Signed-off-by: Peter Xu <peterx@redhat.com>
|
|
|
76daa3 |
Message-Id: <1491562755-23867-6-git-send-email-peterx@redhat.com>
|
|
|
76daa3 |
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
|
|
|
76daa3 |
(cherry picked from commit faa362e3cc94bf739a89b457693e3fbd7a4b95c4)
|
|
|
76daa3 |
Signed-off-by: Peter Xu <peterx@redhat.com>
|
|
|
76daa3 |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
76daa3 |
---
|
|
|
76daa3 |
include/exec/memory.h | 2 ++
|
|
|
76daa3 |
memory.c | 6 ++++++
|
|
|
76daa3 |
2 files changed, 8 insertions(+)
|
|
|
76daa3 |
|
|
|
76daa3 |
diff --git a/include/exec/memory.h b/include/exec/memory.h
|
|
|
76daa3 |
index 055b3a8..c0280b7 100644
|
|
|
76daa3 |
--- a/include/exec/memory.h
|
|
|
76daa3 |
+++ b/include/exec/memory.h
|
|
|
76daa3 |
@@ -191,6 +191,8 @@ struct MemoryRegionIOMMUOps {
|
|
|
76daa3 |
void (*notify_flag_changed)(MemoryRegion *iommu,
|
|
|
76daa3 |
IOMMUNotifierFlag old_flags,
|
|
|
76daa3 |
IOMMUNotifierFlag new_flags);
|
|
|
76daa3 |
+ /* Set this up to provide customized IOMMU replay function */
|
|
|
76daa3 |
+ void (*replay)(MemoryRegion *iommu, IOMMUNotifier *notifier);
|
|
|
76daa3 |
};
|
|
|
76daa3 |
|
|
|
76daa3 |
typedef struct CoalescedMemoryRange CoalescedMemoryRange;
|
|
|
76daa3 |
diff --git a/memory.c b/memory.c
|
|
|
76daa3 |
index ded4bf1..b782d5b 100644
|
|
|
76daa3 |
--- a/memory.c
|
|
|
76daa3 |
+++ b/memory.c
|
|
|
76daa3 |
@@ -1626,6 +1626,12 @@ void memory_region_iommu_replay(MemoryRegion *mr, IOMMUNotifier *n,
|
|
|
76daa3 |
hwaddr addr, granularity;
|
|
|
76daa3 |
IOMMUTLBEntry iotlb;
|
|
|
76daa3 |
|
|
|
76daa3 |
+ /* If the IOMMU has its own replay callback, override */
|
|
|
76daa3 |
+ if (mr->iommu_ops->replay) {
|
|
|
76daa3 |
+ mr->iommu_ops->replay(mr, n);
|
|
|
76daa3 |
+ return;
|
|
|
76daa3 |
+ }
|
|
|
76daa3 |
+
|
|
|
76daa3 |
granularity = memory_region_iommu_get_min_page_size(mr);
|
|
|
76daa3 |
|
|
|
76daa3 |
for (addr = 0; addr < memory_region_size(mr); addr += granularity) {
|
|
|
76daa3 |
--
|
|
|
76daa3 |
1.8.3.1
|
|
|
76daa3 |
|