io_uring: encapsulate extraneous wait flags into a separate struct
authorJens Axboe <axboe@kernel.dk>
Thu, 15 Aug 2024 22:13:32 +0000 (16:13 -0600)
committerJens Axboe <axboe@kernel.dk>
Sun, 25 Aug 2024 14:27:01 +0000 (08:27 -0600)
Rather than need to pass in 2 or 3 separate arguments, add a struct
to encapsulate the timeout and sigset_t parts of waiting. In preparation
for adding another argument for waiting.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/io_uring.c

index 20229e72b65cafb73a273ecac3eebfa5bd8650bf..37053d32c6683f0553dda9da7b2a6919851b65f8 100644 (file)
@@ -2384,13 +2384,18 @@ static inline int io_cqring_wait_schedule(struct io_ring_ctx *ctx,
        return ret;
 }
 
+struct ext_arg {
+       size_t argsz;
+       struct __kernel_timespec __user *ts;
+       const sigset_t __user *sig;
+};
+
 /*
  * Wait until events become available, if we don't already have some. The
  * application must reap them itself, as they reside on the shared cq ring.
  */
 static int io_cqring_wait(struct io_ring_ctx *ctx, int min_events, u32 flags,
-                         const sigset_t __user *sig, size_t sigsz,
-                         struct __kernel_timespec __user *uts)
+                         struct ext_arg *ext_arg)
 {
        struct io_wait_queue iowq;
        struct io_rings *rings = ctx->rings;
@@ -2415,10 +2420,10 @@ static int io_cqring_wait(struct io_ring_ctx *ctx, int min_events, u32 flags,
        iowq.cq_tail = READ_ONCE(ctx->rings->cq.head) + min_events;
        iowq.timeout = KTIME_MAX;
 
-       if (uts) {
+       if (ext_arg->ts) {
                struct timespec64 ts;
 
-               if (get_timespec64(&ts, uts))
+               if (get_timespec64(&ts, ext_arg->ts))
                        return -EFAULT;
 
                iowq.timeout = timespec64_to_ktime(ts);
@@ -2426,14 +2431,14 @@ static int io_cqring_wait(struct io_ring_ctx *ctx, int min_events, u32 flags,
                        iowq.timeout = ktime_add(iowq.timeout, io_get_time(ctx));
        }
 
-       if (sig) {
+       if (ext_arg->sig) {
 #ifdef CONFIG_COMPAT
                if (in_compat_syscall())
-                       ret = set_compat_user_sigmask((const compat_sigset_t __user *)sig,
-                                                     sigsz);
+                       ret = set_compat_user_sigmask((const compat_sigset_t __user *)ext_arg->sig,
+                                                     ext_arg->argsz);
                else
 #endif
-                       ret = set_user_sigmask(sig, sigsz);
+                       ret = set_user_sigmask(ext_arg->sig, ext_arg->argsz);
 
                if (ret)
                        return ret;
@@ -3112,9 +3117,8 @@ static int io_validate_ext_arg(unsigned flags, const void __user *argp, size_t a
        return 0;
 }
 
-static int io_get_ext_arg(unsigned flags, const void __user *argp, size_t *argsz,
-                         struct __kernel_timespec __user **ts,
-                         const sigset_t __user **sig)
+static int io_get_ext_arg(unsigned flags, const void __user *argp,
+                         struct ext_arg *ext_arg)
 {
        struct io_uring_getevents_arg arg;
 
@@ -3123,8 +3127,8 @@ static int io_get_ext_arg(unsigned flags, const void __user *argp, size_t *argsz
         * is just a pointer to the sigset_t.
         */
        if (!(flags & IORING_ENTER_EXT_ARG)) {
-               *sig = (const sigset_t __user *) argp;
-               *ts = NULL;
+               ext_arg->sig = (const sigset_t __user *) argp;
+               ext_arg->ts = NULL;
                return 0;
        }
 
@@ -3132,15 +3136,15 @@ static int io_get_ext_arg(unsigned flags, const void __user *argp, size_t *argsz
         * EXT_ARG is set - ensure we agree on the size of it and copy in our
         * timespec and sigset_t pointers if good.
         */
-       if (*argsz != sizeof(arg))
+       if (ext_arg->argsz != sizeof(arg))
                return -EINVAL;
        if (copy_from_user(&arg, argp, sizeof(arg)))
                return -EFAULT;
        if (arg.pad)
                return -EINVAL;
-       *sig = u64_to_user_ptr(arg.sigmask);
-       *argsz = arg.sigmask_sz;
-       *ts = u64_to_user_ptr(arg.ts);
+       ext_arg->sig = u64_to_user_ptr(arg.sigmask);
+       ext_arg->argsz = arg.sigmask_sz;
+       ext_arg->ts = u64_to_user_ptr(arg.ts);
        return 0;
 }
 
@@ -3246,15 +3250,14 @@ iopoll_locked:
                        }
                        mutex_unlock(&ctx->uring_lock);
                } else {
-                       const sigset_t __user *sig;
-                       struct __kernel_timespec __user *ts;
+                       struct ext_arg ext_arg = { .argsz = argsz };
 
-                       ret2 = io_get_ext_arg(flags, argp, &argsz, &ts, &sig);
+                       ret2 = io_get_ext_arg(flags, argp, &ext_arg);
                        if (likely(!ret2)) {
                                min_complete = min(min_complete,
                                                   ctx->cq_entries);
                                ret2 = io_cqring_wait(ctx, min_complete, flags,
-                                                     sig, argsz, ts);
+                                                     &ext_arg);
                        }
                }