Pavel Begunkov <asml.silence@xxxxxxxxx> writes: > io_mem_alloc() returns a pointer on success and a pointer-encoded error > otherwise. However, it can only fail with -ENOMEM, just return NULL on > failure. PTR_ERR is usually pretty error prone. > > Signed-off-by: Pavel Begunkov <asml.silence@xxxxxxxxx> > --- > io_uring/io_uring.c | 14 +++++--------- > io_uring/kbuf.c | 4 ++-- > 2 files changed, 7 insertions(+), 11 deletions(-) > > diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c > index e7d7a456b489..1d0eac0cc8aa 100644 > --- a/io_uring/io_uring.c > +++ b/io_uring/io_uring.c > @@ -2802,12 +2802,8 @@ static void io_rings_free(struct io_ring_ctx *ctx) > void *io_mem_alloc(size_t size) > { > gfp_t gfp = GFP_KERNEL_ACCOUNT | __GFP_ZERO | __GFP_NOWARN | __GFP_COMP; > - void *ret; > > - ret = (void *) __get_free_pages(gfp, get_order(size)); > - if (ret) > - return ret; > - return ERR_PTR(-ENOMEM); > + return (void *) __get_free_pages(gfp, get_order(size)); > } > > static unsigned long rings_size(struct io_ring_ctx *ctx, unsigned int sq_entries, > @@ -3762,8 +3758,8 @@ static __cold int io_allocate_scq_urings(struct io_ring_ctx *ctx, > else > rings = io_rings_map(ctx, p->cq_off.user_addr, size); > > - if (IS_ERR(rings)) > - return PTR_ERR(rings); > + if (!rings) > + return -ENOMEM; > Sorry, I started reviewing this, got excited about the error path quick fix, and didn't finish the review before it got it. I think this change is broken for the ctx->flags & IORING_SETUP_NO_MMAP case, because io_rings_map returns ERR_PTR, and not NULL. In addition, io_rings_map might fail for multiple reasons, and we want to propagate the different error codes up here. -- Gabriel Krisman Bertazi