Commit b321051c authored by Stefan Hajnoczi's avatar Stefan Hajnoczi
Browse files

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: default avatarStefan Hajnoczi <stefanha@redhat.com>
Link: https://lore.kernel.org/r/20200305170806.1313245-5-stefanha@redhat.com
Message-Id: <20200305170806.1313245-5-stefanha@redhat.com>
parent 1f050a46
Loading
Loading
Loading
Loading
+6 −7
Original line number Diff line number Diff line
@@ -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:
+1 −6
Original line number Diff line number Diff line
@@ -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);

+12 −9
Original line number Diff line number Diff line
@@ -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);
    }
+3 −1
Original line number Diff line number Diff line
@@ -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 */
}