From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33307) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1btZ9t-0003o9-Oc for qemu-devel@nongnu.org; Mon, 10 Oct 2016 07:54:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1btZ9s-00069G-N8 for qemu-devel@nongnu.org; Mon, 10 Oct 2016 07:54:17 -0400 Received: from mail-lf0-x242.google.com ([2a00:1450:4010:c07::242]:35057) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1btZ9s-00068I-AU for qemu-devel@nongnu.org; Mon, 10 Oct 2016 07:54:16 -0400 Received: by mail-lf0-x242.google.com with SMTP id x79so6189650lff.2 for ; Mon, 10 Oct 2016 04:54:16 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Mon, 10 Oct 2016 13:53:41 +0200 Message-Id: <1476100421-28772-14-git-send-email-pbonzini@redhat.com> In-Reply-To: <1476100421-28772-1-git-send-email-pbonzini@redhat.com> References: <1476100421-28772-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 13/13] virtio: inline set_host_notifier_internal List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: stefanha@redhat.com, borntraeger@de.ibm.com, cornelia.huck@de.ibm.com, famz@redhat.com, mst@redhat.com This is only called from virtio_bus_set_host_notifier. Reviewed-by: Stefan Hajnoczi Signed-off-by: Paolo Bonzini --- v1->v2: rebase after commit a8bba0a ("virtio: Tell the user what went wrong when event_notifier_init failed", 2016-09-09) hw/virtio/virtio-bus.c | 62 +++++++++++++++++++++----------------------------- 1 file changed, 26 insertions(+), 36 deletions(-) diff --git a/hw/virtio/virtio-bus.c b/hw/virtio/virtio-bus.c index 96b7e76..dc45b78 100644 --- a/hw/virtio/virtio-bus.c +++ b/hw/virtio/virtio-bus.c @@ -147,41 +147,6 @@ void virtio_bus_set_vdev_config(VirtioBusState *bus, uint8_t *config) } } -static int set_host_notifier_internal(DeviceState *proxy, VirtioBusState *bus, - int n, bool assign) -{ - VirtIODevice *vdev = virtio_bus_get_device(bus); - VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(bus); - VirtQueue *vq = virtio_get_queue(vdev, n); - EventNotifier *notifier = virtio_queue_get_host_notifier(vq); - int r = 0; - - if (assign) { - r = event_notifier_init(notifier, 1); - if (r < 0) { - error_report("%s: unable to init event notifier: %s (%d)", - __func__, strerror(-r), r); - return r; - } - r = k->ioeventfd_assign(proxy, notifier, n, true); - if (r < 0) { - error_report("%s: unable to assign ioeventfd: %d", __func__, r); - goto cleanup_event_notifier; - } - return 0; - } else { - k->ioeventfd_assign(proxy, notifier, n, false); - } - -cleanup_event_notifier: - /* Test and clear notifier before after disabling event, - * in case poll callback didn't have time to run. - */ - virtio_queue_host_notifier_read(notifier); - event_notifier_cleanup(notifier); - return r; -} - int virtio_bus_start_ioeventfd(VirtioBusState *bus) { VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(bus); @@ -231,20 +196,45 @@ bool virtio_bus_ioeventfd_enabled(VirtioBusState *bus) */ int virtio_bus_set_host_notifier(VirtioBusState *bus, int n, bool assign) { + VirtIODevice *vdev = virtio_bus_get_device(bus); VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(bus); DeviceState *proxy = DEVICE(BUS(bus)->parent); + VirtQueue *vq = virtio_get_queue(vdev, n); + EventNotifier *notifier = virtio_queue_get_host_notifier(vq); + int r = 0; if (!k->ioeventfd_assign) { return -ENOSYS; } + if (assign) { assert(!bus->ioeventfd_started); + r = event_notifier_init(notifier, 1); + if (r < 0) { + error_report("%s: unable to init event notifier: %s (%d)", + __func__, strerror(-r), r); + return r; + } + r = k->ioeventfd_assign(proxy, notifier, n, true); + if (r < 0) { + error_report("%s: unable to assign ioeventfd: %d", __func__, r); + goto cleanup_event_notifier; + } + return 0; } else { if (!bus->ioeventfd_started) { return 0; } + k->ioeventfd_assign(proxy, notifier, n, false); } - return set_host_notifier_internal(proxy, bus, n, assign); + +cleanup_event_notifier: + /* Test and clear notifier before after disabling event, + * in case poll callback didn't have time to run. + */ + virtio_queue_host_notifier_read(notifier); + event_notifier_cleanup(notifier); + return r; } static char *virtio_bus_get_dev_path(DeviceState *dev) -- 2.7.4