From: Pavel Begunkov Date: Tue, 16 Sep 2025 14:27:52 +0000 (+0100) Subject: io_uring/zcrx: deduplicate area mapping X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=439a98b972fbb1991819b5367f482cd4161ba39c;p=thirdparty%2Fkernel%2Fstable.git io_uring/zcrx: deduplicate area mapping With a common type for storing dma addresses and io_populate_area_dma(), type-specific area mapping helpers are trivial, so open code them and deduplicate the call to io_populate_area_dma(). Signed-off-by: Pavel Begunkov Signed-off-by: Jens Axboe --- diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c index 16bf036c7b24b..bba92774c8016 100644 --- a/io_uring/zcrx.c +++ b/io_uring/zcrx.c @@ -157,14 +157,6 @@ err: return ret; } -static int io_zcrx_map_area_dmabuf(struct io_zcrx_ifq *ifq, struct io_zcrx_area *area) -{ - if (!IS_ENABLED(CONFIG_DMA_SHARED_BUFFER)) - return -EINVAL; - return io_populate_area_dma(ifq, area, area->mem.sgt, - area->mem.dmabuf_offset); -} - static unsigned long io_count_account_pages(struct page **pages, unsigned nr_pages) { struct folio *last_folio = NULL; @@ -275,30 +267,29 @@ static void io_zcrx_unmap_area(struct io_zcrx_ifq *ifq, } } -static unsigned io_zcrx_map_area_umem(struct io_zcrx_ifq *ifq, struct io_zcrx_area *area) -{ - int ret; - - ret = dma_map_sgtable(ifq->dev, &area->mem.page_sg_table, - DMA_FROM_DEVICE, IO_DMA_ATTR); - if (ret < 0) - return ret; - return io_populate_area_dma(ifq, area, &area->mem.page_sg_table, 0); -} - static int io_zcrx_map_area(struct io_zcrx_ifq *ifq, struct io_zcrx_area *area) { + unsigned long offset; + struct sg_table *sgt; int ret; guard(mutex)(&ifq->dma_lock); if (area->is_mapped) return 0; - if (area->mem.is_dmabuf) - ret = io_zcrx_map_area_dmabuf(ifq, area); - else - ret = io_zcrx_map_area_umem(ifq, area); + if (!area->mem.is_dmabuf) { + ret = dma_map_sgtable(ifq->dev, &area->mem.page_sg_table, + DMA_FROM_DEVICE, IO_DMA_ATTR); + if (ret < 0) + return ret; + sgt = &area->mem.page_sg_table; + offset = 0; + } else { + sgt = area->mem.sgt; + offset = area->mem.dmabuf_offset; + } + ret = io_populate_area_dma(ifq, area, sgt, offset); if (ret == 0) area->is_mapped = true; return ret;