From patchwork Mon Oct 10 11:53:31 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 680378 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3sszTX47x3z9s2Q for ; Mon, 10 Oct 2016 23:10:08 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=OVgm7/yb; dkim-atps=neutral Received: from localhost ([::1]:49186 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1btZPA-0008TP-7M for incoming@patchwork.ozlabs.org; Mon, 10 Oct 2016 08:10:04 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33160) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1btZ9j-0003c7-7E for qemu-devel@nongnu.org; Mon, 10 Oct 2016 07:54:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1btZ9g-00060J-E4 for qemu-devel@nongnu.org; Mon, 10 Oct 2016 07:54:06 -0400 Received: from mail-lf0-x244.google.com ([2a00:1450:4010:c07::244]:35979) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1btZ9g-0005zS-1f for qemu-devel@nongnu.org; Mon, 10 Oct 2016 07:54:04 -0400 Received: by mail-lf0-x244.google.com with SMTP id b75so9558767lfg.3 for ; Mon, 10 Oct 2016 04:54:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=/bt8Pl6ZgR9QrSj/oWEDDuptJWuEVNAXeneL8ObK2LU=; b=OVgm7/yb9k+uw6GItIzR9DTxFra8QwJGl+u7C/JnVDfz3moPzq8wG/7Fa283n9stMK 9fO4eul6SFs1ReaI7GyILBlW6P0ZK1o6TtdBG0oHAnHxIMzDFvQXJaIuiON+r3BrJwiV HcDdszYYCm4FuMmLcEzYV764AuW4xLt+mfEJb+MYta3Xtawoa5lx2dic/W3mmvDGY8nT M4OhHoscGRP5GZynzJy3sfcaD9yfyWLs9pTlkHdP5yrPuTeA+TQz59WuwZhnYjfiHaA4 bVnx7MFoXYhIns5K3/+2BP8yL8y1ISi93i26fWjoBrQogDoods2Xjc4EBXmK4Jr0rdrI ZQFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=/bt8Pl6ZgR9QrSj/oWEDDuptJWuEVNAXeneL8ObK2LU=; b=g1F5e1mw+SODSB0j6DMOZpxCitwgkHALV2I3i+VZg2MEroDVfyV/G7HwTUSOIQWMoC FAL3m1KjL6Ad120jRMoAyjjNhppocM8ADLI7JfkuS9Rm/0c/3YNilbszaHQu0pO8HW6u fXDsXgXRoHqqg9712+42/2cUaWpmTMiKaqdKszQhXe8PFKGGGXXPUT+hWnc+lUkWIMva lFwSMNIZfryQIX6pTr4VasbEcpE1FpuuyqDR+bnubVluCfVai8qHrybSn/czHFE0ruzN kNw1Fe5kL3oR5wLViA3NsV6kjy5lsa3YA30JVKcbdOaWj1C4i6XHqZkXH2yrmdXssL7T HIrA== X-Gm-Message-State: AA6/9Rmy+rg0C7uQVwo81oRRcmu63DLCyVXTQ4bQAxHajv6/Dwd3L18THQS1Oo5WWashfg== X-Received: by 10.194.58.81 with SMTP id o17mr29602398wjq.227.1476100442838; Mon, 10 Oct 2016 04:54:02 -0700 (PDT) Received: from donizetti.lan (94-39-150-81.adsl-ull.clienti.tiscali.it. [94.39.150.81]) by smtp.gmail.com with ESMTPSA id g9sm39619628wjk.25.2016.10.10.04.54.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 10 Oct 2016 04:54:02 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Mon, 10 Oct 2016 13:53:31 +0200 Message-Id: <1476100421-28772-4-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1476100421-28772-1-git-send-email-pbonzini@redhat.com> References: <1476100421-28772-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a00:1450:4010:c07::244 Subject: [Qemu-devel] [PATCH 03/13] virtio: move ioeventfd_started flag to VirtioBusState X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: cornelia.huck@de.ibm.com, borntraeger@de.ibm.com, famz@redhat.com, stefanha@redhat.com, mst@redhat.com Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" This simplifies the code and removes the ioeventfd_started and ioeventfd_set_started callback. The only difference is in how virtio-ccw handles an error---it doesn't disable ioeventfd forever anymore. It was the only backend to do so, and if desired this behavior should be implemented in virtio-bus.c. Instead of ioeventfd_started, the ioeventfd_assign callback now determines whether the virtio bus supports host notifiers. Reviewed-by: Stefan Hajnoczi Signed-off-by: Paolo Bonzini Reviewed-by: Cornelia Huck --- hw/block/dataplane/virtio-blk.c | 2 +- hw/s390x/virtio-ccw.c | 21 --------------------- hw/s390x/virtio-ccw.h | 1 - hw/scsi/virtio-scsi-dataplane.c | 2 +- hw/virtio/vhost.c | 2 +- hw/virtio/virtio-bus.c | 14 ++++++-------- hw/virtio/virtio-mmio.c | 18 ------------------ hw/virtio/virtio-pci.c | 17 ----------------- hw/virtio/virtio-pci.h | 1 - include/hw/virtio/virtio-bus.h | 17 +++++++---------- 10 files changed, 16 insertions(+), 79 deletions(-) diff --git a/hw/block/dataplane/virtio-blk.c b/hw/block/dataplane/virtio-blk.c index 704a763..9b268f4 100644 --- a/hw/block/dataplane/virtio-blk.c +++ b/hw/block/dataplane/virtio-blk.c @@ -93,7 +93,7 @@ void virtio_blk_data_plane_create(VirtIODevice *vdev, VirtIOBlkConf *conf, } /* Don't try if transport does not support notifiers. */ - if (!k->set_guest_notifiers || !k->ioeventfd_started) { + if (!k->set_guest_notifiers || !k->ioeventfd_assign) { error_setg(errp, "device is incompatible with dataplane " "(transport does not support notifiers)"); diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c index 672e6c4..bf5670c 100644 --- a/hw/s390x/virtio-ccw.c +++ b/hw/s390x/virtio-ccw.c @@ -59,25 +59,6 @@ static void virtio_ccw_stop_ioeventfd(VirtioCcwDevice *dev) virtio_bus_stop_ioeventfd(&dev->bus); } -static bool virtio_ccw_ioeventfd_started(DeviceState *d) -{ - VirtioCcwDevice *dev = VIRTIO_CCW_DEVICE(d); - - return dev->ioeventfd_started; -} - -static void virtio_ccw_ioeventfd_set_started(DeviceState *d, bool started, - bool err) -{ - VirtioCcwDevice *dev = VIRTIO_CCW_DEVICE(d); - - dev->ioeventfd_started = started; - if (err) { - /* Disable ioeventfd for this device. */ - dev->flags &= ~VIRTIO_CCW_FLAG_USE_IOEVENTFD; - } -} - static bool virtio_ccw_ioeventfd_disabled(DeviceState *d) { VirtioCcwDevice *dev = VIRTIO_CCW_DEVICE(d); @@ -1608,8 +1589,6 @@ static void virtio_ccw_bus_class_init(ObjectClass *klass, void *data) k->pre_plugged = virtio_ccw_pre_plugged; k->device_plugged = virtio_ccw_device_plugged; k->device_unplugged = virtio_ccw_device_unplugged; - k->ioeventfd_started = virtio_ccw_ioeventfd_started; - k->ioeventfd_set_started = virtio_ccw_ioeventfd_set_started; k->ioeventfd_disabled = virtio_ccw_ioeventfd_disabled; k->ioeventfd_assign = virtio_ccw_ioeventfd_assign; } diff --git a/hw/s390x/virtio-ccw.h b/hw/s390x/virtio-ccw.h index 327e75a..77d10f1 100644 --- a/hw/s390x/virtio-ccw.h +++ b/hw/s390x/virtio-ccw.h @@ -86,7 +86,6 @@ struct VirtioCcwDevice { int revision; uint32_t max_rev; VirtioBusState bus; - bool ioeventfd_started; uint32_t flags; uint8_t thinint_isc; AdapterRoutes routes; diff --git a/hw/scsi/virtio-scsi-dataplane.c b/hw/scsi/virtio-scsi-dataplane.c index b173b94..f537b4e 100644 --- a/hw/scsi/virtio-scsi-dataplane.c +++ b/hw/scsi/virtio-scsi-dataplane.c @@ -31,7 +31,7 @@ void virtio_scsi_set_iothread(VirtIOSCSI *s, IOThread *iothread) s->ctx = iothread_get_aio_context(vs->conf.iothread); /* Don't try if transport does not support notifiers. */ - if (!k->set_guest_notifiers || !k->ioeventfd_started) { + if (!k->set_guest_notifiers || !k->ioeventfd_assign) { fprintf(stderr, "virtio-scsi: Failed to set iothread " "(transport does not support notifiers)"); exit(1); diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index bd051ab..501a5f4 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -1190,7 +1190,7 @@ int vhost_dev_enable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev) VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus); int i, r, e; - if (!k->ioeventfd_started) { + if (!k->ioeventfd_assign) { error_report("binding does not support host notifiers"); r = -ENOSYS; goto fail; diff --git a/hw/virtio/virtio-bus.c b/hw/virtio/virtio-bus.c index 3607c29..97cdb11 100644 --- a/hw/virtio/virtio-bus.c +++ b/hw/virtio/virtio-bus.c @@ -192,10 +192,10 @@ void virtio_bus_start_ioeventfd(VirtioBusState *bus) VirtIODevice *vdev; int n, r; - if (!k->ioeventfd_started || k->ioeventfd_started(proxy)) { + if (!k->ioeventfd_assign || k->ioeventfd_disabled(proxy)) { return; } - if (bus->ioeventfd_disabled || k->ioeventfd_disabled(proxy)) { + if (bus->ioeventfd_started || bus->ioeventfd_disabled) { return; } vdev = virtio_bus_get_device(bus); @@ -208,7 +208,7 @@ void virtio_bus_start_ioeventfd(VirtioBusState *bus) goto assign_error; } } - k->ioeventfd_set_started(proxy, true, false); + bus->ioeventfd_started = true; return; assign_error: @@ -220,18 +220,16 @@ assign_error: r = set_host_notifier_internal(proxy, bus, n, false, false); assert(r >= 0); } - k->ioeventfd_set_started(proxy, false, true); error_report("%s: failed. Fallback to userspace (slower).", __func__); } void virtio_bus_stop_ioeventfd(VirtioBusState *bus) { - VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(bus); DeviceState *proxy = DEVICE(BUS(bus)->parent); VirtIODevice *vdev; int n, r; - if (!k->ioeventfd_started || !k->ioeventfd_started(proxy)) { + if (!bus->ioeventfd_started) { return; } vdev = virtio_bus_get_device(bus); @@ -242,7 +240,7 @@ void virtio_bus_stop_ioeventfd(VirtioBusState *bus) r = set_host_notifier_internal(proxy, bus, n, false, false); assert(r >= 0); } - k->ioeventfd_set_started(proxy, false, false); + bus->ioeventfd_started = false; } /* @@ -254,7 +252,7 @@ int virtio_bus_set_host_notifier(VirtioBusState *bus, int n, bool assign) VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(bus); DeviceState *proxy = DEVICE(BUS(bus)->parent); - if (!k->ioeventfd_started) { + if (!k->ioeventfd_assign) { return -ENOSYS; } bus->ioeventfd_disabled = assign; diff --git a/hw/virtio/virtio-mmio.c b/hw/virtio/virtio-mmio.c index 12a9e79..04a9655 100644 --- a/hw/virtio/virtio-mmio.c +++ b/hw/virtio/virtio-mmio.c @@ -89,25 +89,9 @@ typedef struct { uint32_t guest_page_shift; /* virtio-bus */ VirtioBusState bus; - bool ioeventfd_started; bool format_transport_address; } VirtIOMMIOProxy; -static bool virtio_mmio_ioeventfd_started(DeviceState *d) -{ - VirtIOMMIOProxy *proxy = VIRTIO_MMIO(d); - - return proxy->ioeventfd_started; -} - -static void virtio_mmio_ioeventfd_set_started(DeviceState *d, bool started, - bool err) -{ - VirtIOMMIOProxy *proxy = VIRTIO_MMIO(d); - - proxy->ioeventfd_started = started; -} - static bool virtio_mmio_ioeventfd_disabled(DeviceState *d) { return !kvm_eventfds_enabled(); @@ -547,8 +531,6 @@ static void virtio_mmio_bus_class_init(ObjectClass *klass, void *data) k->save_config = virtio_mmio_save_config; k->load_config = virtio_mmio_load_config; k->set_guest_notifiers = virtio_mmio_set_guest_notifiers; - k->ioeventfd_started = virtio_mmio_ioeventfd_started; - k->ioeventfd_set_started = virtio_mmio_ioeventfd_set_started; k->ioeventfd_disabled = virtio_mmio_ioeventfd_disabled; k->ioeventfd_assign = virtio_mmio_ioeventfd_assign; k->has_variable_vring_alignment = true; diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c index 580fe96..7752ed6 100644 --- a/hw/virtio/virtio-pci.c +++ b/hw/virtio/virtio-pci.c @@ -262,21 +262,6 @@ static int virtio_pci_load_queue(DeviceState *d, int n, QEMUFile *f) return 0; } -static bool virtio_pci_ioeventfd_started(DeviceState *d) -{ - VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d); - - return proxy->ioeventfd_started; -} - -static void virtio_pci_ioeventfd_set_started(DeviceState *d, bool started, - bool err) -{ - VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d); - - proxy->ioeventfd_started = started; -} - static bool virtio_pci_ioeventfd_disabled(DeviceState *d) { VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d); @@ -2531,8 +2516,6 @@ static void virtio_pci_bus_class_init(ObjectClass *klass, void *data) k->device_plugged = virtio_pci_device_plugged; k->device_unplugged = virtio_pci_device_unplugged; k->query_nvectors = virtio_pci_query_nvectors; - k->ioeventfd_started = virtio_pci_ioeventfd_started; - k->ioeventfd_set_started = virtio_pci_ioeventfd_set_started; k->ioeventfd_disabled = virtio_pci_ioeventfd_disabled; k->ioeventfd_assign = virtio_pci_ioeventfd_assign; } diff --git a/hw/virtio/virtio-pci.h b/hw/virtio/virtio-pci.h index 17ff195..7ef799a 100644 --- a/hw/virtio/virtio-pci.h +++ b/hw/virtio/virtio-pci.h @@ -158,7 +158,6 @@ struct VirtIOPCIProxy { uint32_t guest_features[2]; VirtIOPCIQueue vqs[VIRTIO_QUEUE_MAX]; - bool ioeventfd_started; VirtIOIRQFD *vector_irqfd; int nvqs_with_notifiers; VirtioBusState bus; diff --git a/include/hw/virtio/virtio-bus.h b/include/hw/virtio/virtio-bus.h index 4aabec4..f74ef1e 100644 --- a/include/hw/virtio/virtio-bus.h +++ b/include/hw/virtio/virtio-bus.h @@ -70,17 +70,9 @@ typedef struct VirtioBusClass { void (*device_unplugged)(DeviceState *d); int (*query_nvectors)(DeviceState *d); /* - * ioeventfd handling: if the transport implements ioeventfd_started, - * it must implement the other ioeventfd callbacks as well + * ioeventfd handling: if the transport implements ioeventfd_assign, + * it must implement ioeventfd_disabled as well. */ - /* Returns true if the ioeventfd has been started for the device. */ - bool (*ioeventfd_started)(DeviceState *d); - /* - * Sets the 'ioeventfd started' state after the ioeventfd has been - * started/stopped for the device. err signifies whether an error - * had occurred. - */ - void (*ioeventfd_set_started)(DeviceState *d, bool started, bool err); /* Returns true if the ioeventfd has been disabled for the device. */ bool (*ioeventfd_disabled)(DeviceState *d); /* @@ -106,6 +98,11 @@ struct VirtioBusState { * or dataplane. */ bool ioeventfd_disabled; + + /* + * Set if ioeventfd has been started. + */ + bool ioeventfd_started; }; void virtio_bus_device_plugged(VirtIODevice *vdev, Error **errp);