Blame SOURCES/kvm-intel-iommu-trace-domain-id-during-page-walk.patch

383d26
From 2511801028d31c9a6cee77d8a978d2642b82e0df Mon Sep 17 00:00:00 2001
383d26
From: Peter Xu <peterx@redhat.com>
383d26
Date: Mon, 3 Sep 2018 04:52:39 +0200
383d26
Subject: [PATCH 24/29] intel-iommu: trace domain id during page walk
383d26
383d26
RH-Author: Peter Xu <peterx@redhat.com>
383d26
Message-id: <20180903045241.6456-8-peterx@redhat.com>
383d26
Patchwork-id: 82028
383d26
O-Subject: [RHEL-7.6 qemu-kvm-rhev PATCH 7/9] intel-iommu: trace domain id during page walk
383d26
Bugzilla: 1623859
383d26
RH-Acked-by: Xiao Wang <jasowang@redhat.com>
383d26
RH-Acked-by: Auger Eric <eric.auger@redhat.com>
383d26
RH-Acked-by: Michael S. Tsirkin <mst@redhat.com>
383d26
383d26
This patch only modifies the trace points.
383d26
383d26
Previously we were tracing page walk levels.  They are redundant since
383d26
we have page mask (size) already.  Now we trace something much more
383d26
useful which is the domain ID of the page walking.  That can be very
383d26
useful when we trace more than one devices on the same system, so that
383d26
we can know which map is for which domain.
383d26
383d26
CC: QEMU Stable <qemu-stable@nongnu.org>
383d26
Signed-off-by: Peter Xu <peterx@redhat.com>
383d26
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
383d26
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
383d26
(cherry picked from commit d118c06ebbee2d23ddf873cae4a809311aa61310)
383d26
Signed-off-by: Peter Xu <peterx@redhat.com>
383d26
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
383d26
---
383d26
 hw/i386/intel_iommu.c | 16 ++++++++++------
383d26
 hw/i386/trace-events  |  2 +-
383d26
 2 files changed, 11 insertions(+), 7 deletions(-)
383d26
383d26
diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
383d26
index a882894..61bb3d3 100644
383d26
--- a/hw/i386/intel_iommu.c
383d26
+++ b/hw/i386/intel_iommu.c
383d26
@@ -756,6 +756,7 @@ typedef int (*vtd_page_walk_hook)(IOMMUTLBEntry *entry, void *private);
383d26
  * @notify_unmap: whether we should notify invalid entries
383d26
  * @as: VT-d address space of the device
383d26
  * @aw: maximum address width
383d26
+ * @domain: domain ID of the page walk
383d26
  */
383d26
 typedef struct {
383d26
     VTDAddressSpace *as;
383d26
@@ -763,17 +764,18 @@ typedef struct {
383d26
     void *private;
383d26
     bool notify_unmap;
383d26
     uint8_t aw;
383d26
+    uint16_t domain_id;
383d26
 } vtd_page_walk_info;
383d26
 
383d26
-static int vtd_page_walk_one(IOMMUTLBEntry *entry, int level,
383d26
-                             vtd_page_walk_info *info)
383d26
+static int vtd_page_walk_one(IOMMUTLBEntry *entry, vtd_page_walk_info *info)
383d26
 {
383d26
     vtd_page_walk_hook hook_fn = info->hook_fn;
383d26
     void *private = info->private;
383d26
 
383d26
     assert(hook_fn);
383d26
-    trace_vtd_page_walk_one(level, entry->iova, entry->translated_addr,
383d26
-                            entry->addr_mask, entry->perm);
383d26
+    trace_vtd_page_walk_one(info->domain_id, entry->iova,
383d26
+                            entry->translated_addr, entry->addr_mask,
383d26
+                            entry->perm);
383d26
     return hook_fn(entry, private);
383d26
 }
383d26
 
383d26
@@ -844,7 +846,7 @@ static int vtd_page_walk_level(dma_addr_t addr, uint64_t start,
383d26
                 trace_vtd_page_walk_skip_perm(iova, iova_next);
383d26
                 goto next;
383d26
             }
383d26
-            ret = vtd_page_walk_one(&entry, level, info);
383d26
+            ret = vtd_page_walk_one(&entry, info);
383d26
             if (ret < 0) {
383d26
                 return ret;
383d26
             }
383d26
@@ -856,7 +858,7 @@ static int vtd_page_walk_level(dma_addr_t addr, uint64_t start,
383d26
                      * Translated address is meaningless, zero it.
383d26
                      */
383d26
                     entry.translated_addr = 0x0;
383d26
-                    ret = vtd_page_walk_one(&entry, level, info);
383d26
+                    ret = vtd_page_walk_one(&entry, info);
383d26
                     if (ret < 0) {
383d26
                         return ret;
383d26
                     }
383d26
@@ -1466,6 +1468,7 @@ static void vtd_iotlb_page_invalidate_notify(IntelIOMMUState *s,
383d26
                     .notify_unmap = true,
383d26
                     .aw = s->aw_bits,
383d26
                     .as = vtd_as,
383d26
+                    .domain_id = domain_id,
383d26
                 };
383d26
 
383d26
                 /*
383d26
@@ -2947,6 +2950,7 @@ static void vtd_iommu_replay(IOMMUMemoryRegion *iommu_mr, IOMMUNotifier *n)
383d26
                 .notify_unmap = false,
383d26
                 .aw = s->aw_bits,
383d26
                 .as = vtd_as,
383d26
+                .domain_id = VTD_CONTEXT_ENTRY_DID(ce.hi),
383d26
             };
383d26
 
383d26
             vtd_page_walk(&ce, 0, ~0ULL, &info;;
383d26
diff --git a/hw/i386/trace-events b/hw/i386/trace-events
383d26
index 22d4464..ca23ba9 100644
383d26
--- a/hw/i386/trace-events
383d26
+++ b/hw/i386/trace-events
383d26
@@ -39,7 +39,7 @@ vtd_fault_disabled(void) "Fault processing disabled for context entry"
383d26
 vtd_replay_ce_valid(uint8_t bus, uint8_t dev, uint8_t fn, uint16_t domain, uint64_t hi, uint64_t lo) "replay valid context device %02"PRIx8":%02"PRIx8".%02"PRIx8" domain 0x%"PRIx16" hi 0x%"PRIx64" lo 0x%"PRIx64
383d26
 vtd_replay_ce_invalid(uint8_t bus, uint8_t dev, uint8_t fn) "replay invalid context device %02"PRIx8":%02"PRIx8".%02"PRIx8
383d26
 vtd_page_walk_level(uint64_t addr, uint32_t level, uint64_t start, uint64_t end) "walk (base=0x%"PRIx64", level=%"PRIu32") iova range 0x%"PRIx64" - 0x%"PRIx64
383d26
-vtd_page_walk_one(uint32_t level, uint64_t iova, uint64_t gpa, uint64_t mask, int perm) "detected page level 0x%"PRIx32" iova 0x%"PRIx64" -> gpa 0x%"PRIx64" mask 0x%"PRIx64" perm %d"
383d26
+vtd_page_walk_one(uint16_t domain, uint64_t iova, uint64_t gpa, uint64_t mask, int perm) "domain 0x%"PRIu16" iova 0x%"PRIx64" -> gpa 0x%"PRIx64" mask 0x%"PRIx64" perm %d"
383d26
 vtd_page_walk_skip_read(uint64_t iova, uint64_t next) "Page walk skip iova 0x%"PRIx64" - 0x%"PRIx64" due to unable to read"
383d26
 vtd_page_walk_skip_perm(uint64_t iova, uint64_t next) "Page walk skip iova 0x%"PRIx64" - 0x%"PRIx64" due to perm empty"
383d26
 vtd_page_walk_skip_reserve(uint64_t iova, uint64_t next) "Page walk skip iova 0x%"PRIx64" - 0x%"PRIx64" due to rsrv set"
383d26
-- 
383d26
1.8.3.1
383d26