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