aio: Add "is_external" flag for event handlers

All callers pass in false, and the real external ones will switch to
true in coming patches.

Signed-off-by: Fam Zheng <famz@redhat.com>
Reviewed-by: Jeff Cody <jcody@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Fam Zheng 2015-10-23 11:08:05 +08:00 committed by Kevin Wolf
parent d87d01e16a
commit dca21ef23b
17 changed files with 130 additions and 84 deletions

View file

@ -25,6 +25,7 @@ struct AioHandler
IOHandler *io_write; IOHandler *io_write;
int deleted; int deleted;
void *opaque; void *opaque;
bool is_external;
QLIST_ENTRY(AioHandler) node; QLIST_ENTRY(AioHandler) node;
}; };
@ -43,6 +44,7 @@ static AioHandler *find_aio_handler(AioContext *ctx, int fd)
void aio_set_fd_handler(AioContext *ctx, void aio_set_fd_handler(AioContext *ctx,
int fd, int fd,
bool is_external,
IOHandler *io_read, IOHandler *io_read,
IOHandler *io_write, IOHandler *io_write,
void *opaque) void *opaque)
@ -82,6 +84,7 @@ void aio_set_fd_handler(AioContext *ctx,
node->io_read = io_read; node->io_read = io_read;
node->io_write = io_write; node->io_write = io_write;
node->opaque = opaque; 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_read ? G_IO_IN | G_IO_HUP | G_IO_ERR : 0);
node->pfd.events |= (io_write ? G_IO_OUT | 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, void aio_set_event_notifier(AioContext *ctx,
EventNotifier *notifier, EventNotifier *notifier,
bool is_external,
EventNotifierHandler *io_read) EventNotifierHandler *io_read)
{ {
aio_set_fd_handler(ctx, event_notifier_get_fd(notifier), 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) bool aio_prepare(AioContext *ctx)

View file

@ -28,11 +28,13 @@ struct AioHandler {
GPollFD pfd; GPollFD pfd;
int deleted; int deleted;
void *opaque; void *opaque;
bool is_external;
QLIST_ENTRY(AioHandler) node; QLIST_ENTRY(AioHandler) node;
}; };
void aio_set_fd_handler(AioContext *ctx, void aio_set_fd_handler(AioContext *ctx,
int fd, int fd,
bool is_external,
IOHandler *io_read, IOHandler *io_read,
IOHandler *io_write, IOHandler *io_write,
void *opaque) void *opaque)
@ -86,6 +88,7 @@ void aio_set_fd_handler(AioContext *ctx,
node->opaque = opaque; node->opaque = opaque;
node->io_read = io_read; node->io_read = io_read;
node->io_write = io_write; node->io_write = io_write;
node->is_external = is_external;
event = event_notifier_get_handle(&ctx->notifier); event = event_notifier_get_handle(&ctx->notifier);
WSAEventSelect(node->pfd.fd, event, WSAEventSelect(node->pfd.fd, event,
@ -98,6 +101,7 @@ void aio_set_fd_handler(AioContext *ctx,
void aio_set_event_notifier(AioContext *ctx, void aio_set_event_notifier(AioContext *ctx,
EventNotifier *e, EventNotifier *e,
bool is_external,
EventNotifierHandler *io_notify) EventNotifierHandler *io_notify)
{ {
AioHandler *node; AioHandler *node;
@ -133,6 +137,7 @@ void aio_set_event_notifier(AioContext *ctx,
node->e = e; node->e = e;
node->pfd.fd = (uintptr_t)event_notifier_get_handle(e); node->pfd.fd = (uintptr_t)event_notifier_get_handle(e);
node->pfd.events = G_IO_IN; node->pfd.events = G_IO_IN;
node->is_external = is_external;
QLIST_INSERT_HEAD(&ctx->aio_handlers, node, node); QLIST_INSERT_HEAD(&ctx->aio_handlers, node, node);
g_source_add_poll(&ctx->source, &node->pfd); g_source_add_poll(&ctx->source, &node->pfd);

View file

@ -247,7 +247,7 @@ aio_ctx_finalize(GSource *source)
} }
qemu_mutex_unlock(&ctx->bh_lock); 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); event_notifier_cleanup(&ctx->notifier);
rfifolock_destroy(&ctx->lock); rfifolock_destroy(&ctx->lock);
qemu_mutex_destroy(&ctx->bh_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); g_source_set_can_recurse(&ctx->source, true);
aio_set_event_notifier(ctx, &ctx->notifier, aio_set_event_notifier(ctx, &ctx->notifier,
false,
(EventNotifierHandler *) (EventNotifierHandler *)
event_notifier_dummy_cb); event_notifier_dummy_cb);
ctx->thread_pool = NULL; ctx->thread_pool = NULL;

View file

@ -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); DPRINTF("CURL (AIO): Sock action %d on fd %d\n", action, fd);
switch (action) { switch (action) {
case CURL_POLL_IN: case CURL_POLL_IN:
aio_set_fd_handler(s->aio_context, fd, curl_multi_read, aio_set_fd_handler(s->aio_context, fd, false,
NULL, state); curl_multi_read, NULL, state);
break; break;
case CURL_POLL_OUT: 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; break;
case CURL_POLL_INOUT: case CURL_POLL_INOUT:
aio_set_fd_handler(s->aio_context, fd, curl_multi_read, aio_set_fd_handler(s->aio_context, fd, false,
curl_multi_do, state); curl_multi_read, curl_multi_do, state);
break; break;
case CURL_POLL_REMOVE: 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; break;
} }

View file

@ -291,8 +291,8 @@ iscsi_set_events(IscsiLun *iscsilun)
int ev = iscsi_which_events(iscsi); int ev = iscsi_which_events(iscsi);
if (ev != iscsilun->events) { if (ev != iscsilun->events) {
aio_set_fd_handler(iscsilun->aio_context, aio_set_fd_handler(iscsilun->aio_context, iscsi_get_fd(iscsi),
iscsi_get_fd(iscsi), false,
(ev & POLLIN) ? iscsi_process_read : NULL, (ev & POLLIN) ? iscsi_process_read : NULL,
(ev & POLLOUT) ? iscsi_process_write : NULL, (ev & POLLOUT) ? iscsi_process_write : NULL,
iscsilun); iscsilun);
@ -1280,9 +1280,8 @@ static void iscsi_detach_aio_context(BlockDriverState *bs)
{ {
IscsiLun *iscsilun = bs->opaque; IscsiLun *iscsilun = bs->opaque;
aio_set_fd_handler(iscsilun->aio_context, aio_set_fd_handler(iscsilun->aio_context, iscsi_get_fd(iscsilun->iscsi),
iscsi_get_fd(iscsilun->iscsi), false, NULL, NULL, NULL);
NULL, NULL, NULL);
iscsilun->events = 0; iscsilun->events = 0;
if (iscsilun->nop_timer) { if (iscsilun->nop_timer) {

View file

@ -287,7 +287,7 @@ void laio_detach_aio_context(void *s_, AioContext *old_context)
{ {
struct qemu_laio_state *s = s_; 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); 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_; struct qemu_laio_state *s = s_;
s->completion_bh = aio_bh_new(new_context, qemu_laio_completion_bh, 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) void *laio_init(void)

View file

@ -124,7 +124,7 @@ static int nbd_co_send_request(BlockDriverState *bs,
s->send_coroutine = qemu_coroutine_self(); s->send_coroutine = qemu_coroutine_self();
aio_context = bdrv_get_aio_context(bs); 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); nbd_reply_ready, nbd_restart_write, bs);
if (qiov) { if (qiov) {
if (!s->is_unix) { if (!s->is_unix) {
@ -144,7 +144,8 @@ static int nbd_co_send_request(BlockDriverState *bs,
} else { } else {
rc = nbd_send_request(s->sock, request); 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; s->send_coroutine = NULL;
qemu_co_mutex_unlock(&s->send_mutex); qemu_co_mutex_unlock(&s->send_mutex);
return rc; 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) void nbd_client_detach_aio_context(BlockDriverState *bs)
{ {
aio_set_fd_handler(bdrv_get_aio_context(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, void nbd_client_attach_aio_context(BlockDriverState *bs,
AioContext *new_context) AioContext *new_context)
{ {
aio_set_fd_handler(new_context, nbd_get_client_session(bs)->sock, 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) void nbd_client_close(BlockDriverState *bs)

View file

@ -63,11 +63,10 @@ static void nfs_set_events(NFSClient *client)
{ {
int ev = nfs_which_events(client->context); int ev = nfs_which_events(client->context);
if (ev != client->events) { if (ev != client->events) {
aio_set_fd_handler(client->aio_context, aio_set_fd_handler(client->aio_context, nfs_get_fd(client->context),
nfs_get_fd(client->context), false,
(ev & POLLIN) ? nfs_process_read : NULL, (ev & POLLIN) ? nfs_process_read : NULL,
(ev & POLLOUT) ? nfs_process_write : NULL, (ev & POLLOUT) ? nfs_process_write : NULL, client);
client);
} }
client->events = ev; client->events = ev;
@ -242,9 +241,8 @@ static void nfs_detach_aio_context(BlockDriverState *bs)
{ {
NFSClient *client = bs->opaque; NFSClient *client = bs->opaque;
aio_set_fd_handler(client->aio_context, aio_set_fd_handler(client->aio_context, nfs_get_fd(client->context),
nfs_get_fd(client->context), false, NULL, NULL, NULL);
NULL, NULL, NULL);
client->events = 0; client->events = 0;
} }
@ -263,9 +261,8 @@ static void nfs_client_close(NFSClient *client)
if (client->fh) { if (client->fh) {
nfs_close(client->context, client->fh); nfs_close(client->context, client->fh);
} }
aio_set_fd_handler(client->aio_context, aio_set_fd_handler(client->aio_context, nfs_get_fd(client->context),
nfs_get_fd(client->context), false, NULL, NULL, NULL);
NULL, NULL, NULL);
nfs_destroy_context(client->context); nfs_destroy_context(client->context);
} }
memset(client, 0, sizeof(NFSClient)); memset(client, 0, sizeof(NFSClient));

View file

@ -651,14 +651,16 @@ static coroutine_fn void do_co_req(void *opaque)
unsigned int *rlen = srco->rlen; unsigned int *rlen = srco->rlen;
co = qemu_coroutine_self(); 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); ret = send_co_req(sockfd, hdr, data, wlen);
if (ret < 0) { if (ret < 0) {
goto out; 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)); ret = qemu_co_recv(sockfd, hdr, sizeof(*hdr));
if (ret != sizeof(*hdr)) { if (ret != sizeof(*hdr)) {
@ -683,7 +685,8 @@ static coroutine_fn void do_co_req(void *opaque)
out: out:
/* there is at most one request for this sockfd, so it is safe to /* there is at most one request for this sockfd, so it is safe to
* set each handler to NULL. */ * 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->ret = ret;
srco->finished = true; srco->finished = true;
@ -735,7 +738,8 @@ static coroutine_fn void reconnect_to_sdog(void *opaque)
BDRVSheepdogState *s = opaque; BDRVSheepdogState *s = opaque;
AIOReq *aio_req, *next; 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); close(s->fd);
s->fd = -1; s->fd = -1;
@ -938,7 +942,8 @@ static int get_sheep_fd(BDRVSheepdogState *s, Error **errp)
return fd; 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; return fd;
} }
@ -1199,7 +1204,7 @@ static void coroutine_fn add_aio_request(BDRVSheepdogState *s, AIOReq *aio_req,
qemu_co_mutex_lock(&s->lock); qemu_co_mutex_lock(&s->lock);
s->co_send = qemu_coroutine_self(); 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); co_read_response, co_write_request, s);
socket_set_cork(s->fd, 1); socket_set_cork(s->fd, 1);
@ -1218,7 +1223,8 @@ static void coroutine_fn add_aio_request(BDRVSheepdogState *s, AIOReq *aio_req,
} }
out: out:
socket_set_cork(s->fd, 0); 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; s->co_send = NULL;
qemu_co_mutex_unlock(&s->lock); qemu_co_mutex_unlock(&s->lock);
} }
@ -1368,7 +1374,8 @@ static void sd_detach_aio_context(BlockDriverState *bs)
{ {
BDRVSheepdogState *s = bs->opaque; 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, static void sd_attach_aio_context(BlockDriverState *bs,
@ -1377,7 +1384,8 @@ static void sd_attach_aio_context(BlockDriverState *bs,
BDRVSheepdogState *s = bs->opaque; BDRVSheepdogState *s = bs->opaque;
s->aio_context = new_context; 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 */ /* TODO Convert to fine grained options */
@ -1490,7 +1498,8 @@ static int sd_open(BlockDriverState *bs, QDict *options, int flags,
g_free(buf); g_free(buf);
return 0; return 0;
out: 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) { if (s->fd >= 0) {
closesocket(s->fd); closesocket(s->fd);
} }
@ -1528,7 +1537,8 @@ static void sd_reopen_commit(BDRVReopenState *state)
BDRVSheepdogState *s = state->bs->opaque; BDRVSheepdogState *s = state->bs->opaque;
if (s->fd) { 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); closesocket(s->fd);
} }
@ -1551,7 +1561,8 @@ static void sd_reopen_abort(BDRVReopenState *state)
} }
if (re_s->fd) { 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); closesocket(re_s->fd);
} }
@ -1935,7 +1946,8 @@ static void sd_close(BlockDriverState *bs)
error_report("%s, %s", sd_strerror(rsp->result), s->name); 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); closesocket(s->fd);
g_free(s->host_spec); g_free(s->host_spec);
} }

View file

@ -800,14 +800,15 @@ static coroutine_fn void set_fd_handler(BDRVSSHState *s, BlockDriverState *bs)
rd_handler, wr_handler); rd_handler, wr_handler);
aio_set_fd_handler(bdrv_get_aio_context(bs), s->sock, 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, static coroutine_fn void clear_fd_handler(BDRVSSHState *s,
BlockDriverState *bs) BlockDriverState *bs)
{ {
DPRINTF("s->sock=%d", s->sock); 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 /* A non-blocking call returned EAGAIN, so yield, ensuring the

View file

@ -174,7 +174,7 @@ int win32_aio_attach(QEMUWin32AIOState *aio, HANDLE hfile)
void win32_aio_detach_aio_context(QEMUWin32AIOState *aio, void win32_aio_detach_aio_context(QEMUWin32AIOState *aio,
AioContext *old_context) 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; aio->is_aio_context_attached = false;
} }
@ -182,7 +182,8 @@ void win32_aio_attach_aio_context(QEMUWin32AIOState *aio,
AioContext *new_context) AioContext *new_context)
{ {
aio->is_aio_context_attached = true; 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) QEMUWin32AIOState *win32_aio_init(void)

View file

@ -283,7 +283,8 @@ void virtio_blk_data_plane_start(VirtIOBlockDataPlane *s)
/* Get this show started by hooking up our callbacks */ /* Get this show started by hooking up our callbacks */
aio_context_acquire(s->ctx); 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); aio_context_release(s->ctx);
return; return;
@ -319,7 +320,8 @@ void virtio_blk_data_plane_stop(VirtIOBlockDataPlane *s)
aio_context_acquire(s->ctx); aio_context_acquire(s->ctx);
/* Stop notifications for new requests from guest */ /* 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 */ /* Drain and switch bs back to the QEMU main loop */
blk_set_aio_context(s->conf->conf.blk, qemu_get_aio_context()); blk_set_aio_context(s->conf->conf.blk, qemu_get_aio_context());

View file

@ -60,7 +60,8 @@ static VirtIOSCSIVring *virtio_scsi_vring_init(VirtIOSCSI *s,
r = g_new(VirtIOSCSIVring, 1); r = g_new(VirtIOSCSIVring, 1);
r->host_notifier = *virtio_queue_get_host_notifier(vq); r->host_notifier = *virtio_queue_get_host_notifier(vq);
r->guest_notifier = *virtio_queue_get_guest_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; r->parent = s;
@ -71,7 +72,8 @@ static VirtIOSCSIVring *virtio_scsi_vring_init(VirtIOSCSI *s,
return r; return r;
fail_vring: 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); k->set_host_notifier(qbus->parent, n, false);
g_free(r); g_free(r);
return NULL; return NULL;
@ -162,14 +164,17 @@ static void virtio_scsi_clear_aio(VirtIOSCSI *s)
int i; int i;
if (s->ctrl_vring) { 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) { 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) { if (s->cmd_vrings) {
for (i = 0; i < vs->conf.num_queues && s->cmd_vrings[i]; i++) { 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_context_acquire(s->ctx);
aio_set_event_notifier(s->ctx, &s->ctrl_vring->host_notifier, NULL); aio_set_event_notifier(s->ctx, &s->ctrl_vring->host_notifier,
aio_set_event_notifier(s->ctx, &s->event_vring->host_notifier, NULL); false, NULL);
aio_set_event_notifier(s->ctx, &s->event_vring->host_notifier,
false, NULL);
for (i = 0; i < vs->conf.num_queues; i++) { 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 */ blk_drain_all(); /* ensure there are no in-flight requests */

View file

@ -299,6 +299,7 @@ bool aio_poll(AioContext *ctx, bool blocking);
*/ */
void aio_set_fd_handler(AioContext *ctx, void aio_set_fd_handler(AioContext *ctx,
int fd, int fd,
bool is_external,
IOHandler *io_read, IOHandler *io_read,
IOHandler *io_write, IOHandler *io_write,
void *opaque); void *opaque);
@ -312,6 +313,7 @@ void aio_set_fd_handler(AioContext *ctx,
*/ */
void aio_set_event_notifier(AioContext *ctx, void aio_set_event_notifier(AioContext *ctx,
EventNotifier *notifier, EventNotifier *notifier,
bool is_external,
EventNotifierHandler *io_read); EventNotifierHandler *io_read);
/* Return a GSource that lets the main loop poll the file descriptors attached /* Return a GSource that lets the main loop poll the file descriptors attached

View file

@ -55,7 +55,8 @@ void qemu_set_fd_handler(int fd,
void *opaque) void *opaque)
{ {
iohandler_init(); 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 /* reaping of zombies. right now we're not passing the status to

4
nbd.c
View file

@ -1446,6 +1446,7 @@ static void nbd_set_handlers(NBDClient *client)
{ {
if (client->exp && client->exp->ctx) { if (client->exp && client->exp->ctx) {
aio_set_fd_handler(client->exp->ctx, client->sock, aio_set_fd_handler(client->exp->ctx, client->sock,
false,
client->can_read ? nbd_read : NULL, client->can_read ? nbd_read : NULL,
client->send_coroutine ? nbd_restart_write : NULL, client->send_coroutine ? nbd_restart_write : NULL,
client); client);
@ -1455,7 +1456,8 @@ static void nbd_set_handlers(NBDClient *client)
static void nbd_unset_handlers(NBDClient *client) static void nbd_unset_handlers(NBDClient *client)
{ {
if (client->exp && client->exp->ctx) { 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);
} }
} }

View file

@ -118,6 +118,12 @@ static void *test_acquire_thread(void *opaque)
return NULL; 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) static void dummy_notifier_read(EventNotifier *unused)
{ {
g_assert(false); /* should never be invoked */ g_assert(false); /* should never be invoked */
@ -131,7 +137,7 @@ static void test_acquire(void)
/* Dummy event notifier ensures aio_poll() will block */ /* Dummy event notifier ensures aio_poll() will block */
event_notifier_init(&notifier, false); event_notifier_init(&notifier, false);
aio_set_event_notifier(ctx, &notifier, dummy_notifier_read); set_event_notifier(ctx, &notifier, dummy_notifier_read);
g_assert(!aio_poll(ctx, false)); /* consume aio_notify() */ g_assert(!aio_poll(ctx, false)); /* consume aio_notify() */
qemu_mutex_init(&data.start_lock); qemu_mutex_init(&data.start_lock);
@ -149,7 +155,7 @@ static void test_acquire(void)
aio_context_release(ctx); aio_context_release(ctx);
qemu_thread_join(&thread); qemu_thread_join(&thread);
aio_set_event_notifier(ctx, &notifier, NULL); set_event_notifier(ctx, &notifier, NULL);
event_notifier_cleanup(&notifier); event_notifier_cleanup(&notifier);
g_assert(data.thread_acquired); g_assert(data.thread_acquired);
@ -308,11 +314,11 @@ static void test_set_event_notifier(void)
{ {
EventNotifierTestData data = { .n = 0, .active = 0 }; EventNotifierTestData data = { .n = 0, .active = 0 };
event_notifier_init(&data.e, false); 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(!aio_poll(ctx, false));
g_assert_cmpint(data.n, ==, 0); 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(!aio_poll(ctx, false));
g_assert_cmpint(data.n, ==, 0); g_assert_cmpint(data.n, ==, 0);
event_notifier_cleanup(&data.e); event_notifier_cleanup(&data.e);
@ -322,7 +328,7 @@ static void test_wait_event_notifier(void)
{ {
EventNotifierTestData data = { .n = 0, .active = 1 }; EventNotifierTestData data = { .n = 0, .active = 1 };
event_notifier_init(&data.e, false); 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)); while (aio_poll(ctx, false));
g_assert_cmpint(data.n, ==, 0); g_assert_cmpint(data.n, ==, 0);
g_assert_cmpint(data.active, ==, 1); 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.n, ==, 1);
g_assert_cmpint(data.active, ==, 0); 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(!aio_poll(ctx, false));
g_assert_cmpint(data.n, ==, 1); 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 }; EventNotifierTestData data = { .n = 0, .active = 10, .auto_set = true };
event_notifier_init(&data.e, false); 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)); while (aio_poll(ctx, false));
g_assert_cmpint(data.n, ==, 0); g_assert_cmpint(data.n, ==, 0);
g_assert_cmpint(data.active, ==, 10); 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_cmpint(data.active, ==, 0);
g_assert(!aio_poll(ctx, false)); 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)); g_assert(!aio_poll(ctx, false));
event_notifier_cleanup(&data.e); event_notifier_cleanup(&data.e);
} }
@ -374,7 +380,7 @@ static void test_wait_event_notifier_noflush(void)
EventNotifierTestData dummy = { .n = 0, .active = 1 }; EventNotifierTestData dummy = { .n = 0, .active = 1 };
event_notifier_init(&data.e, false); 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(!aio_poll(ctx, false));
g_assert_cmpint(data.n, ==, 0); 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. */ /* An active event notifier forces aio_poll to look at EventNotifiers. */
event_notifier_init(&dummy.e, false); 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); event_notifier_set(&data.e);
g_assert(aio_poll(ctx, false)); 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.n, ==, 1);
g_assert_cmpint(dummy.active, ==, 0); 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); 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(!aio_poll(ctx, false));
g_assert_cmpint(data.n, ==, 2); 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. * an fd to wait on. Fixing this breaks other tests. So create a dummy one.
*/ */
event_notifier_init(&e, false); 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_poll(ctx, false);
aio_timer_init(ctx, &data.timer, data.clock_type, 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(!aio_poll(ctx, false));
g_assert_cmpint(data.n, ==, 2); g_assert_cmpint(data.n, ==, 2);
aio_set_event_notifier(ctx, &e, NULL); set_event_notifier(ctx, &e, NULL);
event_notifier_cleanup(&e); event_notifier_cleanup(&e);
timer_del(&data.timer); timer_del(&data.timer);
@ -638,11 +644,11 @@ static void test_source_set_event_notifier(void)
{ {
EventNotifierTestData data = { .n = 0, .active = 0 }; EventNotifierTestData data = { .n = 0, .active = 0 };
event_notifier_init(&data.e, false); 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)); while (g_main_context_iteration(NULL, false));
g_assert_cmpint(data.n, ==, 0); 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)); while (g_main_context_iteration(NULL, false));
g_assert_cmpint(data.n, ==, 0); g_assert_cmpint(data.n, ==, 0);
event_notifier_cleanup(&data.e); event_notifier_cleanup(&data.e);
@ -652,7 +658,7 @@ static void test_source_wait_event_notifier(void)
{ {
EventNotifierTestData data = { .n = 0, .active = 1 }; EventNotifierTestData data = { .n = 0, .active = 1 };
event_notifier_init(&data.e, false); 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)); while (g_main_context_iteration(NULL, false));
g_assert_cmpint(data.n, ==, 0); g_assert_cmpint(data.n, ==, 0);
g_assert_cmpint(data.active, ==, 1); 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.n, ==, 1);
g_assert_cmpint(data.active, ==, 0); 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)); while (g_main_context_iteration(NULL, false));
g_assert_cmpint(data.n, ==, 1); 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 }; EventNotifierTestData data = { .n = 0, .active = 10, .auto_set = true };
event_notifier_init(&data.e, false); 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)); while (g_main_context_iteration(NULL, false));
g_assert_cmpint(data.n, ==, 0); g_assert_cmpint(data.n, ==, 0);
g_assert_cmpint(data.active, ==, 10); 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_cmpint(data.active, ==, 0);
g_assert(!g_main_context_iteration(NULL, false)); 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)); while (g_main_context_iteration(NULL, false));
event_notifier_cleanup(&data.e); event_notifier_cleanup(&data.e);
} }
@ -704,7 +710,7 @@ static void test_source_wait_event_notifier_noflush(void)
EventNotifierTestData dummy = { .n = 0, .active = 1 }; EventNotifierTestData dummy = { .n = 0, .active = 1 };
event_notifier_init(&data.e, false); 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)); while (g_main_context_iteration(NULL, false));
g_assert_cmpint(data.n, ==, 0); 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. */ /* An active event notifier forces aio_poll to look at EventNotifiers. */
event_notifier_init(&dummy.e, false); 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); event_notifier_set(&data.e);
g_assert(g_main_context_iteration(NULL, false)); 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.n, ==, 1);
g_assert_cmpint(dummy.active, ==, 0); 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); 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)); while (g_main_context_iteration(NULL, false));
g_assert_cmpint(data.n, ==, 2); 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. * an fd to wait on. Fixing this breaks other tests. So create a dummy one.
*/ */
event_notifier_init(&e, false); 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)); do {} while (g_main_context_iteration(NULL, false));
aio_timer_init(ctx, &data.timer, data.clock_type, 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_cmpint(data.n, ==, 2);
g_assert(qemu_clock_get_ns(data.clock_type) > expiry); 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); event_notifier_cleanup(&e);
timer_del(&data.timer); timer_del(&data.timer);