Skip to content

Commit 23b0d2f

Browse files
committed
Merge tag 'dma-mapping-6.19-2026-02-06' of git://git.kernel.org/pub/scm/linux/kernel/git/mszyprowski/linux
Pull dma-mapping fixes from Marek Szyprowski: "Two minor fixes for the DMA-mapping subsystem: - check for the rare case of the allocation failure of the global CMA pool (Shanker Donthineni) - avoid perf buffer overflow when tracing large scatter-gather lists (Deepanshu Kartikey)" * tag 'dma-mapping-6.19-2026-02-06' of git://git.kernel.org/pub/scm/linux/kernel/git/mszyprowski/linux: dma: contiguous: Check return value of dma_contiguous_reserve_area() tracing/dma: Cap dma_map_sg tracepoint arrays to prevent buffer overflow
2 parents fe70b32 + c33efdf commit 23b0d2f

2 files changed

Lines changed: 25 additions & 10 deletions

File tree

include/trace/events/dma.h

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -275,28 +275,38 @@ TRACE_EVENT(dma_free_sgt,
275275
sizeof(u64), sizeof(u64)))
276276
);
277277

278+
#define DMA_TRACE_MAX_ENTRIES 128
279+
278280
TRACE_EVENT(dma_map_sg,
279281
TP_PROTO(struct device *dev, struct scatterlist *sgl, int nents,
280282
int ents, enum dma_data_direction dir, unsigned long attrs),
281283
TP_ARGS(dev, sgl, nents, ents, dir, attrs),
282284

283285
TP_STRUCT__entry(
284286
__string(device, dev_name(dev))
285-
__dynamic_array(u64, phys_addrs, nents)
286-
__dynamic_array(u64, dma_addrs, ents)
287-
__dynamic_array(unsigned int, lengths, ents)
287+
__field(int, full_nents)
288+
__field(int, full_ents)
289+
__field(bool, truncated)
290+
__dynamic_array(u64, phys_addrs, min(nents, DMA_TRACE_MAX_ENTRIES))
291+
__dynamic_array(u64, dma_addrs, min(ents, DMA_TRACE_MAX_ENTRIES))
292+
__dynamic_array(unsigned int, lengths, min(ents, DMA_TRACE_MAX_ENTRIES))
288293
__field(enum dma_data_direction, dir)
289294
__field(unsigned long, attrs)
290295
),
291296

292297
TP_fast_assign(
293298
struct scatterlist *sg;
294299
int i;
300+
int traced_nents = min_t(int, nents, DMA_TRACE_MAX_ENTRIES);
301+
int traced_ents = min_t(int, ents, DMA_TRACE_MAX_ENTRIES);
295302

296303
__assign_str(device);
297-
for_each_sg(sgl, sg, nents, i)
304+
__entry->full_nents = nents;
305+
__entry->full_ents = ents;
306+
__entry->truncated = (nents > DMA_TRACE_MAX_ENTRIES) || (ents > DMA_TRACE_MAX_ENTRIES);
307+
for_each_sg(sgl, sg, traced_nents, i)
298308
((u64 *)__get_dynamic_array(phys_addrs))[i] = sg_phys(sg);
299-
for_each_sg(sgl, sg, ents, i) {
309+
for_each_sg(sgl, sg, traced_ents, i) {
300310
((u64 *)__get_dynamic_array(dma_addrs))[i] =
301311
sg_dma_address(sg);
302312
((unsigned int *)__get_dynamic_array(lengths))[i] =
@@ -306,9 +316,12 @@ TRACE_EVENT(dma_map_sg,
306316
__entry->attrs = attrs;
307317
),
308318

309-
TP_printk("%s dir=%s dma_addrs=%s sizes=%s phys_addrs=%s attrs=%s",
319+
TP_printk("%s dir=%s nents=%d/%d ents=%d/%d%s dma_addrs=%s sizes=%s phys_addrs=%s attrs=%s",
310320
__get_str(device),
311321
decode_dma_data_direction(__entry->dir),
322+
min_t(int, __entry->full_nents, DMA_TRACE_MAX_ENTRIES), __entry->full_nents,
323+
min_t(int, __entry->full_ents, DMA_TRACE_MAX_ENTRIES), __entry->full_ents,
324+
__entry->truncated ? " [TRUNCATED]" : "",
312325
__print_array(__get_dynamic_array(dma_addrs),
313326
__get_dynamic_array_len(dma_addrs) /
314327
sizeof(u64), sizeof(u64)),

kernel/dma/contiguous.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -257,10 +257,12 @@ void __init dma_contiguous_reserve(phys_addr_t limit)
257257
pr_debug("%s: reserving %ld MiB for global area\n", __func__,
258258
(unsigned long)selected_size / SZ_1M);
259259

260-
dma_contiguous_reserve_area(selected_size, selected_base,
261-
selected_limit,
262-
&dma_contiguous_default_area,
263-
fixed);
260+
ret = dma_contiguous_reserve_area(selected_size, selected_base,
261+
selected_limit,
262+
&dma_contiguous_default_area,
263+
fixed);
264+
if (ret)
265+
return;
264266

265267
ret = dma_heap_cma_register_heap(dma_contiguous_default_area);
266268
if (ret)

0 commit comments

Comments
 (0)