[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 12/17] aio: add aio_notify
From: |
Anthony Liguori |
Subject: |
Re: [Qemu-devel] [PATCH 12/17] aio: add aio_notify |
Date: |
Tue, 25 Sep 2012 17:07:46 -0500 |
User-agent: |
Notmuch/0.13.2+93~ged93d79 (http://notmuchmail.org) Emacs/23.3.1 (x86_64-pc-linux-gnu) |
Paolo Bonzini <address@hidden> writes:
> With this change async.c does not rely anymore on any service from
> main-loop.c, i.e. it is completely self-contained.
>
> Signed-off-by: Paolo Bonzini <address@hidden>
Other than the coding style bits that need to be fixed first in the
previous patch:
Reviewed-by: Anthony Liguori <address@hidden>
Regards,
Anthony Liguori
> ---
> async.c | 30 ++++++++++++++++++++++++++----
> qemu-aio.h | 18 ++++++++++++++++++
> 2 file modificati, 44 inserzioni(+), 4 rimozioni(-)
>
> diff --git a/async.c b/async.c
> index ed2bd3f..31c6c76 100644
> --- a/async.c
> +++ b/async.c
> @@ -30,6 +30,7 @@
> /* bottom halves (can be seen as timers which expire ASAP) */
>
> struct QEMUBH {
> + AioContext *ctx;
> QEMUBHFunc *cb;
> void *opaque;
> QEMUBH *next;
> @@ -42,6 +43,7 @@ QEMUBH *aio_bh_new(AioContext *ctx, QEMUBHFunc *cb, void
> *opaque)
> {
> QEMUBH *bh;
> bh = g_malloc0(sizeof(QEMUBH));
> + bh->ctx = ctx;
> bh->cb = cb;
> bh->opaque = opaque;
> bh->next = ctx->first_bh;
> @@ -101,8 +103,7 @@ void qemu_bh_schedule(QEMUBH *bh)
> return;
> bh->scheduled = 1;
> bh->idle = 0;
> - /* stop the currently executing CPU to execute the BH ASAP */
> - qemu_notify_event();
> + aio_notify(bh->ctx);
> }
>
> void qemu_bh_cancel(QEMUBH *bh)
> @@ -177,11 +178,20 @@ aio_ctx_dispatch(GSource *source,
> return TRUE;
> }
>
> +static void
> +aio_ctx_finalize(GSource *source)
> +{
> + AioContext *ctx = (AioContext *) source;
> +
> + aio_set_event_notifier(ctx, &ctx->notifier, NULL, NULL);
> + event_notifier_cleanup(&ctx->notifier);
> +}
> +
> static GSourceFuncs aio_source_funcs = {
> aio_ctx_prepare,
> aio_ctx_check,
> aio_ctx_dispatch,
> - NULL
> + aio_ctx_finalize
> };
>
> GSource *aio_get_g_source(AioContext *ctx)
> @@ -190,9 +200,21 @@ GSource *aio_get_g_source(AioContext *ctx)
> return &ctx->source;
> }
>
> +void aio_notify(AioContext *ctx)
> +{
> + event_notifier_set(&ctx->notifier);
> +}
> +
> AioContext *aio_context_new(void)
> {
> - return (AioContext *) g_source_new(&aio_source_funcs,
> sizeof(AioContext));
> + AioContext *ctx;
> + ctx = (AioContext *) g_source_new(&aio_source_funcs, sizeof(AioContext));
> + event_notifier_init(&ctx->notifier, false);
> + aio_set_event_notifier(ctx, &ctx->notifier,
> + (EventNotifierHandler *)
> + event_notifier_test_and_clear, NULL);
> +
> + return ctx;
> }
>
> void aio_context_ref(AioContext *ctx)
> diff --git a/qemu-aio.h b/qemu-aio.h
> index aedf66c..2354617 100644
> --- a/qemu-aio.h
> +++ b/qemu-aio.h
> @@ -62,6 +62,9 @@ typedef struct AioContext {
> * no callbacks are removed while we're walking and dispatching
> callbacks.
> */
> int walking_bh;
> +
> + /* Used for aio_notify. */
> + EventNotifier notifier;
> } AioContext;
>
> /* Returns 1 if there are still outstanding AIO requests; 0 otherwise */
> @@ -102,6 +105,21 @@ void aio_context_unref(AioContext *ctx);
> QEMUBH *aio_bh_new(AioContext *ctx, QEMUBHFunc *cb, void *opaque);
>
> /**
> + * aio_notify: Force processing of pending events.
> + *
> + * Similar to signaling a condition variable, aio_notify forces
> + * aio_wait to exit, so that the next call will re-examine pending events.
> + * The caller of aio_notify will usually call aio_wait again very soon,
> + * or go through another iteration of the GLib main loop. Hence, aio_notify
> + * also has the side effect of recalculating the sets of file descriptors
> + * that the main loop waits for.
> + *
> + * Calling aio_notify is rarely necessary, because for example scheduling
> + * a bottom half calls it already.
> + */
> +void aio_notify(AioContext *ctx);
> +
> +/**
> * aio_bh_poll: Poll bottom halves for an AioContext.
> *
> * These are internal functions used by the QEMU main loop.
> --
> 1.7.12
- Re: [Qemu-devel] [PATCH 05/17] aio: provide platform-independent API, (continued)
- [Qemu-devel] [PATCH 07/17] aio: add I/O handlers to the AioContext interface, Paolo Bonzini, 2012/09/25
- [Qemu-devel] [PATCH 08/17] aio: add non-blocking variant of aio_wait, Paolo Bonzini, 2012/09/25
- [Qemu-devel] [PATCH 10/17] aio: add Win32 implementation, Paolo Bonzini, 2012/09/25
- [Qemu-devel] [PATCH 09/17] aio: prepare for introducing GSource-based dispatch, Paolo Bonzini, 2012/09/25
- [Qemu-devel] [PATCH 12/17] aio: add aio_notify, Paolo Bonzini, 2012/09/25
- Re: [Qemu-devel] [PATCH 12/17] aio: add aio_notify,
Anthony Liguori <=
- [Qemu-devel] [PATCH 13/17] aio: call aio_notify after setting I/O handlers, Paolo Bonzini, 2012/09/25
- [Qemu-devel] [PATCH 14/17] main-loop: use GSource to poll AIO file descriptors, Paolo Bonzini, 2012/09/25
- [Qemu-devel] [PATCH 16/17] aio: clean up now-unused functions, Paolo Bonzini, 2012/09/25
- [Qemu-devel] [PATCH 15/17] main-loop: use aio_notify for qemu_notify_event, Paolo Bonzini, 2012/09/25
- [Qemu-devel] [PATCH 17/17] linux-aio: use event notifiers, Paolo Bonzini, 2012/09/25