[ upstream commit 5d540e4508950c674d6feef1d95463d039bbf4f5 ] 5d540e4508950 ("io_uring/zcrx: fix post open error handling") fixes some post queue open problems. Instead of picking all dependencies for that patch just move post open error handling out of the way, so once a queue is open we can always report a success. Move copy_to_user earlier before open, and xa_store() should already never fail as the slot is explicitly pre-allocated. Signed-off-by: Pavel Begunkov --- io_uring/zcrx.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c index c524be7109c2..208d03443020 100644 --- a/io_uring/zcrx.c +++ b/io_uring/zcrx.c @@ -625,6 +625,14 @@ int io_register_zcrx_ifq(struct io_ring_ctx *ctx, if (ret) goto netdev_put_unlock; + reg.zcrx_id = id; + if (copy_to_user(arg, ®, sizeof(reg)) || + copy_to_user(u64_to_user_ptr(reg.region_ptr), &rd, sizeof(rd)) || + copy_to_user(u64_to_user_ptr(reg.area_ptr), &area, sizeof(area))) { + ret = -EFAULT; + goto netdev_put_unlock; + } + mp_param.mp_ops = &io_uring_pp_zc_ops; mp_param.mp_priv = ifq; ret = __net_mp_open_rxq(ifq->netdev, reg.if_rxq, &mp_param, NULL); @@ -633,21 +641,11 @@ int io_register_zcrx_ifq(struct io_ring_ctx *ctx, netdev_unlock(ifq->netdev); ifq->if_rxq = reg.if_rxq; - reg.zcrx_id = id; - scoped_guard(mutex, &ctx->mmap_lock) { /* publish ifq */ - ret = -ENOMEM; - if (xa_store(&ctx->zcrx_ctxs, id, ifq, GFP_KERNEL)) - goto err; + xa_store(&ctx->zcrx_ctxs, id, ifq, GFP_KERNEL); } - if (copy_to_user(arg, ®, sizeof(reg)) || - copy_to_user(u64_to_user_ptr(reg.region_ptr), &rd, sizeof(rd)) || - copy_to_user(u64_to_user_ptr(reg.area_ptr), &area, sizeof(area))) { - ret = -EFAULT; - goto err; - } return 0; netdev_put_unlock: netdev_put(ifq->netdev, &ifq->netdev_tracker); -- 2.53.0