From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47309) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZovDG-0004d2-ML for qemu-devel@nongnu.org; Wed, 21 Oct 2015 11:22:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZovD4-0007Uk-SV for qemu-devel@nongnu.org; Wed, 21 Oct 2015 11:22:01 -0400 Date: Wed, 21 Oct 2015 11:21:20 -0400 From: Jeff Cody Message-ID: <20151021152120.GA6466@localhost.localdomain> References: <1445393209-26545-1-git-send-email-famz@redhat.com> <1445393209-26545-2-git-send-email-famz@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1445393209-26545-2-git-send-email-famz@redhat.com> Subject: Re: [Qemu-devel] [Qemu-block] [PATCH v5 01/12] aio: Add "is_external" flag for event handlers List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Fam Zheng Cc: kwolf@redhat.com, pbonzini@redhat.com, qemu-block@nongnu.org, qemu-devel@nongnu.org, stefanha@redhat.com On Wed, Oct 21, 2015 at 10:06:38AM +0800, Fam Zheng wrote: > All callers pass in false, and the real external ones will switch to > true in coming patches. > > Signed-off-by: Fam Zheng Just a comment, but not necessarily a request to change: We have a lot of functions that take bool true/false arguments, and it can sometimes make it difficult to read the code. I wonder if an enum (e.g. AIO_EXTERNAL, AIO_INTERNAL) would be more descriptive and easier to read for the aio_set_* functions. Either way: Reviewed-by: Jeff Cody > --- > aio-posix.c | 6 ++++- > aio-win32.c | 5 ++++ > async.c | 3 ++- > block/curl.c | 14 +++++----- > block/iscsi.c | 9 +++---- > block/linux-aio.c | 5 ++-- > block/nbd-client.c | 10 ++++--- > block/nfs.c | 17 +++++------- > block/sheepdog.c | 38 ++++++++++++++++++--------- > block/ssh.c | 5 ++-- > block/win32-aio.c | 5 ++-- > hw/block/dataplane/virtio-blk.c | 6 +++-- > hw/scsi/virtio-scsi-dataplane.c | 24 +++++++++++------ > include/block/aio.h | 2 ++ > iohandler.c | 3 ++- > nbd.c | 4 ++- > tests/test-aio.c | 58 +++++++++++++++++++++++------------------ > 17 files changed, 130 insertions(+), 84 deletions(-) > > diff --git a/aio-posix.c b/aio-posix.c > index d477033..f0f9122 100644 > --- a/aio-posix.c > +++ b/aio-posix.c > @@ -25,6 +25,7 @@ struct AioHandler > IOHandler *io_write; > int deleted; > void *opaque; > + bool is_external; > QLIST_ENTRY(AioHandler) node; > }; > > @@ -43,6 +44,7 @@ static AioHandler *find_aio_handler(AioContext *ctx, int fd) > > void aio_set_fd_handler(AioContext *ctx, > int fd, > + bool is_external, > IOHandler *io_read, > IOHandler *io_write, > void *opaque) > @@ -82,6 +84,7 @@ void aio_set_fd_handler(AioContext *ctx, > node->io_read = io_read; > node->io_write = io_write; > node->opaque = opaque; > + node->is_external = is_external; > > node->pfd.events = (io_read ? G_IO_IN | G_IO_HUP | G_IO_ERR : 0); > node->pfd.events |= (io_write ? G_IO_OUT | G_IO_ERR : 0); > @@ -92,10 +95,11 @@ void aio_set_fd_handler(AioContext *ctx, > > void aio_set_event_notifier(AioContext *ctx, > EventNotifier *notifier, > + bool is_external, > EventNotifierHandler *io_read) > { > aio_set_fd_handler(ctx, event_notifier_get_fd(notifier), > - (IOHandler *)io_read, NULL, notifier); > + is_external, (IOHandler *)io_read, NULL, notifier); > } > > bool aio_prepare(AioContext *ctx) > diff --git a/aio-win32.c b/aio-win32.c > index 50a6867..3110d85 100644 > --- a/aio-win32.c > +++ b/aio-win32.c > @@ -28,11 +28,13 @@ struct AioHandler { > GPollFD pfd; > int deleted; > void *opaque; > + bool is_external; > QLIST_ENTRY(AioHandler) node; > }; > > void aio_set_fd_handler(AioContext *ctx, > int fd, > + bool is_external, > IOHandler *io_read, > IOHandler *io_write, > void *opaque) > @@ -86,6 +88,7 @@ void aio_set_fd_handler(AioContext *ctx, > node->opaque = opaque; > node->io_read = io_read; > node->io_write = io_write; > + node->is_external = is_external; > > event = event_notifier_get_handle(&ctx->notifier); > WSAEventSelect(node->pfd.fd, event, > @@ -98,6 +101,7 @@ void aio_set_fd_handler(AioContext *ctx, > > void aio_set_event_notifier(AioContext *ctx, > EventNotifier *e, > + bool is_external, > EventNotifierHandler *io_notify) > { > AioHandler *node; > @@ -133,6 +137,7 @@ void aio_set_event_notifier(AioContext *ctx, > node->e = e; > node->pfd.fd = (uintptr_t)event_notifier_get_handle(e); > node->pfd.events = G_IO_IN; > + node->is_external = is_external; > QLIST_INSERT_HEAD(&ctx->aio_handlers, node, node); > > g_source_add_poll(&ctx->source, &node->pfd); > diff --git a/async.c b/async.c > index efce14b..bdc64a3 100644 > --- a/async.c > +++ b/async.c > @@ -247,7 +247,7 @@ aio_ctx_finalize(GSource *source) > } > qemu_mutex_unlock(&ctx->bh_lock); > > - aio_set_event_notifier(ctx, &ctx->notifier, NULL); > + aio_set_event_notifier(ctx, &ctx->notifier, false, NULL); > event_notifier_cleanup(&ctx->notifier); > rfifolock_destroy(&ctx->lock); > qemu_mutex_destroy(&ctx->bh_lock); > @@ -329,6 +329,7 @@ AioContext *aio_context_new(Error **errp) > } > g_source_set_can_recurse(&ctx->source, true); > aio_set_event_notifier(ctx, &ctx->notifier, > + false, > (EventNotifierHandler *) > event_notifier_dummy_cb); > ctx->thread_pool = NULL; > diff --git a/block/curl.c b/block/curl.c > index 032cc8a..8994182 100644 > --- a/block/curl.c > +++ b/block/curl.c > @@ -154,18 +154,20 @@ static int curl_sock_cb(CURL *curl, curl_socket_t fd, int action, > DPRINTF("CURL (AIO): Sock action %d on fd %d\n", action, fd); > switch (action) { > case CURL_POLL_IN: > - aio_set_fd_handler(s->aio_context, fd, curl_multi_read, > - NULL, state); > + aio_set_fd_handler(s->aio_context, fd, false, > + curl_multi_read, NULL, state); > break; > case CURL_POLL_OUT: > - aio_set_fd_handler(s->aio_context, fd, NULL, curl_multi_do, state); > + aio_set_fd_handler(s->aio_context, fd, false, > + NULL, curl_multi_do, state); > break; > case CURL_POLL_INOUT: > - aio_set_fd_handler(s->aio_context, fd, curl_multi_read, > - curl_multi_do, state); > + aio_set_fd_handler(s->aio_context, fd, false, > + curl_multi_read, curl_multi_do, state); > break; > case CURL_POLL_REMOVE: > - aio_set_fd_handler(s->aio_context, fd, NULL, NULL, NULL); > + aio_set_fd_handler(s->aio_context, fd, false, > + NULL, NULL, NULL); > break; > } > > diff --git a/block/iscsi.c b/block/iscsi.c > index 93f1ee4..9a628b7 100644 > --- a/block/iscsi.c > +++ b/block/iscsi.c > @@ -291,8 +291,8 @@ iscsi_set_events(IscsiLun *iscsilun) > int ev = iscsi_which_events(iscsi); > > if (ev != iscsilun->events) { > - aio_set_fd_handler(iscsilun->aio_context, > - iscsi_get_fd(iscsi), > + aio_set_fd_handler(iscsilun->aio_context, iscsi_get_fd(iscsi), > + false, > (ev & POLLIN) ? iscsi_process_read : NULL, > (ev & POLLOUT) ? iscsi_process_write : NULL, > iscsilun); > @@ -1280,9 +1280,8 @@ static void iscsi_detach_aio_context(BlockDriverState *bs) > { > IscsiLun *iscsilun = bs->opaque; > > - aio_set_fd_handler(iscsilun->aio_context, > - iscsi_get_fd(iscsilun->iscsi), > - NULL, NULL, NULL); > + aio_set_fd_handler(iscsilun->aio_context, iscsi_get_fd(iscsilun->iscsi), > + false, NULL, NULL, NULL); > iscsilun->events = 0; > > if (iscsilun->nop_timer) { > diff --git a/block/linux-aio.c b/block/linux-aio.c > index c991443..88b0520 100644 > --- a/block/linux-aio.c > +++ b/block/linux-aio.c > @@ -287,7 +287,7 @@ void laio_detach_aio_context(void *s_, AioContext *old_context) > { > struct qemu_laio_state *s = s_; > > - aio_set_event_notifier(old_context, &s->e, NULL); > + aio_set_event_notifier(old_context, &s->e, false, NULL); > qemu_bh_delete(s->completion_bh); > } > > @@ -296,7 +296,8 @@ void laio_attach_aio_context(void *s_, AioContext *new_context) > struct qemu_laio_state *s = s_; > > s->completion_bh = aio_bh_new(new_context, qemu_laio_completion_bh, s); > - aio_set_event_notifier(new_context, &s->e, qemu_laio_completion_cb); > + aio_set_event_notifier(new_context, &s->e, false, > + qemu_laio_completion_cb); > } > > void *laio_init(void) > diff --git a/block/nbd-client.c b/block/nbd-client.c > index e1bb919..b7fd17a 100644 > --- a/block/nbd-client.c > +++ b/block/nbd-client.c > @@ -124,7 +124,7 @@ static int nbd_co_send_request(BlockDriverState *bs, > s->send_coroutine = qemu_coroutine_self(); > aio_context = bdrv_get_aio_context(bs); > > - aio_set_fd_handler(aio_context, s->sock, > + aio_set_fd_handler(aio_context, s->sock, false, > nbd_reply_ready, nbd_restart_write, bs); > if (qiov) { > if (!s->is_unix) { > @@ -144,7 +144,8 @@ static int nbd_co_send_request(BlockDriverState *bs, > } else { > rc = nbd_send_request(s->sock, request); > } > - aio_set_fd_handler(aio_context, s->sock, nbd_reply_ready, NULL, bs); > + aio_set_fd_handler(aio_context, s->sock, false, > + nbd_reply_ready, NULL, bs); > s->send_coroutine = NULL; > qemu_co_mutex_unlock(&s->send_mutex); > return rc; > @@ -348,14 +349,15 @@ int nbd_client_co_discard(BlockDriverState *bs, int64_t sector_num, > void nbd_client_detach_aio_context(BlockDriverState *bs) > { > aio_set_fd_handler(bdrv_get_aio_context(bs), > - nbd_get_client_session(bs)->sock, NULL, NULL, NULL); > + nbd_get_client_session(bs)->sock, > + false, NULL, NULL, NULL); > } > > void nbd_client_attach_aio_context(BlockDriverState *bs, > AioContext *new_context) > { > aio_set_fd_handler(new_context, nbd_get_client_session(bs)->sock, > - nbd_reply_ready, NULL, bs); > + false, nbd_reply_ready, NULL, bs); > } > > void nbd_client_close(BlockDriverState *bs) > diff --git a/block/nfs.c b/block/nfs.c > index 887a98e..fd79f89 100644 > --- a/block/nfs.c > +++ b/block/nfs.c > @@ -63,11 +63,10 @@ static void nfs_set_events(NFSClient *client) > { > int ev = nfs_which_events(client->context); > if (ev != client->events) { > - aio_set_fd_handler(client->aio_context, > - nfs_get_fd(client->context), > + aio_set_fd_handler(client->aio_context, nfs_get_fd(client->context), > + false, > (ev & POLLIN) ? nfs_process_read : NULL, > - (ev & POLLOUT) ? nfs_process_write : NULL, > - client); > + (ev & POLLOUT) ? nfs_process_write : NULL, client); > > } > client->events = ev; > @@ -242,9 +241,8 @@ static void nfs_detach_aio_context(BlockDriverState *bs) > { > NFSClient *client = bs->opaque; > > - aio_set_fd_handler(client->aio_context, > - nfs_get_fd(client->context), > - NULL, NULL, NULL); > + aio_set_fd_handler(client->aio_context, nfs_get_fd(client->context), > + false, NULL, NULL, NULL); > client->events = 0; > } > > @@ -263,9 +261,8 @@ static void nfs_client_close(NFSClient *client) > if (client->fh) { > nfs_close(client->context, client->fh); > } > - aio_set_fd_handler(client->aio_context, > - nfs_get_fd(client->context), > - NULL, NULL, NULL); > + aio_set_fd_handler(client->aio_context, nfs_get_fd(client->context), > + false, NULL, NULL, NULL); > nfs_destroy_context(client->context); > } > memset(client, 0, sizeof(NFSClient)); > diff --git a/block/sheepdog.c b/block/sheepdog.c > index e7e58b7..d80e4ed 100644 > --- a/block/sheepdog.c > +++ b/block/sheepdog.c > @@ -651,14 +651,16 @@ static coroutine_fn void do_co_req(void *opaque) > unsigned int *rlen = srco->rlen; > > co = qemu_coroutine_self(); > - aio_set_fd_handler(srco->aio_context, sockfd, NULL, restart_co_req, co); > + aio_set_fd_handler(srco->aio_context, sockfd, false, > + NULL, restart_co_req, co); > > ret = send_co_req(sockfd, hdr, data, wlen); > if (ret < 0) { > goto out; > } > > - aio_set_fd_handler(srco->aio_context, sockfd, restart_co_req, NULL, co); > + aio_set_fd_handler(srco->aio_context, sockfd, false, > + restart_co_req, NULL, co); > > ret = qemu_co_recv(sockfd, hdr, sizeof(*hdr)); > if (ret != sizeof(*hdr)) { > @@ -683,7 +685,8 @@ static coroutine_fn void do_co_req(void *opaque) > out: > /* there is at most one request for this sockfd, so it is safe to > * set each handler to NULL. */ > - aio_set_fd_handler(srco->aio_context, sockfd, NULL, NULL, NULL); > + aio_set_fd_handler(srco->aio_context, sockfd, false, > + NULL, NULL, NULL); > > srco->ret = ret; > srco->finished = true; > @@ -735,7 +738,8 @@ static coroutine_fn void reconnect_to_sdog(void *opaque) > BDRVSheepdogState *s = opaque; > AIOReq *aio_req, *next; > > - aio_set_fd_handler(s->aio_context, s->fd, NULL, NULL, NULL); > + aio_set_fd_handler(s->aio_context, s->fd, false, NULL, > + NULL, NULL); > close(s->fd); > s->fd = -1; > > @@ -938,7 +942,8 @@ static int get_sheep_fd(BDRVSheepdogState *s, Error **errp) > return fd; > } > > - aio_set_fd_handler(s->aio_context, fd, co_read_response, NULL, s); > + aio_set_fd_handler(s->aio_context, fd, false, > + co_read_response, NULL, s); > return fd; > } > > @@ -1199,7 +1204,7 @@ static void coroutine_fn add_aio_request(BDRVSheepdogState *s, AIOReq *aio_req, > > qemu_co_mutex_lock(&s->lock); > s->co_send = qemu_coroutine_self(); > - aio_set_fd_handler(s->aio_context, s->fd, > + aio_set_fd_handler(s->aio_context, s->fd, false, > co_read_response, co_write_request, s); > socket_set_cork(s->fd, 1); > > @@ -1218,7 +1223,8 @@ static void coroutine_fn add_aio_request(BDRVSheepdogState *s, AIOReq *aio_req, > } > out: > socket_set_cork(s->fd, 0); > - aio_set_fd_handler(s->aio_context, s->fd, co_read_response, NULL, s); > + aio_set_fd_handler(s->aio_context, s->fd, false, > + co_read_response, NULL, s); > s->co_send = NULL; > qemu_co_mutex_unlock(&s->lock); > } > @@ -1368,7 +1374,8 @@ static void sd_detach_aio_context(BlockDriverState *bs) > { > BDRVSheepdogState *s = bs->opaque; > > - aio_set_fd_handler(s->aio_context, s->fd, NULL, NULL, NULL); > + aio_set_fd_handler(s->aio_context, s->fd, false, NULL, > + NULL, NULL); > } > > static void sd_attach_aio_context(BlockDriverState *bs, > @@ -1377,7 +1384,8 @@ static void sd_attach_aio_context(BlockDriverState *bs, > BDRVSheepdogState *s = bs->opaque; > > s->aio_context = new_context; > - aio_set_fd_handler(new_context, s->fd, co_read_response, NULL, s); > + aio_set_fd_handler(new_context, s->fd, false, > + co_read_response, NULL, s); > } > > /* TODO Convert to fine grained options */ > @@ -1490,7 +1498,8 @@ static int sd_open(BlockDriverState *bs, QDict *options, int flags, > g_free(buf); > return 0; > out: > - aio_set_fd_handler(bdrv_get_aio_context(bs), s->fd, NULL, NULL, NULL); > + aio_set_fd_handler(bdrv_get_aio_context(bs), s->fd, > + false, NULL, NULL, NULL); > if (s->fd >= 0) { > closesocket(s->fd); > } > @@ -1528,7 +1537,8 @@ static void sd_reopen_commit(BDRVReopenState *state) > BDRVSheepdogState *s = state->bs->opaque; > > if (s->fd) { > - aio_set_fd_handler(s->aio_context, s->fd, NULL, NULL, NULL); > + aio_set_fd_handler(s->aio_context, s->fd, false, > + NULL, NULL, NULL); > closesocket(s->fd); > } > > @@ -1551,7 +1561,8 @@ static void sd_reopen_abort(BDRVReopenState *state) > } > > if (re_s->fd) { > - aio_set_fd_handler(s->aio_context, re_s->fd, NULL, NULL, NULL); > + aio_set_fd_handler(s->aio_context, re_s->fd, false, > + NULL, NULL, NULL); > closesocket(re_s->fd); > } > > @@ -1935,7 +1946,8 @@ static void sd_close(BlockDriverState *bs) > error_report("%s, %s", sd_strerror(rsp->result), s->name); > } > > - aio_set_fd_handler(bdrv_get_aio_context(bs), s->fd, NULL, NULL, NULL); > + aio_set_fd_handler(bdrv_get_aio_context(bs), s->fd, > + false, NULL, NULL, NULL); > closesocket(s->fd); > g_free(s->host_spec); > } > diff --git a/block/ssh.c b/block/ssh.c > index d35b51f..af025c0 100644 > --- a/block/ssh.c > +++ b/block/ssh.c > @@ -800,14 +800,15 @@ static coroutine_fn void set_fd_handler(BDRVSSHState *s, BlockDriverState *bs) > rd_handler, wr_handler); > > aio_set_fd_handler(bdrv_get_aio_context(bs), s->sock, > - rd_handler, wr_handler, co); > + false, rd_handler, wr_handler, co); > } > > static coroutine_fn void clear_fd_handler(BDRVSSHState *s, > BlockDriverState *bs) > { > DPRINTF("s->sock=%d", s->sock); > - aio_set_fd_handler(bdrv_get_aio_context(bs), s->sock, NULL, NULL, NULL); > + aio_set_fd_handler(bdrv_get_aio_context(bs), s->sock, > + false, NULL, NULL, NULL); > } > > /* A non-blocking call returned EAGAIN, so yield, ensuring the > diff --git a/block/win32-aio.c b/block/win32-aio.c > index 64e8682..bbf2f01 100644 > --- a/block/win32-aio.c > +++ b/block/win32-aio.c > @@ -174,7 +174,7 @@ int win32_aio_attach(QEMUWin32AIOState *aio, HANDLE hfile) > void win32_aio_detach_aio_context(QEMUWin32AIOState *aio, > AioContext *old_context) > { > - aio_set_event_notifier(old_context, &aio->e, NULL); > + aio_set_event_notifier(old_context, &aio->e, false, NULL); > aio->is_aio_context_attached = false; > } > > @@ -182,7 +182,8 @@ void win32_aio_attach_aio_context(QEMUWin32AIOState *aio, > AioContext *new_context) > { > aio->is_aio_context_attached = true; > - aio_set_event_notifier(new_context, &aio->e, win32_aio_completion_cb); > + aio_set_event_notifier(new_context, &aio->e, false, > + win32_aio_completion_cb); > } > > QEMUWin32AIOState *win32_aio_init(void) > diff --git a/hw/block/dataplane/virtio-blk.c b/hw/block/dataplane/virtio-blk.c > index 6106e46..f8716bc 100644 > --- a/hw/block/dataplane/virtio-blk.c > +++ b/hw/block/dataplane/virtio-blk.c > @@ -283,7 +283,8 @@ void virtio_blk_data_plane_start(VirtIOBlockDataPlane *s) > > /* Get this show started by hooking up our callbacks */ > aio_context_acquire(s->ctx); > - aio_set_event_notifier(s->ctx, &s->host_notifier, handle_notify); > + aio_set_event_notifier(s->ctx, &s->host_notifier, false, > + handle_notify); > aio_context_release(s->ctx); > return; > > @@ -319,7 +320,8 @@ void virtio_blk_data_plane_stop(VirtIOBlockDataPlane *s) > aio_context_acquire(s->ctx); > > /* Stop notifications for new requests from guest */ > - aio_set_event_notifier(s->ctx, &s->host_notifier, NULL); > + aio_set_event_notifier(s->ctx, &s->host_notifier, false, > + NULL); > > /* Drain and switch bs back to the QEMU main loop */ > blk_set_aio_context(s->conf->conf.blk, qemu_get_aio_context()); > diff --git a/hw/scsi/virtio-scsi-dataplane.c b/hw/scsi/virtio-scsi-dataplane.c > index 1248fd9..21f51df 100644 > --- a/hw/scsi/virtio-scsi-dataplane.c > +++ b/hw/scsi/virtio-scsi-dataplane.c > @@ -60,7 +60,8 @@ static VirtIOSCSIVring *virtio_scsi_vring_init(VirtIOSCSI *s, > r = g_new(VirtIOSCSIVring, 1); > r->host_notifier = *virtio_queue_get_host_notifier(vq); > r->guest_notifier = *virtio_queue_get_guest_notifier(vq); > - aio_set_event_notifier(s->ctx, &r->host_notifier, handler); > + aio_set_event_notifier(s->ctx, &r->host_notifier, false, > + handler); > > r->parent = s; > > @@ -71,7 +72,8 @@ static VirtIOSCSIVring *virtio_scsi_vring_init(VirtIOSCSI *s, > return r; > > fail_vring: > - aio_set_event_notifier(s->ctx, &r->host_notifier, NULL); > + aio_set_event_notifier(s->ctx, &r->host_notifier, false, > + NULL); > k->set_host_notifier(qbus->parent, n, false); > g_free(r); > return NULL; > @@ -162,14 +164,17 @@ static void virtio_scsi_clear_aio(VirtIOSCSI *s) > int i; > > if (s->ctrl_vring) { > - aio_set_event_notifier(s->ctx, &s->ctrl_vring->host_notifier, NULL); > + aio_set_event_notifier(s->ctx, &s->ctrl_vring->host_notifier, > + false, NULL); > } > if (s->event_vring) { > - aio_set_event_notifier(s->ctx, &s->event_vring->host_notifier, NULL); > + aio_set_event_notifier(s->ctx, &s->event_vring->host_notifier, > + false, NULL); > } > if (s->cmd_vrings) { > for (i = 0; i < vs->conf.num_queues && s->cmd_vrings[i]; i++) { > - aio_set_event_notifier(s->ctx, &s->cmd_vrings[i]->host_notifier, NULL); > + aio_set_event_notifier(s->ctx, &s->cmd_vrings[i]->host_notifier, > + false, NULL); > } > } > } > @@ -290,10 +295,13 @@ void virtio_scsi_dataplane_stop(VirtIOSCSI *s) > > aio_context_acquire(s->ctx); > > - aio_set_event_notifier(s->ctx, &s->ctrl_vring->host_notifier, NULL); > - aio_set_event_notifier(s->ctx, &s->event_vring->host_notifier, NULL); > + aio_set_event_notifier(s->ctx, &s->ctrl_vring->host_notifier, > + false, NULL); > + aio_set_event_notifier(s->ctx, &s->event_vring->host_notifier, > + false, NULL); > for (i = 0; i < vs->conf.num_queues; i++) { > - aio_set_event_notifier(s->ctx, &s->cmd_vrings[i]->host_notifier, NULL); > + aio_set_event_notifier(s->ctx, &s->cmd_vrings[i]->host_notifier, > + false, NULL); > } > > blk_drain_all(); /* ensure there are no in-flight requests */ > diff --git a/include/block/aio.h b/include/block/aio.h > index 400b1b0..12f1141 100644 > --- a/include/block/aio.h > +++ b/include/block/aio.h > @@ -299,6 +299,7 @@ bool aio_poll(AioContext *ctx, bool blocking); > */ > void aio_set_fd_handler(AioContext *ctx, > int fd, > + bool is_external, > IOHandler *io_read, > IOHandler *io_write, > void *opaque); > @@ -312,6 +313,7 @@ void aio_set_fd_handler(AioContext *ctx, > */ > void aio_set_event_notifier(AioContext *ctx, > EventNotifier *notifier, > + bool is_external, > EventNotifierHandler *io_read); > > /* Return a GSource that lets the main loop poll the file descriptors attached > diff --git a/iohandler.c b/iohandler.c > index 55f8501..eb68083 100644 > --- a/iohandler.c > +++ b/iohandler.c > @@ -55,7 +55,8 @@ void qemu_set_fd_handler(int fd, > void *opaque) > { > iohandler_init(); > - aio_set_fd_handler(iohandler_ctx, fd, fd_read, fd_write, opaque); > + aio_set_fd_handler(iohandler_ctx, fd, false, > + fd_read, fd_write, opaque); > } > > /* reaping of zombies. right now we're not passing the status to > diff --git a/nbd.c b/nbd.c > index 74859cb..fbc66be 100644 > --- a/nbd.c > +++ b/nbd.c > @@ -1446,6 +1446,7 @@ static void nbd_set_handlers(NBDClient *client) > { > if (client->exp && client->exp->ctx) { > aio_set_fd_handler(client->exp->ctx, client->sock, > + false, > client->can_read ? nbd_read : NULL, > client->send_coroutine ? nbd_restart_write : NULL, > client); > @@ -1455,7 +1456,8 @@ static void nbd_set_handlers(NBDClient *client) > static void nbd_unset_handlers(NBDClient *client) > { > if (client->exp && client->exp->ctx) { > - aio_set_fd_handler(client->exp->ctx, client->sock, NULL, NULL, NULL); > + aio_set_fd_handler(client->exp->ctx, client->sock, > + false, NULL, NULL, NULL); > } > } > > diff --git a/tests/test-aio.c b/tests/test-aio.c > index 217e337..03cd45d 100644 > --- a/tests/test-aio.c > +++ b/tests/test-aio.c > @@ -118,6 +118,12 @@ static void *test_acquire_thread(void *opaque) > return NULL; > } > > +static void set_event_notifier(AioContext *ctx, EventNotifier *notifier, > + EventNotifierHandler *handler) > +{ > + aio_set_event_notifier(ctx, notifier, false, handler); > +} > + > static void dummy_notifier_read(EventNotifier *unused) > { > g_assert(false); /* should never be invoked */ > @@ -131,7 +137,7 @@ static void test_acquire(void) > > /* Dummy event notifier ensures aio_poll() will block */ > event_notifier_init(¬ifier, false); > - aio_set_event_notifier(ctx, ¬ifier, dummy_notifier_read); > + set_event_notifier(ctx, ¬ifier, dummy_notifier_read); > g_assert(!aio_poll(ctx, false)); /* consume aio_notify() */ > > qemu_mutex_init(&data.start_lock); > @@ -149,7 +155,7 @@ static void test_acquire(void) > aio_context_release(ctx); > > qemu_thread_join(&thread); > - aio_set_event_notifier(ctx, ¬ifier, NULL); > + set_event_notifier(ctx, ¬ifier, NULL); > event_notifier_cleanup(¬ifier); > > g_assert(data.thread_acquired); > @@ -308,11 +314,11 @@ static void test_set_event_notifier(void) > { > EventNotifierTestData data = { .n = 0, .active = 0 }; > event_notifier_init(&data.e, false); > - aio_set_event_notifier(ctx, &data.e, event_ready_cb); > + set_event_notifier(ctx, &data.e, event_ready_cb); > g_assert(!aio_poll(ctx, false)); > g_assert_cmpint(data.n, ==, 0); > > - aio_set_event_notifier(ctx, &data.e, NULL); > + set_event_notifier(ctx, &data.e, NULL); > g_assert(!aio_poll(ctx, false)); > g_assert_cmpint(data.n, ==, 0); > event_notifier_cleanup(&data.e); > @@ -322,7 +328,7 @@ static void test_wait_event_notifier(void) > { > EventNotifierTestData data = { .n = 0, .active = 1 }; > event_notifier_init(&data.e, false); > - aio_set_event_notifier(ctx, &data.e, event_ready_cb); > + set_event_notifier(ctx, &data.e, event_ready_cb); > while (aio_poll(ctx, false)); > g_assert_cmpint(data.n, ==, 0); > g_assert_cmpint(data.active, ==, 1); > @@ -336,7 +342,7 @@ static void test_wait_event_notifier(void) > g_assert_cmpint(data.n, ==, 1); > g_assert_cmpint(data.active, ==, 0); > > - aio_set_event_notifier(ctx, &data.e, NULL); > + set_event_notifier(ctx, &data.e, NULL); > g_assert(!aio_poll(ctx, false)); > g_assert_cmpint(data.n, ==, 1); > > @@ -347,7 +353,7 @@ static void test_flush_event_notifier(void) > { > EventNotifierTestData data = { .n = 0, .active = 10, .auto_set = true }; > event_notifier_init(&data.e, false); > - aio_set_event_notifier(ctx, &data.e, event_ready_cb); > + set_event_notifier(ctx, &data.e, event_ready_cb); > while (aio_poll(ctx, false)); > g_assert_cmpint(data.n, ==, 0); > g_assert_cmpint(data.active, ==, 10); > @@ -363,7 +369,7 @@ static void test_flush_event_notifier(void) > g_assert_cmpint(data.active, ==, 0); > g_assert(!aio_poll(ctx, false)); > > - aio_set_event_notifier(ctx, &data.e, NULL); > + set_event_notifier(ctx, &data.e, NULL); > g_assert(!aio_poll(ctx, false)); > event_notifier_cleanup(&data.e); > } > @@ -374,7 +380,7 @@ static void test_wait_event_notifier_noflush(void) > EventNotifierTestData dummy = { .n = 0, .active = 1 }; > > event_notifier_init(&data.e, false); > - aio_set_event_notifier(ctx, &data.e, event_ready_cb); > + set_event_notifier(ctx, &data.e, event_ready_cb); > > g_assert(!aio_poll(ctx, false)); > g_assert_cmpint(data.n, ==, 0); > @@ -387,7 +393,7 @@ static void test_wait_event_notifier_noflush(void) > > /* An active event notifier forces aio_poll to look at EventNotifiers. */ > event_notifier_init(&dummy.e, false); > - aio_set_event_notifier(ctx, &dummy.e, event_ready_cb); > + set_event_notifier(ctx, &dummy.e, event_ready_cb); > > event_notifier_set(&data.e); > g_assert(aio_poll(ctx, false)); > @@ -407,10 +413,10 @@ static void test_wait_event_notifier_noflush(void) > g_assert_cmpint(dummy.n, ==, 1); > g_assert_cmpint(dummy.active, ==, 0); > > - aio_set_event_notifier(ctx, &dummy.e, NULL); > + set_event_notifier(ctx, &dummy.e, NULL); > event_notifier_cleanup(&dummy.e); > > - aio_set_event_notifier(ctx, &data.e, NULL); > + set_event_notifier(ctx, &data.e, NULL); > g_assert(!aio_poll(ctx, false)); > g_assert_cmpint(data.n, ==, 2); > > @@ -428,7 +434,7 @@ static void test_timer_schedule(void) > * an fd to wait on. Fixing this breaks other tests. So create a dummy one. > */ > event_notifier_init(&e, false); > - aio_set_event_notifier(ctx, &e, dummy_io_handler_read); > + set_event_notifier(ctx, &e, dummy_io_handler_read); > aio_poll(ctx, false); > > aio_timer_init(ctx, &data.timer, data.clock_type, > @@ -467,7 +473,7 @@ static void test_timer_schedule(void) > g_assert(!aio_poll(ctx, false)); > g_assert_cmpint(data.n, ==, 2); > > - aio_set_event_notifier(ctx, &e, NULL); > + set_event_notifier(ctx, &e, NULL); > event_notifier_cleanup(&e); > > timer_del(&data.timer); > @@ -638,11 +644,11 @@ static void test_source_set_event_notifier(void) > { > EventNotifierTestData data = { .n = 0, .active = 0 }; > event_notifier_init(&data.e, false); > - aio_set_event_notifier(ctx, &data.e, event_ready_cb); > + set_event_notifier(ctx, &data.e, event_ready_cb); > while (g_main_context_iteration(NULL, false)); > g_assert_cmpint(data.n, ==, 0); > > - aio_set_event_notifier(ctx, &data.e, NULL); > + set_event_notifier(ctx, &data.e, NULL); > while (g_main_context_iteration(NULL, false)); > g_assert_cmpint(data.n, ==, 0); > event_notifier_cleanup(&data.e); > @@ -652,7 +658,7 @@ static void test_source_wait_event_notifier(void) > { > EventNotifierTestData data = { .n = 0, .active = 1 }; > event_notifier_init(&data.e, false); > - aio_set_event_notifier(ctx, &data.e, event_ready_cb); > + set_event_notifier(ctx, &data.e, event_ready_cb); > while (g_main_context_iteration(NULL, false)); > g_assert_cmpint(data.n, ==, 0); > g_assert_cmpint(data.active, ==, 1); > @@ -666,7 +672,7 @@ static void test_source_wait_event_notifier(void) > g_assert_cmpint(data.n, ==, 1); > g_assert_cmpint(data.active, ==, 0); > > - aio_set_event_notifier(ctx, &data.e, NULL); > + set_event_notifier(ctx, &data.e, NULL); > while (g_main_context_iteration(NULL, false)); > g_assert_cmpint(data.n, ==, 1); > > @@ -677,7 +683,7 @@ static void test_source_flush_event_notifier(void) > { > EventNotifierTestData data = { .n = 0, .active = 10, .auto_set = true }; > event_notifier_init(&data.e, false); > - aio_set_event_notifier(ctx, &data.e, event_ready_cb); > + set_event_notifier(ctx, &data.e, event_ready_cb); > while (g_main_context_iteration(NULL, false)); > g_assert_cmpint(data.n, ==, 0); > g_assert_cmpint(data.active, ==, 10); > @@ -693,7 +699,7 @@ static void test_source_flush_event_notifier(void) > g_assert_cmpint(data.active, ==, 0); > g_assert(!g_main_context_iteration(NULL, false)); > > - aio_set_event_notifier(ctx, &data.e, NULL); > + set_event_notifier(ctx, &data.e, NULL); > while (g_main_context_iteration(NULL, false)); > event_notifier_cleanup(&data.e); > } > @@ -704,7 +710,7 @@ static void test_source_wait_event_notifier_noflush(void) > EventNotifierTestData dummy = { .n = 0, .active = 1 }; > > event_notifier_init(&data.e, false); > - aio_set_event_notifier(ctx, &data.e, event_ready_cb); > + set_event_notifier(ctx, &data.e, event_ready_cb); > > while (g_main_context_iteration(NULL, false)); > g_assert_cmpint(data.n, ==, 0); > @@ -717,7 +723,7 @@ static void test_source_wait_event_notifier_noflush(void) > > /* An active event notifier forces aio_poll to look at EventNotifiers. */ > event_notifier_init(&dummy.e, false); > - aio_set_event_notifier(ctx, &dummy.e, event_ready_cb); > + set_event_notifier(ctx, &dummy.e, event_ready_cb); > > event_notifier_set(&data.e); > g_assert(g_main_context_iteration(NULL, false)); > @@ -737,10 +743,10 @@ static void test_source_wait_event_notifier_noflush(void) > g_assert_cmpint(dummy.n, ==, 1); > g_assert_cmpint(dummy.active, ==, 0); > > - aio_set_event_notifier(ctx, &dummy.e, NULL); > + set_event_notifier(ctx, &dummy.e, NULL); > event_notifier_cleanup(&dummy.e); > > - aio_set_event_notifier(ctx, &data.e, NULL); > + set_event_notifier(ctx, &data.e, NULL); > while (g_main_context_iteration(NULL, false)); > g_assert_cmpint(data.n, ==, 2); > > @@ -759,7 +765,7 @@ static void test_source_timer_schedule(void) > * an fd to wait on. Fixing this breaks other tests. So create a dummy one. > */ > event_notifier_init(&e, false); > - aio_set_event_notifier(ctx, &e, dummy_io_handler_read); > + set_event_notifier(ctx, &e, dummy_io_handler_read); > do {} while (g_main_context_iteration(NULL, false)); > > aio_timer_init(ctx, &data.timer, data.clock_type, > @@ -784,7 +790,7 @@ static void test_source_timer_schedule(void) > g_assert_cmpint(data.n, ==, 2); > g_assert(qemu_clock_get_ns(data.clock_type) > expiry); > > - aio_set_event_notifier(ctx, &e, NULL); > + set_event_notifier(ctx, &e, NULL); > event_notifier_cleanup(&e); > > timer_del(&data.timer); > -- > 2.4.3 > >