mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-08 18:23:57 -06:00
aio: remove aio_disable_external() API
All callers now pass is_external=false to aio_set_fd_handler() and aio_set_event_notifier(). The aio_disable_external() API that temporarily disables fd handlers that were registered is_external=true is therefore dead code. Remove aio_disable_external(), aio_enable_external(), and the is_external arguments to aio_set_fd_handler() and aio_set_event_notifier(). The entire test-fdmon-epoll test is removed because its sole purpose was testing aio_disable_external(). Parts of this patch were generated using the following coccinelle (https://coccinelle.lip6.fr/) semantic patch: @@ expression ctx, fd, is_external, io_read, io_write, io_poll, io_poll_ready, opaque; @@ - aio_set_fd_handler(ctx, fd, is_external, io_read, io_write, io_poll, io_poll_ready, opaque) + aio_set_fd_handler(ctx, fd, io_read, io_write, io_poll, io_poll_ready, opaque) @@ expression ctx, notifier, is_external, io_read, io_poll, io_poll_ready; @@ - aio_set_event_notifier(ctx, notifier, is_external, io_read, io_poll, io_poll_ready) + aio_set_event_notifier(ctx, notifier, io_read, io_poll, io_poll_ready) Reviewed-by: Juan Quintela <quintela@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Message-Id: <20230516190238.8401-21-stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
03d7162a21
commit
60f782b6b7
36 changed files with 80 additions and 298 deletions
|
@ -99,7 +99,6 @@ static bool aio_remove_fd_handler(AioContext *ctx, AioHandler *node)
|
|||
|
||||
void aio_set_fd_handler(AioContext *ctx,
|
||||
int fd,
|
||||
bool is_external,
|
||||
IOHandler *io_read,
|
||||
IOHandler *io_write,
|
||||
AioPollFn *io_poll,
|
||||
|
@ -144,7 +143,6 @@ void aio_set_fd_handler(AioContext *ctx,
|
|||
new_node->io_poll = io_poll;
|
||||
new_node->io_poll_ready = io_poll_ready;
|
||||
new_node->opaque = opaque;
|
||||
new_node->is_external = is_external;
|
||||
|
||||
if (is_new) {
|
||||
new_node->pfd.fd = fd;
|
||||
|
@ -196,12 +194,11 @@ static void aio_set_fd_poll(AioContext *ctx, int fd,
|
|||
|
||||
void aio_set_event_notifier(AioContext *ctx,
|
||||
EventNotifier *notifier,
|
||||
bool is_external,
|
||||
EventNotifierHandler *io_read,
|
||||
AioPollFn *io_poll,
|
||||
EventNotifierHandler *io_poll_ready)
|
||||
{
|
||||
aio_set_fd_handler(ctx, event_notifier_get_fd(notifier), is_external,
|
||||
aio_set_fd_handler(ctx, event_notifier_get_fd(notifier),
|
||||
(IOHandler *)io_read, NULL, io_poll,
|
||||
(IOHandler *)io_poll_ready, notifier);
|
||||
}
|
||||
|
@ -285,13 +282,11 @@ bool aio_pending(AioContext *ctx)
|
|||
|
||||
/* TODO should this check poll ready? */
|
||||
revents = node->pfd.revents & node->pfd.events;
|
||||
if (revents & (G_IO_IN | G_IO_HUP | G_IO_ERR) && node->io_read &&
|
||||
aio_node_check(ctx, node->is_external)) {
|
||||
if (revents & (G_IO_IN | G_IO_HUP | G_IO_ERR) && node->io_read) {
|
||||
result = true;
|
||||
break;
|
||||
}
|
||||
if (revents & (G_IO_OUT | G_IO_ERR) && node->io_write &&
|
||||
aio_node_check(ctx, node->is_external)) {
|
||||
if (revents & (G_IO_OUT | G_IO_ERR) && node->io_write) {
|
||||
result = true;
|
||||
break;
|
||||
}
|
||||
|
@ -350,9 +345,7 @@ static bool aio_dispatch_handler(AioContext *ctx, AioHandler *node)
|
|||
QLIST_INSERT_HEAD(&ctx->poll_aio_handlers, node, node_poll);
|
||||
}
|
||||
if (!QLIST_IS_INSERTED(node, node_deleted) &&
|
||||
poll_ready && revents == 0 &&
|
||||
aio_node_check(ctx, node->is_external) &&
|
||||
node->io_poll_ready) {
|
||||
poll_ready && revents == 0 && node->io_poll_ready) {
|
||||
/*
|
||||
* Remove temporarily to avoid infinite loops when ->io_poll_ready()
|
||||
* calls aio_poll() before clearing the condition that made the poll
|
||||
|
@ -375,7 +368,6 @@ static bool aio_dispatch_handler(AioContext *ctx, AioHandler *node)
|
|||
|
||||
if (!QLIST_IS_INSERTED(node, node_deleted) &&
|
||||
(revents & (G_IO_IN | G_IO_HUP | G_IO_ERR)) &&
|
||||
aio_node_check(ctx, node->is_external) &&
|
||||
node->io_read) {
|
||||
node->io_read(node->opaque);
|
||||
|
||||
|
@ -386,7 +378,6 @@ static bool aio_dispatch_handler(AioContext *ctx, AioHandler *node)
|
|||
}
|
||||
if (!QLIST_IS_INSERTED(node, node_deleted) &&
|
||||
(revents & (G_IO_OUT | G_IO_ERR)) &&
|
||||
aio_node_check(ctx, node->is_external) &&
|
||||
node->io_write) {
|
||||
node->io_write(node->opaque);
|
||||
progress = true;
|
||||
|
@ -447,8 +438,7 @@ static bool run_poll_handlers_once(AioContext *ctx,
|
|||
AioHandler *tmp;
|
||||
|
||||
QLIST_FOREACH_SAFE(node, &ctx->poll_aio_handlers, node_poll, tmp) {
|
||||
if (aio_node_check(ctx, node->is_external) &&
|
||||
node->io_poll(node->opaque)) {
|
||||
if (node->io_poll(node->opaque)) {
|
||||
aio_add_poll_ready_handler(ready_list, node);
|
||||
|
||||
node->poll_idle_timeout = now + POLL_IDLE_INTERVAL_NS;
|
||||
|
|
|
@ -38,7 +38,6 @@ struct AioHandler {
|
|||
#endif
|
||||
int64_t poll_idle_timeout; /* when to stop userspace polling */
|
||||
bool poll_ready; /* has polling detected an event? */
|
||||
bool is_external;
|
||||
};
|
||||
|
||||
/* Add a handler to a ready list */
|
||||
|
|
|
@ -32,7 +32,6 @@ struct AioHandler {
|
|||
GPollFD pfd;
|
||||
int deleted;
|
||||
void *opaque;
|
||||
bool is_external;
|
||||
QLIST_ENTRY(AioHandler) node;
|
||||
};
|
||||
|
||||
|
@ -64,7 +63,6 @@ static void aio_remove_fd_handler(AioContext *ctx, AioHandler *node)
|
|||
|
||||
void aio_set_fd_handler(AioContext *ctx,
|
||||
int fd,
|
||||
bool is_external,
|
||||
IOHandler *io_read,
|
||||
IOHandler *io_write,
|
||||
AioPollFn *io_poll,
|
||||
|
@ -111,7 +109,6 @@ 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;
|
||||
|
||||
if (io_read) {
|
||||
bitmask |= FD_READ | FD_ACCEPT | FD_CLOSE;
|
||||
|
@ -135,7 +132,6 @@ void aio_set_fd_handler(AioContext *ctx,
|
|||
|
||||
void aio_set_event_notifier(AioContext *ctx,
|
||||
EventNotifier *e,
|
||||
bool is_external,
|
||||
EventNotifierHandler *io_notify,
|
||||
AioPollFn *io_poll,
|
||||
EventNotifierHandler *io_poll_ready)
|
||||
|
@ -161,7 +157,6 @@ 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_RCU(&ctx->aio_handlers, node, node);
|
||||
|
||||
g_source_add_poll(&ctx->source, &node->pfd);
|
||||
|
@ -368,8 +363,7 @@ bool aio_poll(AioContext *ctx, bool blocking)
|
|||
/* fill fd sets */
|
||||
count = 0;
|
||||
QLIST_FOREACH_RCU(node, &ctx->aio_handlers, node) {
|
||||
if (!node->deleted && node->io_notify
|
||||
&& aio_node_check(ctx, node->is_external)) {
|
||||
if (!node->deleted && node->io_notify) {
|
||||
assert(count < MAXIMUM_WAIT_OBJECTS);
|
||||
events[count++] = event_notifier_get_handle(node->e);
|
||||
}
|
||||
|
|
|
@ -409,7 +409,7 @@ aio_ctx_finalize(GSource *source)
|
|||
g_free(bh);
|
||||
}
|
||||
|
||||
aio_set_event_notifier(ctx, &ctx->notifier, false, NULL, NULL, NULL);
|
||||
aio_set_event_notifier(ctx, &ctx->notifier, NULL, NULL, NULL);
|
||||
event_notifier_cleanup(&ctx->notifier);
|
||||
qemu_rec_mutex_destroy(&ctx->lock);
|
||||
qemu_lockcnt_destroy(&ctx->list_lock);
|
||||
|
@ -593,7 +593,6 @@ AioContext *aio_context_new(Error **errp)
|
|||
QSLIST_INIT(&ctx->scheduled_coroutines);
|
||||
|
||||
aio_set_event_notifier(ctx, &ctx->notifier,
|
||||
false,
|
||||
aio_context_notifier_cb,
|
||||
aio_context_notifier_poll,
|
||||
aio_context_notifier_poll_ready);
|
||||
|
|
|
@ -64,11 +64,6 @@ static int fdmon_epoll_wait(AioContext *ctx, AioHandlerList *ready_list,
|
|||
int i, ret = 0;
|
||||
struct epoll_event events[128];
|
||||
|
||||
/* Fall back while external clients are disabled */
|
||||
if (qatomic_read(&ctx->external_disable_cnt)) {
|
||||
return fdmon_poll_ops.wait(ctx, ready_list, timeout);
|
||||
}
|
||||
|
||||
if (timeout > 0) {
|
||||
ret = qemu_poll_ns(&pfd, 1, timeout);
|
||||
if (ret > 0) {
|
||||
|
@ -133,11 +128,6 @@ bool fdmon_epoll_try_upgrade(AioContext *ctx, unsigned npfd)
|
|||
return false;
|
||||
}
|
||||
|
||||
/* Do not upgrade while external clients are disabled */
|
||||
if (qatomic_read(&ctx->external_disable_cnt)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (npfd < EPOLL_ENABLE_THRESHOLD) {
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -276,11 +276,6 @@ static int fdmon_io_uring_wait(AioContext *ctx, AioHandlerList *ready_list,
|
|||
unsigned wait_nr = 1; /* block until at least one cqe is ready */
|
||||
int ret;
|
||||
|
||||
/* Fall back while external clients are disabled */
|
||||
if (qatomic_read(&ctx->external_disable_cnt)) {
|
||||
return fdmon_poll_ops.wait(ctx, ready_list, timeout);
|
||||
}
|
||||
|
||||
if (timeout == 0) {
|
||||
wait_nr = 0; /* non-blocking */
|
||||
} else if (timeout > 0) {
|
||||
|
@ -315,8 +310,7 @@ static bool fdmon_io_uring_need_wait(AioContext *ctx)
|
|||
return true;
|
||||
}
|
||||
|
||||
/* Are we falling back to fdmon-poll? */
|
||||
return qatomic_read(&ctx->external_disable_cnt);
|
||||
return false;
|
||||
}
|
||||
|
||||
static const FDMonOps fdmon_io_uring_ops = {
|
||||
|
|
|
@ -65,8 +65,7 @@ static int fdmon_poll_wait(AioContext *ctx, AioHandlerList *ready_list,
|
|||
assert(npfd == 0);
|
||||
|
||||
QLIST_FOREACH_RCU(node, &ctx->aio_handlers, node) {
|
||||
if (!QLIST_IS_INSERTED(node, node_deleted) && node->pfd.events
|
||||
&& aio_node_check(ctx, node->is_external)) {
|
||||
if (!QLIST_IS_INSERTED(node, node_deleted) && node->pfd.events) {
|
||||
add_pollfd(node);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -644,14 +644,13 @@ void qemu_set_fd_handler(int fd,
|
|||
void *opaque)
|
||||
{
|
||||
iohandler_init();
|
||||
aio_set_fd_handler(iohandler_ctx, fd, false,
|
||||
fd_read, fd_write, NULL, NULL, opaque);
|
||||
aio_set_fd_handler(iohandler_ctx, fd, fd_read, fd_write, NULL, NULL,
|
||||
opaque);
|
||||
}
|
||||
|
||||
void event_notifier_set_handler(EventNotifier *e,
|
||||
EventNotifierHandler *handler)
|
||||
{
|
||||
iohandler_init();
|
||||
aio_set_event_notifier(iohandler_ctx, e, false,
|
||||
handler, NULL, NULL);
|
||||
aio_set_event_notifier(iohandler_ctx, e, handler, NULL, NULL);
|
||||
}
|
||||
|
|
|
@ -74,8 +74,7 @@ typedef struct {
|
|||
static void fd_coroutine_enter(void *opaque)
|
||||
{
|
||||
FDYieldUntilData *data = opaque;
|
||||
aio_set_fd_handler(data->ctx, data->fd, false,
|
||||
NULL, NULL, NULL, NULL, NULL);
|
||||
aio_set_fd_handler(data->ctx, data->fd, NULL, NULL, NULL, NULL, NULL);
|
||||
qemu_coroutine_enter(data->co);
|
||||
}
|
||||
|
||||
|
@ -87,7 +86,7 @@ void coroutine_fn yield_until_fd_readable(int fd)
|
|||
data.ctx = qemu_get_current_aio_context();
|
||||
data.co = qemu_coroutine_self();
|
||||
data.fd = fd;
|
||||
aio_set_fd_handler(
|
||||
data.ctx, fd, false, fd_coroutine_enter, NULL, NULL, NULL, &data);
|
||||
aio_set_fd_handler(data.ctx, fd, fd_coroutine_enter, NULL, NULL, NULL,
|
||||
&data);
|
||||
qemu_coroutine_yield();
|
||||
}
|
||||
|
|
|
@ -278,7 +278,7 @@ set_watch(VuDev *vu_dev, int fd, int vu_evt,
|
|||
vu_fd_watch->fd = fd;
|
||||
vu_fd_watch->cb = cb;
|
||||
qemu_socket_set_nonblock(fd);
|
||||
aio_set_fd_handler(server->ioc->ctx, fd, false, kick_handler,
|
||||
aio_set_fd_handler(server->ioc->ctx, fd, kick_handler,
|
||||
NULL, NULL, NULL, vu_fd_watch);
|
||||
vu_fd_watch->vu_dev = vu_dev;
|
||||
vu_fd_watch->pvt = pvt;
|
||||
|
@ -299,8 +299,7 @@ static void remove_watch(VuDev *vu_dev, int fd)
|
|||
if (!vu_fd_watch) {
|
||||
return;
|
||||
}
|
||||
aio_set_fd_handler(server->ioc->ctx, fd, false,
|
||||
NULL, NULL, NULL, NULL, NULL);
|
||||
aio_set_fd_handler(server->ioc->ctx, fd, NULL, NULL, NULL, NULL, NULL);
|
||||
|
||||
QTAILQ_REMOVE(&server->vu_fd_watches, vu_fd_watch, next);
|
||||
g_free(vu_fd_watch);
|
||||
|
@ -362,7 +361,7 @@ void vhost_user_server_stop(VuServer *server)
|
|||
VuFdWatch *vu_fd_watch;
|
||||
|
||||
QTAILQ_FOREACH(vu_fd_watch, &server->vu_fd_watches, next) {
|
||||
aio_set_fd_handler(server->ctx, vu_fd_watch->fd, false,
|
||||
aio_set_fd_handler(server->ctx, vu_fd_watch->fd,
|
||||
NULL, NULL, NULL, NULL, vu_fd_watch);
|
||||
}
|
||||
|
||||
|
@ -403,7 +402,7 @@ void vhost_user_server_attach_aio_context(VuServer *server, AioContext *ctx)
|
|||
qio_channel_attach_aio_context(server->ioc, ctx);
|
||||
|
||||
QTAILQ_FOREACH(vu_fd_watch, &server->vu_fd_watches, next) {
|
||||
aio_set_fd_handler(ctx, vu_fd_watch->fd, false, kick_handler, NULL,
|
||||
aio_set_fd_handler(ctx, vu_fd_watch->fd, kick_handler, NULL,
|
||||
NULL, NULL, vu_fd_watch);
|
||||
}
|
||||
|
||||
|
@ -417,7 +416,7 @@ void vhost_user_server_detach_aio_context(VuServer *server)
|
|||
VuFdWatch *vu_fd_watch;
|
||||
|
||||
QTAILQ_FOREACH(vu_fd_watch, &server->vu_fd_watches, next) {
|
||||
aio_set_fd_handler(server->ctx, vu_fd_watch->fd, false,
|
||||
aio_set_fd_handler(server->ctx, vu_fd_watch->fd,
|
||||
NULL, NULL, NULL, NULL, vu_fd_watch);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue