Commit 23b0d2f7 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'dma-mapping-6.19-2026-02-06' of...

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
parents fe70b326 c33efdfc
Loading
Loading
Loading
Loading
+19 −6
Original line number Diff line number Diff line
@@ -275,6 +275,8 @@ TRACE_EVENT(dma_free_sgt,
				sizeof(u64), sizeof(u64)))
);

#define DMA_TRACE_MAX_ENTRIES 128

TRACE_EVENT(dma_map_sg,
	TP_PROTO(struct device *dev, struct scatterlist *sgl, int nents,
		 int ents, enum dma_data_direction dir, unsigned long attrs),
@@ -282,9 +284,12 @@ TRACE_EVENT(dma_map_sg,

	TP_STRUCT__entry(
		__string(device, dev_name(dev))
		__dynamic_array(u64, phys_addrs, nents)
		__dynamic_array(u64, dma_addrs, ents)
		__dynamic_array(unsigned int, lengths, ents)
		__field(int, full_nents)
		__field(int, full_ents)
		__field(bool, truncated)
		__dynamic_array(u64, phys_addrs,  min(nents, DMA_TRACE_MAX_ENTRIES))
		__dynamic_array(u64, dma_addrs, min(ents, DMA_TRACE_MAX_ENTRIES))
		__dynamic_array(unsigned int, lengths, min(ents, DMA_TRACE_MAX_ENTRIES))
		__field(enum dma_data_direction, dir)
		__field(unsigned long, attrs)
	),
@@ -292,11 +297,16 @@ TRACE_EVENT(dma_map_sg,
	TP_fast_assign(
		struct scatterlist *sg;
		int i;
		int traced_nents = min_t(int, nents, DMA_TRACE_MAX_ENTRIES);
		int traced_ents = min_t(int, ents, DMA_TRACE_MAX_ENTRIES);

		__assign_str(device);
		for_each_sg(sgl, sg, nents, i)
		__entry->full_nents = nents;
		__entry->full_ents = ents;
		__entry->truncated = (nents > DMA_TRACE_MAX_ENTRIES) || (ents > DMA_TRACE_MAX_ENTRIES);
		for_each_sg(sgl, sg, traced_nents, i)
			((u64 *)__get_dynamic_array(phys_addrs))[i] = sg_phys(sg);
		for_each_sg(sgl, sg, ents, i) {
		for_each_sg(sgl, sg, traced_ents, i) {
			((u64 *)__get_dynamic_array(dma_addrs))[i] =
				sg_dma_address(sg);
			((unsigned int *)__get_dynamic_array(lengths))[i] =
@@ -306,9 +316,12 @@ TRACE_EVENT(dma_map_sg,
		__entry->attrs = attrs;
	),

	TP_printk("%s dir=%s dma_addrs=%s sizes=%s phys_addrs=%s attrs=%s",
	TP_printk("%s dir=%s nents=%d/%d ents=%d/%d%s dma_addrs=%s sizes=%s phys_addrs=%s attrs=%s",
		__get_str(device),
		decode_dma_data_direction(__entry->dir),
		min_t(int, __entry->full_nents, DMA_TRACE_MAX_ENTRIES), __entry->full_nents,
		min_t(int, __entry->full_ents, DMA_TRACE_MAX_ENTRIES), __entry->full_ents,
		__entry->truncated ? " [TRUNCATED]" : "",
		__print_array(__get_dynamic_array(dma_addrs),
			      __get_dynamic_array_len(dma_addrs) /
				sizeof(u64), sizeof(u64)),
+6 −4
Original line number Diff line number Diff line
@@ -257,10 +257,12 @@ void __init dma_contiguous_reserve(phys_addr_t limit)
		pr_debug("%s: reserving %ld MiB for global area\n", __func__,
			 (unsigned long)selected_size / SZ_1M);

		dma_contiguous_reserve_area(selected_size, selected_base,
		ret = dma_contiguous_reserve_area(selected_size, selected_base,
						  selected_limit,
						  &dma_contiguous_default_area,
						  fixed);
		if (ret)
			return;

		ret = dma_heap_cma_register_heap(dma_contiguous_default_area);
		if (ret)