diff mbox series

[v9,17/17] block/io_uring: enable kernel submission polling

Message ID 20190801234031.29561-18-mehta.aaru20@gmail.com (mailing list archive)
State New, archived
Headers show
Series Add support for io_uring | expand

Commit Message

Aarushi Mehta Aug. 1, 2019, 11:40 p.m. UTC
Signed-off-by: Aarushi Mehta <mehta.aaru20@gmail.com>
---
 block/io_uring.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

Comments

Stefan Hajnoczi Aug. 2, 2019, 8:08 a.m. UTC | #1
On Fri, Aug 02, 2019 at 05:10:31AM +0530, Aarushi Mehta wrote:
> Signed-off-by: Aarushi Mehta <mehta.aaru20@gmail.com>
> ---
>  block/io_uring.c | 17 ++++++++++++++++-
>  1 file changed, 16 insertions(+), 1 deletion(-)

How does SQPOLL performance compare?

> diff --git a/block/io_uring.c b/block/io_uring.c
> index 1553cd2e58..2a1d79704a 100644
> --- a/block/io_uring.c
> +++ b/block/io_uring.c
> @@ -288,6 +288,17 @@ static int ioq_submit(LuringState *s)
>              *sqes = luringcb->sqeq;
>              QSIMPLEQ_REMOVE_HEAD(&s->io_q.submit_queue, next);
>          }
> +        /*
> +         * io_uring_submit() returns sqes in ring for kernel side
> +         * submission polling and sets wakeup flag if needed.
> +         *
> +         * It is not possible for any sqes to have already been
> +         * submitted by the sq_poll as the writes are only made visible
> +         * to the kernel in this function.
> +         *
> +         * For normal I/O, it returns the actual submitted requests
> +         * from io_uring_enter()
> +         */
>          ret = io_uring_submit(&s->ring);
>          trace_luring_io_uring_submit(s, ret);
>          /* Prevent infinite loop if submission is refused */
> @@ -525,7 +536,11 @@ LuringState *luring_init(Error **errp)
>      s = g_new0(LuringState, 1);
>      trace_luring_init_state(s, sizeof(*s));
>      struct io_uring *ring = &s->ring;
> -    rc = io_uring_queue_init(MAX_EVENTS, ring, 0);
> +
> +    rc = io_uring_queue_init(MAX_EVENTS, ring, IORING_SETUP_SQPOLL);
> +    if (rc == -EOPNOTSUPP) {
> +            rc = io_uring_queue_init(MAX_EVENTS, ring, 0);

Please use 4-space indentation.
Stefan Hajnoczi Aug. 5, 2019, 8:29 a.m. UTC | #2
On Fri, Aug 2, 2019 at 12:50 AM Aarushi Mehta <mehta.aaru20@gmail.com> wrote:
> +    rc = io_uring_queue_init(MAX_EVENTS, ring, IORING_SETUP_SQPOLL);
> +    if (rc == -EOPNOTSUPP) {
> +            rc = io_uring_queue_init(MAX_EVENTS, ring, 0);
> +    }

IORING_SETUP_SQPOLL is only allowed when the user has CAP_SYS_ADMIN
(e.g. they are root).  Otherwise it fails with -EPERM.

This patch breaks non-root QEMU usage.  Please handle -EPERM like
-EOPNOTSUPP so it falls back to non-polling mode.

Stefan
diff mbox series

Patch

diff --git a/block/io_uring.c b/block/io_uring.c
index 1553cd2e58..2a1d79704a 100644
--- a/block/io_uring.c
+++ b/block/io_uring.c
@@ -288,6 +288,17 @@  static int ioq_submit(LuringState *s)
             *sqes = luringcb->sqeq;
             QSIMPLEQ_REMOVE_HEAD(&s->io_q.submit_queue, next);
         }
+        /*
+         * io_uring_submit() returns sqes in ring for kernel side
+         * submission polling and sets wakeup flag if needed.
+         *
+         * It is not possible for any sqes to have already been
+         * submitted by the sq_poll as the writes are only made visible
+         * to the kernel in this function.
+         *
+         * For normal I/O, it returns the actual submitted requests
+         * from io_uring_enter()
+         */
         ret = io_uring_submit(&s->ring);
         trace_luring_io_uring_submit(s, ret);
         /* Prevent infinite loop if submission is refused */
@@ -525,7 +536,11 @@  LuringState *luring_init(Error **errp)
     s = g_new0(LuringState, 1);
     trace_luring_init_state(s, sizeof(*s));
     struct io_uring *ring = &s->ring;
-    rc = io_uring_queue_init(MAX_EVENTS, ring, 0);
+
+    rc = io_uring_queue_init(MAX_EVENTS, ring, IORING_SETUP_SQPOLL);
+    if (rc == -EOPNOTSUPP) {
+            rc = io_uring_queue_init(MAX_EVENTS, ring, 0);
+    }
     if (rc < 0) {
         error_setg_errno(errp, errno, "failed to init linux io_uring ring");
         g_free(s);