qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] dataplane: remove EventPoll in favor of AioCont


From: mdroth
Subject: Re: [Qemu-devel] [PATCH] dataplane: remove EventPoll in favor of AioContext
Date: Thu, 21 Feb 2013 15:32:20 -0600
User-agent: Mutt/1.5.21 (2010-09-15)

On Thu, Feb 21, 2013 at 05:29:55PM +0100, Paolo Bonzini wrote:
> During the review of the dataplane code, the EventPoll API morphed itself
> (not concidentially) into something very very similar to an AioContext.
> Thus, it is trivial to convert virtio-blk-dataplane to use AioContext,
> and a first baby step towards letting dataplane talk directly to the
> QEMU block layer.
> 
> The only interesting note is the value-copy of EventNotifiers.  At least
> in my opinion this is part of the EventNotifier API and is even portable
> to Windows.  Of course, in this case you should not close the notifier's
> underlying file descriptors or handle with event_notifier_cleanup.
> 
> Signed-off-by: Paolo Bonzini <address@hidden>
> ---
>  hw/dataplane/Makefile.objs |   2 +-
>  hw/dataplane/event-poll.c  | 100 
> ---------------------------------------------
>  hw/dataplane/event-poll.h  |  40 ------------------
>  hw/dataplane/virtio-blk.c  |  41 ++++++++++---------
>  4 files changed, 22 insertions(+), 161 deletions(-)
>  delete mode 100644 hw/dataplane/event-poll.c
>  delete mode 100644 hw/dataplane/event-poll.h
> 
> diff --git a/hw/dataplane/Makefile.objs b/hw/dataplane/Makefile.objs
> index 3e47d05..701111c 100644
> --- a/hw/dataplane/Makefile.objs
> +++ b/hw/dataplane/Makefile.objs
> @@ -1 +1 @@
> -obj-$(CONFIG_VIRTIO_BLK_DATA_PLANE) += hostmem.o vring.o event-poll.o ioq.o 
> virtio-blk.o
> +obj-$(CONFIG_VIRTIO_BLK_DATA_PLANE) += hostmem.o vring.o ioq.o virtio-blk.o
> diff --git a/hw/dataplane/event-poll.c b/hw/dataplane/event-poll.c
> deleted file mode 100644
> index 2b55c6e..0000000
> --- a/hw/dataplane/event-poll.c
> +++ /dev/null
> @@ -1,100 +0,0 @@
> -/*
> - * Event loop with file descriptor polling
> - *
> - * Copyright 2012 IBM, Corp.
> - * Copyright 2012 Red Hat, Inc. and/or its affiliates
> - *
> - * Authors:
> - *   Stefan Hajnoczi <address@hidden>
> - *
> - * This work is licensed under the terms of the GNU GPL, version 2 or later.
> - * See the COPYING file in the top-level directory.
> - *
> - */
> -
> -#include <sys/epoll.h>
> -#include "hw/dataplane/event-poll.h"
> -
> -/* Add an event notifier and its callback for polling */
> -void event_poll_add(EventPoll *poll, EventHandler *handler,
> -                    EventNotifier *notifier, EventCallback *callback)
> -{
> -    struct epoll_event event = {
> -        .events = EPOLLIN,
> -        .data.ptr = handler,
> -    };
> -    handler->notifier = notifier;
> -    handler->callback = callback;
> -    if (epoll_ctl(poll->epoll_fd, EPOLL_CTL_ADD,
> -                  event_notifier_get_fd(notifier), &event) != 0) {
> -        fprintf(stderr, "failed to add event handler to epoll: %m\n");
> -        exit(1);
> -    }
> -}
> -
> -/* Event callback for stopping event_poll() */
> -static void handle_stop(EventHandler *handler)
> -{
> -    /* Do nothing */
> -}
> -
> -void event_poll_init(EventPoll *poll)
> -{
> -    /* Create epoll file descriptor */
> -    poll->epoll_fd = epoll_create1(EPOLL_CLOEXEC);
> -    if (poll->epoll_fd < 0) {
> -        fprintf(stderr, "epoll_create1 failed: %m\n");
> -        exit(1);
> -    }
> -
> -    /* Set up stop notifier */
> -    if (event_notifier_init(&poll->stop_notifier, 0) < 0) {
> -        fprintf(stderr, "failed to init stop notifier\n");
> -        exit(1);
> -    }
> -    event_poll_add(poll, &poll->stop_handler,
> -                   &poll->stop_notifier, handle_stop);
> -}
> -
> -void event_poll_cleanup(EventPoll *poll)
> -{
> -    event_notifier_cleanup(&poll->stop_notifier);
> -    close(poll->epoll_fd);
> -    poll->epoll_fd = -1;
> -}
> -
> -/* Block until the next event and invoke its callback */
> -void event_poll(EventPoll *poll)
> -{
> -    EventHandler *handler;
> -    struct epoll_event event;
> -    int nevents;
> -
> -    /* Wait for the next event.  Only do one event per call to keep the
> -     * function simple, this could be changed later. */
> -    do {
> -        nevents = epoll_wait(poll->epoll_fd, &event, 1, -1);
> -    } while (nevents < 0 && errno == EINTR);
> -    if (unlikely(nevents != 1)) {
> -        fprintf(stderr, "epoll_wait failed: %m\n");
> -        exit(1); /* should never happen */
> -    }
> -
> -    /* Find out which event handler has become active */
> -    handler = event.data.ptr;
> -
> -    /* Clear the eventfd */
> -    event_notifier_test_and_clear(handler->notifier);

Wouldn't we need to move this into the handle_io/handle_notify to maintain the
old behavior?



reply via email to

[Prev in Thread] Current Thread [Next in Thread]