From: Anthony Liguori <anthony@codemonkey.ws>
To: Paolo Bonzini <pbonzini@redhat.com>, qemu-devel@nongnu.org
Cc: kwolf@redhat.com, aliguori@linux.vnet.ibm.com,
stefanha@linux.vnet.ibm.com, sw@weilnetz.de
Subject: Re: [Qemu-devel] [PATCH 06/12] linux-aio: use event notifiers
Date: Thu, 19 Jul 2012 14:10:25 -0500 [thread overview]
Message-ID: <87zk6vk1ni.fsf@codemonkey.ws> (raw)
In-Reply-To: <1342435377-25897-7-git-send-email-pbonzini@redhat.com>
Paolo Bonzini <pbonzini@redhat.com> writes:
> Since linux-aio already uses an eventfd, converting it to use the
> EventNotifier-based API simplifies the code even though it is not
> meant to be portable.
>
Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>
Regards,
Anthony Liguori
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> linux-aio.c | 49 +++++++++++++++++++------------------------------
> 1 file changed, 19 insertions(+), 30 deletions(-)
>
> diff --git a/linux-aio.c b/linux-aio.c
> index fa0fbf3..779f793 100644
> --- a/linux-aio.c
> +++ b/linux-aio.c
> @@ -10,8 +10,8 @@
> #include "qemu-common.h"
> #include "qemu-aio.h"
> #include "block/raw-posix-aio.h"
> +#include "event_notifier.h"
>
> -#include <sys/eventfd.h>
> #include <libaio.h>
>
> /*
> @@ -37,7 +37,7 @@ struct qemu_laiocb {
>
> struct qemu_laio_state {
> io_context_t ctx;
> - int efd;
> + EventNotifier e;
> int count;
> };
>
> @@ -76,29 +76,17 @@ static void qemu_laio_process_completion(struct qemu_laio_state *s,
> qemu_aio_release(laiocb);
> }
>
> -static void qemu_laio_completion_cb(void *opaque)
> +static void qemu_laio_completion_cb(EventNotifier *e)
> {
> - struct qemu_laio_state *s = opaque;
> + struct qemu_laio_state *s = container_of(e, struct qemu_laio_state, e);
>
> - while (1) {
> + while (event_notifier_test_and_clear(&s->e)) {
> struct io_event events[MAX_EVENTS];
> - uint64_t val;
> - ssize_t ret;
> struct timespec ts = { 0 };
> int nevents, i;
>
> do {
> - ret = read(s->efd, &val, sizeof(val));
> - } while (ret == -1 && errno == EINTR);
> -
> - if (ret == -1 && errno == EAGAIN)
> - break;
> -
> - if (ret != 8)
> - break;
> -
> - do {
> - nevents = io_getevents(s->ctx, val, MAX_EVENTS, events, &ts);
> + nevents = io_getevents(s->ctx, MAX_EVENTS, MAX_EVENTS, events, &ts);
> } while (nevents == -EINTR);
>
> for (i = 0; i < nevents; i++) {
> @@ -112,9 +100,9 @@ static void qemu_laio_completion_cb(void *opaque)
> }
> }
>
> -static int qemu_laio_flush_cb(void *opaque)
> +static int qemu_laio_flush_cb(EventNotifier *e)
> {
> - struct qemu_laio_state *s = opaque;
> + struct qemu_laio_state *s = container_of(e, struct qemu_laio_state, e);
>
> return (s->count > 0) ? 1 : 0;
> }
> @@ -146,8 +134,9 @@ static void laio_cancel(BlockDriverAIOCB *blockacb)
> * We might be able to do this slightly more optimal by removing the
> * O_NONBLOCK flag.
> */
> - while (laiocb->ret == -EINPROGRESS)
> - qemu_laio_completion_cb(laiocb->ctx);
> + while (laiocb->ret == -EINPROGRESS) {
> + qemu_laio_completion_cb(&laiocb->ctx->e);
> + }
> }
>
> static AIOPool laio_pool = {
> @@ -186,7 +175,7 @@ BlockDriverAIOCB *laio_submit(BlockDriverState *bs, void *aio_ctx, int fd,
> __func__, type);
> goto out_free_aiocb;
> }
> - io_set_eventfd(&laiocb->iocb, s->efd);
> + io_set_eventfd(&laiocb->iocb, event_notifier_get_fd(&s->e));
> s->count++;
>
> if (io_submit(s->ctx, 1, &iocbs) < 0)
> @@ -205,21 +194,21 @@ void *laio_init(void)
> struct qemu_laio_state *s;
>
> s = g_malloc0(sizeof(*s));
> - s->efd = eventfd(0, 0);
> - if (s->efd == -1)
> + if (event_notifier_init(&s->e, false) < 0) {
> goto out_free_state;
> - fcntl(s->efd, F_SETFL, O_NONBLOCK);
> + }
>
> - if (io_setup(MAX_EVENTS, &s->ctx) != 0)
> + if (io_setup(MAX_EVENTS, &s->ctx) != 0) {
> goto out_close_efd;
> + }
>
> - qemu_aio_set_fd_handler(s->efd, qemu_laio_completion_cb, NULL,
> - qemu_laio_flush_cb, s);
> + qemu_aio_set_event_notifier(&s->e, qemu_laio_completion_cb,
> + qemu_laio_flush_cb);
>
> return s;
>
> out_close_efd:
> - close(s->efd);
> + event_notifier_cleanup(&s->e);
> out_free_state:
> g_free(s);
> return NULL;
> --
> 1.7.10.4
next prev parent reply other threads:[~2012-07-19 19:10 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-07-16 10:42 [Qemu-devel] [PATCH 00/12] Portable thread-pool/AIO, Win32 emulated AIO Paolo Bonzini
2012-07-16 10:42 ` [Qemu-devel] [PATCH 01/12] event_notifier: enable it to use pipes Paolo Bonzini
2012-07-19 18:58 ` Anthony Liguori
2012-07-16 10:42 ` [Qemu-devel] [PATCH 02/12] event_notifier: add Win32 implementation Paolo Bonzini
2012-07-16 10:42 ` [Qemu-devel] [PATCH 03/12] main-loop: use event notifiers Paolo Bonzini
2012-07-19 19:04 ` Anthony Liguori
2012-07-16 10:42 ` [Qemu-devel] [PATCH 04/12] aio: provide platform-independent API Paolo Bonzini
2012-07-16 10:42 ` [Qemu-devel] [PATCH 05/12] aio: add Win32 implementation Paolo Bonzini
2012-07-16 10:42 ` [Qemu-devel] [PATCH 06/12] linux-aio: use event notifiers Paolo Bonzini
2012-07-19 19:10 ` Anthony Liguori [this message]
2012-07-16 10:42 ` [Qemu-devel] [PATCH 07/12] qemu-thread: add QemuSemaphore Paolo Bonzini
2012-07-16 12:00 ` Jan Kiszka
2012-07-16 12:01 ` [Qemu-devel] [PATCH] qemu-thread: Introduce qemu_cond_timedwait for POSIX Jan Kiszka
2012-07-16 13:20 ` [Qemu-devel] [PATCH 07/12] qemu-thread: add QemuSemaphore Paolo Bonzini
2012-07-16 13:34 ` Jan Kiszka
2012-07-16 13:35 ` Paolo Bonzini
2012-07-16 13:53 ` Jan Kiszka
2012-07-16 14:03 ` Paolo Bonzini
2012-07-16 14:09 ` Jan Kiszka
2012-07-16 14:20 ` Paolo Bonzini
2012-07-24 16:55 ` Paolo Bonzini
2012-07-16 10:42 ` [Qemu-devel] [PATCH 08/12] aio: add generic thread-pool facility Paolo Bonzini
2012-07-16 10:42 ` [Qemu-devel] [PATCH 09/12] block: switch posix-aio-compat to threadpool Paolo Bonzini
2012-07-16 10:42 ` [Qemu-devel] [PATCH 10/12] raw: merge posix-aio-compat.c into block/raw-posix.c Paolo Bonzini
2012-07-16 10:42 ` [Qemu-devel] [PATCH 11/12] raw-posix: rename raw-posix-aio.h, hide unavailable prototypes Paolo Bonzini
2012-07-16 10:42 ` [Qemu-devel] [PATCH 12/12] raw-win32: add emulated AIO support Paolo Bonzini
2012-07-23 16:35 ` Blue Swirl
2012-07-23 16:59 ` Paolo Bonzini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87zk6vk1ni.fsf@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=aliguori@linux.vnet.ibm.com \
--cc=kwolf@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@linux.vnet.ibm.com \
--cc=sw@weilnetz.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).