When allocating from pages, the size of the sg segment is unlimited and the default is UINT_MAX. This will cause the DMA stream mapping failed later with a "swiotlb buffer full" error. The default maximum mapping size is 128 slots x 2K = 256K, determined by "IO_TLB_SEGSIZE". To fix the issue, limit the sg segment size according to "dma_max_mapping_size" to match the mapping limit. Signed-off-by: Anle Pan <anle.pan@xxxxxxx> --- drivers/media/common/videobuf2/videobuf2-dma-sg.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/media/common/videobuf2/videobuf2-dma-sg.c b/drivers/media/common/videobuf2/videobuf2-dma-sg.c index fa69158a65b1..b608a7c5f240 100644 --- a/drivers/media/common/videobuf2/videobuf2-dma-sg.c +++ b/drivers/media/common/videobuf2/videobuf2-dma-sg.c @@ -105,6 +105,7 @@ static void *vb2_dma_sg_alloc(struct vb2_buffer *vb, struct device *dev, struct sg_table *sgt; int ret; int num_pages; + size_t max_segment = 0; if (WARN_ON(!dev) || WARN_ON(!size)) return ERR_PTR(-EINVAL); @@ -134,8 +135,12 @@ static void *vb2_dma_sg_alloc(struct vb2_buffer *vb, struct device *dev, if (ret) goto fail_pages_alloc; - ret = sg_alloc_table_from_pages(buf->dma_sgt, buf->pages, - buf->num_pages, 0, size, GFP_KERNEL); + if (dev) + max_segment = dma_max_mapping_size(dev); + if (max_segment == 0) + max_segment = UINT_MAX; + ret = sg_alloc_table_from_pages_segment(buf->dma_sgt, buf->pages, + buf->num_pages, 0, size, max_segment, GFP_KERNEL); if (ret) goto fail_table_alloc; -- 2.25.1