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