mirror of https://github.com/xemu-project/xemu.git
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>
This commit is contained in:
parent
1f050a4690
commit
b321051cf4
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue