t/io_uring: take advantage of new io_uring setup flags
authorJens Axboe <axboe@kernel.dk>
Thu, 1 Sep 2022 00:44:52 +0000 (18:44 -0600)
committerJens Axboe <axboe@kernel.dk>
Thu, 1 Sep 2022 00:44:52 +0000 (18:44 -0600)
Set COOP_TASKRUN, SINGLE_ISSUER, and DEFER_TASKRUN if they are available
on the host.

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

index 1746e59a1195bbdcf254cd88d771144530af3176..5b46015aa394175bb9167cf02e95a9cc8ccf2f6a 100644 (file)
@@ -449,6 +449,8 @@ static int io_uring_register_files(struct submitter *s)
 
 static int io_uring_setup(unsigned entries, struct io_uring_params *p)
 {
+       int ret;
+
        /*
         * Clamp CQ ring size at our SQ ring size, we don't need more entries
         * than that.
@@ -456,7 +458,28 @@ static int io_uring_setup(unsigned entries, struct io_uring_params *p)
        p->flags |= IORING_SETUP_CQSIZE;
        p->cq_entries = entries;
 
-       return syscall(__NR_io_uring_setup, entries, p);
+       p->flags |= IORING_SETUP_COOP_TASKRUN;
+       p->flags |= IORING_SETUP_SINGLE_ISSUER;
+       p->flags |= IORING_SETUP_DEFER_TASKRUN;
+retry:
+       ret = syscall(__NR_io_uring_setup, entries, p);
+       if (!ret)
+               return 0;
+
+       if (errno == EINVAL && p->flags & IORING_SETUP_COOP_TASKRUN) {
+               p->flags &= ~IORING_SETUP_COOP_TASKRUN;
+               goto retry;
+       }
+       if (errno == EINVAL && p->flags & IORING_SETUP_SINGLE_ISSUER) {
+               p->flags &= ~IORING_SETUP_SINGLE_ISSUER;
+               goto retry;
+       }
+       if (errno == EINVAL && p->flags & IORING_SETUP_DEFER_TASKRUN) {
+               p->flags &= ~IORING_SETUP_DEFER_TASKRUN;
+               goto retry;
+       }
+
+       return ret;
 }
 
 static void io_uring_probe(int fd)