dma-mapping: trace dma_alloc/free direction
authorSean Anderson <sean.anderson@linux.dev>
Fri, 18 Oct 2024 15:00:35 +0000 (11:00 -0400)
committerChristoph Hellwig <hch@lst.de>
Tue, 29 Oct 2024 07:54:00 +0000 (08:54 +0100)
In preparation for using these tracepoints in a few more places, trace
the DMA direction as well. For coherent allocations this is always
bidirectional.

Signed-off-by: Sean Anderson <sean.anderson@linux.dev>
Reviewed-by: Steven Rostedt (Google) <rostedt@goodmis.org>
Signed-off-by: Christoph Hellwig <hch@lst.de>
include/trace/events/dma.h
kernel/dma/mapping.c

index 3d348ce..267cfa4 100644 (file)
@@ -114,8 +114,9 @@ DEFINE_UNMAP_EVENT(dma_unmap_resource);
 
 TRACE_EVENT(dma_alloc,
        TP_PROTO(struct device *dev, void *virt_addr, dma_addr_t dma_addr,
-                size_t size, gfp_t flags, unsigned long attrs),
-       TP_ARGS(dev, virt_addr, dma_addr, size, flags, attrs),
+                size_t size, enum dma_data_direction dir, gfp_t flags,
+                unsigned long attrs),
+       TP_ARGS(dev, virt_addr, dma_addr, size, dir, flags, attrs),
 
        TP_STRUCT__entry(
                __string(device, dev_name(dev))
@@ -123,6 +124,7 @@ TRACE_EVENT(dma_alloc,
                __field(u64, dma_addr)
                __field(size_t, size)
                __field(gfp_t, flags)
+               __field(enum dma_data_direction, dir)
                __field(unsigned long, attrs)
        ),
 
@@ -135,8 +137,9 @@ TRACE_EVENT(dma_alloc,
                __entry->attrs = attrs;
        ),
 
-       TP_printk("%s dma_addr=%llx size=%zu virt_addr=%p flags=%s attrs=%s",
+       TP_printk("%s dir=%s dma_addr=%llx size=%zu virt_addr=%p flags=%s attrs=%s",
                __get_str(device),
+               decode_dma_data_direction(__entry->dir),
                __entry->dma_addr,
                __entry->size,
                __entry->virt_addr,
@@ -146,14 +149,15 @@ TRACE_EVENT(dma_alloc,
 
 TRACE_EVENT(dma_free,
        TP_PROTO(struct device *dev, void *virt_addr, dma_addr_t dma_addr,
-                size_t size, unsigned long attrs),
-       TP_ARGS(dev, virt_addr, dma_addr, size, attrs),
+                size_t size, enum dma_data_direction dir, unsigned long attrs),
+       TP_ARGS(dev, virt_addr, dma_addr, size, dir, attrs),
 
        TP_STRUCT__entry(
                __string(device, dev_name(dev))
                __field(void *, virt_addr)
                __field(u64, dma_addr)
                __field(size_t, size)
+               __field(enum dma_data_direction, dir)
                __field(unsigned long, attrs)
        ),
 
@@ -162,11 +166,13 @@ TRACE_EVENT(dma_free,
                __entry->virt_addr = virt_addr;
                __entry->dma_addr = dma_addr;
                __entry->size = size;
+               __entry->dir = dir;
                __entry->attrs = attrs;
        ),
 
-       TP_printk("%s dma_addr=%llx size=%zu virt_addr=%p attrs=%s",
+       TP_printk("%s dir=%s dma_addr=%llx size=%zu virt_addr=%p attrs=%s",
                __get_str(device),
+               decode_dma_data_direction(__entry->dir),
                __entry->dma_addr,
                __entry->size,
                __entry->virt_addr,
index 864a112..944ac83 100644 (file)
@@ -619,7 +619,8 @@ void *dma_alloc_attrs(struct device *dev, size_t size, dma_addr_t *dma_handle,
        else
                return NULL;
 
-       trace_dma_alloc(dev, cpu_addr, *dma_handle, size, flag, attrs);
+       trace_dma_alloc(dev, cpu_addr, *dma_handle, size, DMA_BIDIRECTIONAL,
+                       flag, attrs);
        debug_dma_alloc_coherent(dev, size, *dma_handle, cpu_addr, attrs);
        return cpu_addr;
 }
@@ -644,7 +645,8 @@ void dma_free_attrs(struct device *dev, size_t size, void *cpu_addr,
        if (!cpu_addr)
                return;
 
-       trace_dma_free(dev, cpu_addr, dma_handle, size, attrs);
+       trace_dma_free(dev, cpu_addr, dma_handle, size, DMA_BIDIRECTIONAL,
+                      attrs);
        debug_dma_free_coherent(dev, size, cpu_addr, dma_handle);
        if (dma_alloc_direct(dev, ops))
                dma_direct_free(dev, size, cpu_addr, dma_handle, attrs);