mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 03:44:45 +01:00
dma-mapping fixes for Linux 6.19
Two minor fixes for 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)
-----BEGIN PGP SIGNATURE-----
iHUEABYIAB0WIQSrngzkoBtlA8uaaJ+Jp1EFxbsSRAUCaYXTzAAKCRCJp1EFxbsS
REbUAP40hTgNNGjlbV/b6nES4P/SuZ5a8p05+YWF7bTOVf/pMwEA8EHFz5DLsKeS
1bX7/X2wzEYOyJ7v1S+PYxIswn9A5AY=
=2IQo
-----END PGP SIGNATURE-----
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
This commit is contained in:
commit
23b0d2f7c2
2 changed files with 25 additions and 10 deletions
|
|
@ -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)),
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
selected_limit,
|
||||
&dma_contiguous_default_area,
|
||||
fixed);
|
||||
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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue