From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NkjHo-0006du-FI for qemu-devel@nongnu.org; Thu, 25 Feb 2010 14:22:12 -0500 Received: from [199.232.76.173] (port=44405 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NkjHo-0006dm-5R for qemu-devel@nongnu.org; Thu, 25 Feb 2010 14:22:12 -0500 Received: from Debian-exim by monty-python.gnu.org with spam-scanned (Exim 4.60) (envelope-from ) id 1NkjHm-0001I0-3N for qemu-devel@nongnu.org; Thu, 25 Feb 2010 14:22:11 -0500 Received: from mail-qy0-f201.google.com ([209.85.221.201]:57745) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NkjHl-0001Hu-Pe for qemu-devel@nongnu.org; Thu, 25 Feb 2010 14:22:09 -0500 Received: by qyk39 with SMTP id 39so1223235qyk.22 for ; Thu, 25 Feb 2010 11:22:09 -0800 (PST) Message-ID: <4B86CDDC.7060604@codemonkey.ws> Date: Thu, 25 Feb 2010 13:22:04 -0600 From: Anthony Liguori MIME-Version: 1.0 References: <197f962f6aab3d7fae77ad9f69a3d0dc1ffc07d7.1267122331.git.mst@redhat.com> In-Reply-To: <197f962f6aab3d7fae77ad9f69a3d0dc1ffc07d7.1267122331.git.mst@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] Re: [PATCHv2 03/12] notifier: event notifier implementation List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "Michael S. Tsirkin" Cc: amit.shah@redhat.com, quintela@redhat.com, qemu-devel@nongnu.org, kraxel@redhat.com On 02/25/2010 12:28 PM, Michael S. Tsirkin wrote: > event notifiers are slightly generalized eventfd descriptors. Current > implementation depends on eventfd because vhost is the only user, and > vhost depends on eventfd anyway, but a stub is provided for non-eventfd > case. > > We'll be able to further generalize this when another user comes along > and we see how to best do this. > > Signed-off-by: Michael S. Tsirkin > --- > Makefile.target | 1 + > hw/notifier.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ > hw/notifier.h | 16 ++++++++++++++++ > qemu-common.h | 1 + > 4 files changed, 68 insertions(+), 0 deletions(-) > create mode 100644 hw/notifier.c > create mode 100644 hw/notifier.h > > diff --git a/Makefile.target b/Makefile.target > index 4c4d397..c1580e9 100644 > --- a/Makefile.target > +++ b/Makefile.target > @@ -173,6 +173,7 @@ obj-y = vl.o async.o monitor.o pci.o pci_host.o pcie_host.o machine.o gdbstub.o > # virtio has to be here due to weird dependency between PCI and virtio-net. > # need to fix this properly > obj-y += virtio-blk.o virtio-balloon.o virtio-net.o virtio-pci.o virtio-serial-bus.o > +obj-y += notifier.o > obj-y += rwhandler.o > obj-$(CONFIG_KVM) += kvm.o kvm-all.o > obj-$(CONFIG_ISA_MMIO) += isa_mmio.o > diff --git a/hw/notifier.c b/hw/notifier.c > new file mode 100644 > index 0000000..dff38de > --- /dev/null > +++ b/hw/notifier.c > @@ -0,0 +1,50 @@ > +#include "hw.h" > +#include "notifier.h" > +#ifdef CONFIG_EVENTFD > +#include > +#endif > + > +int event_notifier_init(EventNotifier *e, int active) > +{ > +#ifdef CONFIG_EVENTFD > + int fd = eventfd(!!active, EFD_NONBLOCK | EFD_CLOEXEC); > + if (fd< 0) > + return -errno; > + e->fd = fd; > + return 0; > +#else > + return -ENOSYS; > +#endif > +} > + > +void event_notifier_cleanup(EventNotifier *e) > +{ > + close(e->fd); > +} > + > +int event_notifier_get_fd(EventNotifier *e) > +{ > + return e->fd; > +} > + > +int event_notifier_test_and_clear(EventNotifier *e) > +{ > + uint64_t value; > + int r = read(e->fd,&value, sizeof value); > + return r == sizeof value; > Probably should handle EINTR, no? > +} > + > +int event_notifier_test(EventNotifier *e) > +{ > + uint64_t value; > + int r = read(e->fd,&value, sizeof value); > Coding Style is not quite explicit here but we always use sizeof(value). > + if (r == sizeof value) { > + /* restore previous value. */ > + int s = write(e->fd,&value, sizeof value); > + /* never blocks because we use EFD_SEMAPHORE. > + * If we didn't we'd get EAGAIN on overflow > + * and we'd have to write code to ignore it. */ > + assert(s == sizeof value); > + } > + return r == sizeof value; > +} > diff --git a/hw/notifier.h b/hw/notifier.h > new file mode 100644 > index 0000000..24117ea > --- /dev/null > +++ b/hw/notifier.h > @@ -0,0 +1,16 @@ > Needs copyright/license. Thanks for doing this abstraction, I'm really happy with it over direct eventfd usage. Regards, Anthony Liguori > +#ifndef QEMU_EVENT_NOTIFIER_H > +#define QEMU_EVENT_NOTIFIER_H > + > +#include "qemu-common.h" > + > +struct EventNotifier { > + int fd; > +}; > + > +int event_notifier_init(EventNotifier *, int active); > +void event_notifier_cleanup(EventNotifier *); > +int event_notifier_get_fd(EventNotifier *); > +int event_notifier_test_and_clear(EventNotifier *); > +int event_notifier_test(EventNotifier *); > + > +#endif > diff --git a/qemu-common.h b/qemu-common.h > index 805be1a..f12a8f5 100644 > --- a/qemu-common.h > +++ b/qemu-common.h > @@ -227,6 +227,7 @@ typedef struct uWireSlave uWireSlave; > typedef struct I2SCodec I2SCodec; > typedef struct DeviceState DeviceState; > typedef struct SSIBus SSIBus; > +typedef struct EventNotifier EventNotifier; > > typedef uint64_t pcibus_t; > >