diff mbox series

[RFC,5/9] util/asyn: add aio interfaces for io_uring

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

Commit Message

Aarushi Mehta May 21, 2019, 11:52 p.m. UTC
Signed-off-by: Aarushi Mehta <mehta.aaru20@gmail.com>
---
 util/async.c | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

--
2.17.1

Comments

Stefan Hajnoczi May 22, 2019, 1:16 p.m. UTC | #1
On Wed, May 22, 2019 at 05:22:11AM +0530, Aarushi Mehta wrote:

s/asyn/async/ in the Subject line.

> @@ -341,6 +349,25 @@ LinuxAioState *aio_get_linux_aio(AioContext *ctx)
>  }
>  #endif
> 
> +#ifdef CONFIG_LINUX_IO_URING
> +LuringState *aio_setup_linux_io_uring(AioContext *ctx, Error **errp)
> +{
> +    if (!ctx->linux_io_uring) {
> +        ctx->linux_io_uring = luring_init(errp);
> +        if (ctx->linux_io_uring) {
> +            luring_attach_aio_context(ctx->linux_io_uring, ctx);
> +        }
> +    }
> +    return ctx->linux_io_uring;
> +}

Personally I find functions that are written to have a single return
statement hard to understand due to the nesting and multiple code paths.
I prefer a straight-line approach that returns as soon as there is an
error.

This is a style thing.  You can do it either way.  Here is the same
without nesting:

  if (ctx->linux_io_uring) {
      return ctx->linux_io_uring;
  }

  ctx->linux_io_uring = luring_init(errp);
  if (!ctx->linux_io_uring) {
      return NULL;
  }

  luring_attach_aio_context(ctx->linux_io_uring, ctx);
  return ctx->linux_io_uring;
diff mbox series

Patch

diff --git a/util/async.c b/util/async.c
index c10642a385..dd45aff8f5 100644
--- a/util/async.c
+++ b/util/async.c
@@ -277,6 +277,14 @@  aio_ctx_finalize(GSource     *source)
     }
 #endif

+#ifdef CONFIG_LINUX_IO_URING
+    if (ctx->linux_io_uring) {
+        luring_detach_aio_context(ctx->linux_io_uring, ctx);
+        luring_cleanup(ctx->linux_io_uring);
+        ctx->linux_io_uring = NULL;
+    }
+#endif
+
     assert(QSLIST_EMPTY(&ctx->scheduled_coroutines));
     qemu_bh_delete(ctx->co_schedule_bh);

@@ -341,6 +349,25 @@  LinuxAioState *aio_get_linux_aio(AioContext *ctx)
 }
 #endif

+#ifdef CONFIG_LINUX_IO_URING
+LuringState *aio_setup_linux_io_uring(AioContext *ctx, Error **errp)
+{
+    if (!ctx->linux_io_uring) {
+        ctx->linux_io_uring = luring_init(errp);
+        if (ctx->linux_io_uring) {
+            luring_attach_aio_context(ctx->linux_io_uring, ctx);
+        }
+    }
+    return ctx->linux_io_uring;
+}
+
+LuringState *aio_get_linux_io_uring(AioContext *ctx)
+{
+    assert(ctx->linux_io_uring);
+    return ctx->linux_io_uring;
+}
+#endif
+
 void aio_notify(AioContext *ctx)
 {
     /* Write e.g. bh->scheduled before reading ctx->notify_me.  Pairs
@@ -432,6 +459,11 @@  AioContext *aio_context_new(Error **errp)
 #ifdef CONFIG_LINUX_AIO
     ctx->linux_aio = NULL;
 #endif
+
+#ifdef CONFIG_LINUX_IO_URING
+    ctx->linux_io_uring = NULL;
+#endif
+
     ctx->thread_pool = NULL;
     qemu_rec_mutex_init(&ctx->lock);
     timerlistgroup_init(&ctx->tlg, aio_timerlist_notify, ctx);