dma-mapping: trace dma_alloc/free direction

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>
This commit is contained in:
Sean Anderson 2024-10-18 11:00:35 -04:00 committed by Christoph Hellwig
parent 5af5fc895f
commit 3afff779a7
2 changed files with 16 additions and 8 deletions

View file

@ -114,8 +114,9 @@ DEFINE_UNMAP_EVENT(dma_unmap_resource);
TRACE_EVENT(dma_alloc, TRACE_EVENT(dma_alloc,
TP_PROTO(struct device *dev, void *virt_addr, dma_addr_t dma_addr, TP_PROTO(struct device *dev, void *virt_addr, dma_addr_t dma_addr,
size_t size, gfp_t flags, unsigned long attrs), size_t size, enum dma_data_direction dir, gfp_t flags,
TP_ARGS(dev, virt_addr, dma_addr, size, flags, attrs), unsigned long attrs),
TP_ARGS(dev, virt_addr, dma_addr, size, dir, flags, attrs),
TP_STRUCT__entry( TP_STRUCT__entry(
__string(device, dev_name(dev)) __string(device, dev_name(dev))
@ -123,6 +124,7 @@ TRACE_EVENT(dma_alloc,
__field(u64, dma_addr) __field(u64, dma_addr)
__field(size_t, size) __field(size_t, size)
__field(gfp_t, flags) __field(gfp_t, flags)
__field(enum dma_data_direction, dir)
__field(unsigned long, attrs) __field(unsigned long, attrs)
), ),
@ -135,8 +137,9 @@ TRACE_EVENT(dma_alloc,
__entry->attrs = attrs; __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), __get_str(device),
decode_dma_data_direction(__entry->dir),
__entry->dma_addr, __entry->dma_addr,
__entry->size, __entry->size,
__entry->virt_addr, __entry->virt_addr,
@ -146,14 +149,15 @@ TRACE_EVENT(dma_alloc,
TRACE_EVENT(dma_free, TRACE_EVENT(dma_free,
TP_PROTO(struct device *dev, void *virt_addr, dma_addr_t dma_addr, TP_PROTO(struct device *dev, void *virt_addr, dma_addr_t dma_addr,
size_t size, unsigned long attrs), size_t size, enum dma_data_direction dir, unsigned long attrs),
TP_ARGS(dev, virt_addr, dma_addr, size, attrs), TP_ARGS(dev, virt_addr, dma_addr, size, dir, attrs),
TP_STRUCT__entry( TP_STRUCT__entry(
__string(device, dev_name(dev)) __string(device, dev_name(dev))
__field(void *, virt_addr) __field(void *, virt_addr)
__field(u64, dma_addr) __field(u64, dma_addr)
__field(size_t, size) __field(size_t, size)
__field(enum dma_data_direction, dir)
__field(unsigned long, attrs) __field(unsigned long, attrs)
), ),
@ -162,11 +166,13 @@ TRACE_EVENT(dma_free,
__entry->virt_addr = virt_addr; __entry->virt_addr = virt_addr;
__entry->dma_addr = dma_addr; __entry->dma_addr = dma_addr;
__entry->size = size; __entry->size = size;
__entry->dir = dir;
__entry->attrs = attrs; __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), __get_str(device),
decode_dma_data_direction(__entry->dir),
__entry->dma_addr, __entry->dma_addr,
__entry->size, __entry->size,
__entry->virt_addr, __entry->virt_addr,

View file

@ -619,7 +619,8 @@ void *dma_alloc_attrs(struct device *dev, size_t size, dma_addr_t *dma_handle,
else else
return NULL; 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); debug_dma_alloc_coherent(dev, size, *dma_handle, cpu_addr, attrs);
return cpu_addr; return cpu_addr;
} }
@ -644,7 +645,8 @@ void dma_free_attrs(struct device *dev, size_t size, void *cpu_addr,
if (!cpu_addr) if (!cpu_addr)
return; 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); debug_dma_free_coherent(dev, size, cpu_addr, dma_handle);
if (dma_alloc_direct(dev, ops)) if (dma_alloc_direct(dev, ops))
dma_direct_free(dev, size, cpu_addr, dma_handle, attrs); dma_direct_free(dev, size, cpu_addr, dma_handle, attrs);