diff options
author | Pavel Begunkov <asml.silence@gmail.com> | 2025-05-01 15:17:15 +0300 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2025-05-02 18:24:42 +0300 |
commit | 6c9589aa08471f8984cdb5e743d2a2c048dc2403 (patch) | |
tree | 3e39ab14b56031c5242dee9a48cb6d3699ab48a2 | |
parent | d760d3f59f0d8d0df2895db30d36cf23106d6b05 (diff) | |
download | linux-6c9589aa08471f8984cdb5e743d2a2c048dc2403.tar.xz |
io_uring/zcrx: resolve netdev before area creation
Some area types will require a valid struct device to be created, so
resolve netdev and struct device before creating an area.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/ac8c1482be22acfe9ca788d2c3ce31b7451ce488.1746097431.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r-- | io_uring/zcrx.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c index 5e918587fdc5..b5335dd4f5b1 100644 --- a/io_uring/zcrx.c +++ b/io_uring/zcrx.c @@ -395,6 +395,7 @@ int io_register_zcrx_ifq(struct io_ring_ctx *ctx, ifq = io_zcrx_ifq_alloc(ctx); if (!ifq) return -ENOMEM; + ifq->rq_entries = reg.rq_entries; scoped_guard(mutex, &ctx->mmap_lock) { /* preallocate id */ @@ -407,24 +408,24 @@ int io_register_zcrx_ifq(struct io_ring_ctx *ctx, if (ret) goto err; - ret = io_zcrx_create_area(ifq, &ifq->area, &area); - if (ret) - goto err; - - ifq->rq_entries = reg.rq_entries; - - ret = -ENODEV; ifq->netdev = netdev_get_by_index(current->nsproxy->net_ns, reg.if_idx, &ifq->netdev_tracker, GFP_KERNEL); - if (!ifq->netdev) + if (!ifq->netdev) { + ret = -ENODEV; goto err; + } ifq->dev = ifq->netdev->dev.parent; - ret = -EOPNOTSUPP; - if (!ifq->dev) + if (!ifq->dev) { + ret = -EOPNOTSUPP; goto err; + } get_device(ifq->dev); + ret = io_zcrx_create_area(ifq, &ifq->area, &area); + if (ret) + goto err; + 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); |