diff options
-rw-r--r-- | io_uring/zcrx.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c index e94a4647d409..6fb7c9bedfcb 100644 --- a/io_uring/zcrx.c +++ b/io_uring/zcrx.c @@ -141,13 +141,13 @@ static int io_zcrx_map_area_dmabuf(struct io_zcrx_ifq *ifq, struct io_zcrx_area struct net_iov *niov = &area->nia.niovs[niov_idx]; if (net_mp_niov_set_dma_addr(niov, dma)) - return 0; + return -EFAULT; sg_len -= PAGE_SIZE; dma += PAGE_SIZE; niov_idx++; } } - return niov_idx; + return 0; } static int io_import_umem(struct io_zcrx_ifq *ifq, @@ -256,29 +256,30 @@ static int io_zcrx_map_area_umem(struct io_zcrx_ifq *ifq, struct io_zcrx_area *a break; } } - return i; + + if (i != area->nia.num_niovs) { + __io_zcrx_unmap_area(ifq, area, i); + return -EINVAL; + } + return 0; } static int io_zcrx_map_area(struct io_zcrx_ifq *ifq, struct io_zcrx_area *area) { - unsigned nr; + int ret; guard(mutex)(&ifq->dma_lock); if (area->is_mapped) return 0; if (area->mem.is_dmabuf) - nr = io_zcrx_map_area_dmabuf(ifq, area); + ret = io_zcrx_map_area_dmabuf(ifq, area); else - nr = io_zcrx_map_area_umem(ifq, area); + ret = io_zcrx_map_area_umem(ifq, area); - if (nr != area->nia.num_niovs) { - __io_zcrx_unmap_area(ifq, area, nr); - return -EINVAL; - } - - area->is_mapped = true; - return 0; + if (ret == 0) + area->is_mapped = true; + return ret; } static void io_zcrx_sync_for_device(const struct page_pool *pool, |