Skip to content

Commit 3b53034

Browse files
LuBaolujoergroedel
authored andcommitted
iommu/vt-d: Add trace events for device dma map/unmap
This adds trace support for the Intel IOMMU driver. It also declares some events which could be used to trace the events when an IOVA is being mapped or unmapped in a domain. Cc: Ashok Raj <[email protected]> Cc: Jacob Pan <[email protected]> Cc: Kevin Tian <[email protected]> Signed-off-by: Mika Westerberg <[email protected]> Signed-off-by: Lu Baolu <[email protected]> Reviewed-by: Steven Rostedt (VMware) <[email protected]> Signed-off-by: Joerg Roedel <[email protected]>
1 parent c5a5dc4 commit 3b53034

File tree

4 files changed

+131
-3
lines changed

4 files changed

+131
-3
lines changed

drivers/iommu/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ obj-$(CONFIG_ARM_SMMU) += arm-smmu.o
1717
obj-$(CONFIG_ARM_SMMU_V3) += arm-smmu-v3.o
1818
obj-$(CONFIG_DMAR_TABLE) += dmar.o
1919
obj-$(CONFIG_INTEL_IOMMU) += intel-iommu.o intel-pasid.o
20+
obj-$(CONFIG_INTEL_IOMMU) += intel-trace.o
2021
obj-$(CONFIG_INTEL_IOMMU_DEBUGFS) += intel-iommu-debugfs.o
2122
obj-$(CONFIG_INTEL_IOMMU_SVM) += intel-svm.o
2223
obj-$(CONFIG_IPMMU_VMSA) += ipmmu-vmsa.o

drivers/iommu/intel-iommu.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3512,6 +3512,9 @@ static dma_addr_t __intel_map_single(struct device *dev, phys_addr_t paddr,
35123512

35133513
start_paddr = (phys_addr_t)iova_pfn << PAGE_SHIFT;
35143514
start_paddr += paddr & ~PAGE_MASK;
3515+
3516+
trace_map_single(dev, start_paddr, paddr, size << VTD_PAGE_SHIFT);
3517+
35153518
return start_paddr;
35163519

35173520
error:
@@ -3567,10 +3570,7 @@ static void intel_unmap(struct device *dev, dma_addr_t dev_addr, size_t size)
35673570
if (dev_is_pci(dev))
35683571
pdev = to_pci_dev(dev);
35693572

3570-
dev_dbg(dev, "Device unmapping: pfn %lx-%lx\n", start_pfn, last_pfn);
3571-
35723573
freelist = domain_unmap(domain, start_pfn, last_pfn);
3573-
35743574
if (intel_iommu_strict || (pdev && pdev->untrusted) ||
35753575
!has_iova_flush_queue(&domain->iovad)) {
35763576
iommu_flush_iotlb_psi(iommu, domain, start_pfn,
@@ -3586,6 +3586,8 @@ static void intel_unmap(struct device *dev, dma_addr_t dev_addr, size_t size)
35863586
* cpu used up by the iotlb flush operation...
35873587
*/
35883588
}
3589+
3590+
trace_unmap_single(dev, dev_addr, size);
35893591
}
35903592

35913593
static void intel_unmap_page(struct device *dev, dma_addr_t dev_addr,
@@ -3676,6 +3678,8 @@ static void intel_unmap_sg(struct device *dev, struct scatterlist *sglist,
36763678
}
36773679

36783680
intel_unmap(dev, startaddr, nrpages << VTD_PAGE_SHIFT);
3681+
3682+
trace_unmap_sg(dev, startaddr, nrpages << VTD_PAGE_SHIFT);
36793683
}
36803684

36813685
static int intel_map_sg(struct device *dev, struct scatterlist *sglist, int nelems,
@@ -3732,6 +3736,9 @@ static int intel_map_sg(struct device *dev, struct scatterlist *sglist, int nele
37323736
return 0;
37333737
}
37343738

3739+
trace_map_sg(dev, iova_pfn << PAGE_SHIFT,
3740+
sg_phys(sglist), size << VTD_PAGE_SHIFT);
3741+
37353742
return nelems;
37363743
}
37373744

drivers/iommu/intel-trace.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
/*
3+
* Intel IOMMU trace support
4+
*
5+
* Copyright (C) 2019 Intel Corporation
6+
*
7+
* Author: Lu Baolu <[email protected]>
8+
*/
9+
10+
#include <linux/string.h>
11+
#include <linux/types.h>
12+
13+
#define CREATE_TRACE_POINTS
14+
#include <trace/events/intel_iommu.h>

include/trace/events/intel_iommu.h

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
/* SPDX-License-Identifier: GPL-2.0 */
2+
/*
3+
* Intel IOMMU trace support
4+
*
5+
* Copyright (C) 2019 Intel Corporation
6+
*
7+
* Author: Lu Baolu <[email protected]>
8+
*/
9+
#ifdef CONFIG_INTEL_IOMMU
10+
#undef TRACE_SYSTEM
11+
#define TRACE_SYSTEM intel_iommu
12+
13+
#if !defined(_TRACE_INTEL_IOMMU_H) || defined(TRACE_HEADER_MULTI_READ)
14+
#define _TRACE_INTEL_IOMMU_H
15+
16+
#include <linux/tracepoint.h>
17+
#include <linux/intel-iommu.h>
18+
19+
DECLARE_EVENT_CLASS(dma_map,
20+
TP_PROTO(struct device *dev, dma_addr_t dev_addr, phys_addr_t phys_addr,
21+
size_t size),
22+
23+
TP_ARGS(dev, dev_addr, phys_addr, size),
24+
25+
TP_STRUCT__entry(
26+
__string(dev_name, dev_name(dev))
27+
__field(dma_addr_t, dev_addr)
28+
__field(phys_addr_t, phys_addr)
29+
__field(size_t, size)
30+
),
31+
32+
TP_fast_assign(
33+
__assign_str(dev_name, dev_name(dev));
34+
__entry->dev_addr = dev_addr;
35+
__entry->phys_addr = phys_addr;
36+
__entry->size = size;
37+
),
38+
39+
TP_printk("dev=%s dev_addr=0x%llx phys_addr=0x%llx size=%zu",
40+
__get_str(dev_name),
41+
(unsigned long long)__entry->dev_addr,
42+
(unsigned long long)__entry->phys_addr,
43+
__entry->size)
44+
);
45+
46+
DEFINE_EVENT(dma_map, map_single,
47+
TP_PROTO(struct device *dev, dma_addr_t dev_addr, phys_addr_t phys_addr,
48+
size_t size),
49+
TP_ARGS(dev, dev_addr, phys_addr, size)
50+
);
51+
52+
DEFINE_EVENT(dma_map, map_sg,
53+
TP_PROTO(struct device *dev, dma_addr_t dev_addr, phys_addr_t phys_addr,
54+
size_t size),
55+
TP_ARGS(dev, dev_addr, phys_addr, size)
56+
);
57+
58+
DEFINE_EVENT(dma_map, bounce_map_single,
59+
TP_PROTO(struct device *dev, dma_addr_t dev_addr, phys_addr_t phys_addr,
60+
size_t size),
61+
TP_ARGS(dev, dev_addr, phys_addr, size)
62+
);
63+
64+
DECLARE_EVENT_CLASS(dma_unmap,
65+
TP_PROTO(struct device *dev, dma_addr_t dev_addr, size_t size),
66+
67+
TP_ARGS(dev, dev_addr, size),
68+
69+
TP_STRUCT__entry(
70+
__string(dev_name, dev_name(dev))
71+
__field(dma_addr_t, dev_addr)
72+
__field(size_t, size)
73+
),
74+
75+
TP_fast_assign(
76+
__assign_str(dev_name, dev_name(dev));
77+
__entry->dev_addr = dev_addr;
78+
__entry->size = size;
79+
),
80+
81+
TP_printk("dev=%s dev_addr=0x%llx size=%zu",
82+
__get_str(dev_name),
83+
(unsigned long long)__entry->dev_addr,
84+
__entry->size)
85+
);
86+
87+
DEFINE_EVENT(dma_unmap, unmap_single,
88+
TP_PROTO(struct device *dev, dma_addr_t dev_addr, size_t size),
89+
TP_ARGS(dev, dev_addr, size)
90+
);
91+
92+
DEFINE_EVENT(dma_unmap, unmap_sg,
93+
TP_PROTO(struct device *dev, dma_addr_t dev_addr, size_t size),
94+
TP_ARGS(dev, dev_addr, size)
95+
);
96+
97+
DEFINE_EVENT(dma_unmap, bounce_unmap_single,
98+
TP_PROTO(struct device *dev, dma_addr_t dev_addr, size_t size),
99+
TP_ARGS(dev, dev_addr, size)
100+
);
101+
102+
#endif /* _TRACE_INTEL_IOMMU_H */
103+
104+
/* This part must be outside protection */
105+
#include <trace/define_trace.h>
106+
#endif /* CONFIG_INTEL_IOMMU */

0 commit comments

Comments
 (0)