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