aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Hajnoczi <stefanha@redhat.com>2020-03-05 17:08:03 +0000
committerStefan Hajnoczi <stefanha@redhat.com>2020-03-09 16:41:31 +0000
commitb321051cf48ccc2d3d832af111d688f2282f089b (patch)
tree32317a09036588fd33643a5e844da001b4bf5ddd
parent1f050a4690f62a1e7dabc4f44141e9f762c3769f (diff)
downloadqemu-b321051cf48ccc2d3d832af111d688f2282f089b.zip
qemu-b321051cf48ccc2d3d832af111d688f2282f089b.tar.gz
qemu-b321051cf48ccc2d3d832af111d688f2282f089b.tar.bz2
aio-posix: simplify FDMonOps->update() prototype
The AioHandler *node, bool is_new arguments are more complicated to think about than simply being given AioHandler *old_node, AioHandler *new_node. Furthermore, the new Linux io_uring file descriptor monitoring mechanism added by the new patch requires access to both the old and the new nodes. Make this change now in preparation. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Link: https://lore.kernel.org/r/20200305170806.1313245-5-stefanha@redhat.com Message-Id: <20200305170806.1313245-5-stefanha@redhat.com>
-rw-r--r--include/block/aio.h13
-rw-r--r--util/aio-posix.c7
-rw-r--r--util/fdmon-epoll.c21
-rw-r--r--util/fdmon-poll.c4
4 files changed, 22 insertions, 23 deletions
diff --git a/include/block/aio.h b/include/block/aio.h
index 90e07d7..bd76b08 100644
--- a/include/block/aio.h
+++ b/include/block/aio.h
@@ -57,17 +57,16 @@ typedef struct {
/*
* update:
* @ctx: the AioContext
- * @node: the handler
- * @is_new: is the file descriptor already being monitored?
+ * @old_node: the existing handler or NULL if this file descriptor is being
+ * monitored for the first time
+ * @new_node: the new handler or NULL if this file descriptor is being
+ * removed
*
- * Add/remove/modify a monitored file descriptor. There are three cases:
- * 1. node->pfd.events == 0 means remove the file descriptor.
- * 2. !is_new means modify an already monitored file descriptor.
- * 3. is_new means add a new file descriptor.
+ * Add/remove/modify a monitored file descriptor.
*
* Called with ctx->list_lock acquired.
*/
- void (*update)(AioContext *ctx, AioHandler *node, bool is_new);
+ void (*update)(AioContext *ctx, AioHandler *old_node, AioHandler *new_node);
/*
* wait:
diff --git a/util/aio-posix.c b/util/aio-posix.c
index bc0b865..028b2ab 100644
--- a/util/aio-posix.c
+++ b/util/aio-posix.c
@@ -139,12 +139,7 @@ void aio_set_fd_handler(AioContext *ctx,
atomic_set(&ctx->poll_disable_cnt,
atomic_read(&ctx->poll_disable_cnt) + poll_disable_change);
- if (new_node) {
- ctx->fdmon_ops->update(ctx, new_node, is_new);
- } else if (node) {
- /* Unregister deleted fd_handler */
- ctx->fdmon_ops->update(ctx, node, false);
- }
+ ctx->fdmon_ops->update(ctx, node, new_node);
qemu_lockcnt_unlock(&ctx->list_lock);
aio_notify(ctx);
diff --git a/util/fdmon-epoll.c b/util/fdmon-epoll.c
index 29c1454..d56b694 100644
--- a/util/fdmon-epoll.c
+++ b/util/fdmon-epoll.c
@@ -30,21 +30,24 @@ static inline int epoll_events_from_pfd(int pfd_events)
(pfd_events & G_IO_ERR ? EPOLLERR : 0);
}
-static void fdmon_epoll_update(AioContext *ctx, AioHandler *node, bool is_new)
+static void fdmon_epoll_update(AioContext *ctx,
+ AioHandler *old_node,
+ AioHandler *new_node)
{
- struct epoll_event event;
+ struct epoll_event event = {
+ .data.ptr = new_node,
+ .events = new_node ? epoll_events_from_pfd(new_node->pfd.events) : 0,
+ };
int r;
- int ctl;
- if (!node->pfd.events) {
- ctl = EPOLL_CTL_DEL;
+ if (!new_node) {
+ r = epoll_ctl(ctx->epollfd, EPOLL_CTL_DEL, old_node->pfd.fd, &event);
+ } else if (!old_node) {
+ r = epoll_ctl(ctx->epollfd, EPOLL_CTL_ADD, new_node->pfd.fd, &event);
} else {
- event.data.ptr = node;
- event.events = epoll_events_from_pfd(node->pfd.events);
- ctl = is_new ? EPOLL_CTL_ADD : EPOLL_CTL_MOD;
+ r = epoll_ctl(ctx->epollfd, EPOLL_CTL_MOD, new_node->pfd.fd, &event);
}
- r = epoll_ctl(ctx->epollfd, ctl, node->pfd.fd, &event);
if (r) {
fdmon_epoll_disable(ctx);
}
diff --git a/util/fdmon-poll.c b/util/fdmon-poll.c
index 6799211..28114a0 100644
--- a/util/fdmon-poll.c
+++ b/util/fdmon-poll.c
@@ -93,7 +93,9 @@ static int fdmon_poll_wait(AioContext *ctx, AioHandlerList *ready_list,
return ret;
}
-static void fdmon_poll_update(AioContext *ctx, AioHandler *node, bool is_new)
+static void fdmon_poll_update(AioContext *ctx,
+ AioHandler *old_node,
+ AioHandler *new_node)
{
/* Do nothing, AioHandler already contains the state we'll need */
}