io_uring/rsrc: keep one global dummy_ubuf
[platform/kernel/linux-starfive.git] / io_uring / rsrc.c
index 5e8fdd9..d9c853d 100644 (file)
@@ -33,6 +33,12 @@ static int io_sqe_buffer_register(struct io_ring_ctx *ctx, struct iovec *iov,
 #define IORING_MAX_FIXED_FILES (1U << 20)
 #define IORING_MAX_REG_BUFFERS (1U << 14)
 
+static const struct io_mapped_ubuf dummy_ubuf = {
+       /* set invalid range, so io_import_fixed() fails meeting it */
+       .ubuf = -1UL,
+       .ubuf_end = 0,
+};
+
 int __io_account_mem(struct user_struct *user, unsigned long nr_pages)
 {
        unsigned long page_limit, cur_pages, new_pages;
@@ -132,7 +138,7 @@ static void io_buffer_unmap(struct io_ring_ctx *ctx, struct io_mapped_ubuf **slo
        struct io_mapped_ubuf *imu = *slot;
        unsigned int i;
 
-       if (imu != ctx->dummy_ubuf) {
+       if (imu != &dummy_ubuf) {
                for (i = 0; i < imu->nr_bvecs; i++)
                        unpin_user_page(imu->bvec[i].bv_page);
                if (imu->acct_pages)
@@ -459,14 +465,14 @@ static int __io_sqe_buffers_update(struct io_ring_ctx *ctx,
                        break;
 
                i = array_index_nospec(up->offset + done, ctx->nr_user_bufs);
-               if (ctx->user_bufs[i] != ctx->dummy_ubuf) {
+               if (ctx->user_bufs[i] != &dummy_ubuf) {
                        err = io_queue_rsrc_removal(ctx->buf_data, i,
                                                    ctx->user_bufs[i]);
                        if (unlikely(err)) {
                                io_buffer_unmap(ctx, &imu);
                                break;
                        }
-                       ctx->user_bufs[i] = ctx->dummy_ubuf;
+                       ctx->user_bufs[i] = (struct io_mapped_ubuf *)&dummy_ubuf;
                }
 
                ctx->user_bufs[i] = imu;
@@ -1077,7 +1083,7 @@ static int io_sqe_buffer_register(struct io_ring_ctx *ctx, struct iovec *iov,
        int ret, nr_pages, i;
        struct folio *folio = NULL;
 
-       *pimu = ctx->dummy_ubuf;
+       *pimu = (struct io_mapped_ubuf *)&dummy_ubuf;
        if (!iov->iov_base)
                return 0;