qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/3] virtio-scsi-dataplane: graceful fail
@ 2014-10-15 13:15 Cornelia Huck
  2014-10-15 13:15 ` [Qemu-devel] [PATCH 1/3] virtio-scsi: dataplane: print why starting failed Cornelia Huck
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Cornelia Huck @ 2014-10-15 13:15 UTC (permalink / raw)
  To: pbonzini, famz; +Cc: Cornelia Huck, qemu-devel

Hi,

these patches are practically a duplicate of the patches I did for
virtio-blk dataplane -- they don't convert to the error report
infrastructure, for example. The aim was to do the same changes
as for virtio-blk in order to avoid killing the whole guest if we
run e.g. out of file handles for the notifiers.

Untested (better get your kittens to a safe place before trying out),
but a git branch is available at

git://github.com/cohuck/qemu graceful-scsi-dataplane

Cornelia Huck (3):
  virtio-scsi: dataplane: print why starting failed
  virtio-scsi: dataplane: fail setup gracefully
  virtio-scsi: dataplane: stop trying on notifier error

 hw/scsi/virtio-scsi-dataplane.c | 92 +++++++++++++++++++++++++++++++++++------
 include/hw/virtio/virtio-scsi.h |  1 +
 2 files changed, 80 insertions(+), 13 deletions(-)

-- 
1.8.5.5

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH 1/3] virtio-scsi: dataplane: print why starting failed
  2014-10-15 13:15 [Qemu-devel] [PATCH 0/3] virtio-scsi-dataplane: graceful fail Cornelia Huck
@ 2014-10-15 13:15 ` Cornelia Huck
  2014-10-15 13:15 ` [Qemu-devel] [PATCH 2/3] virtio-scsi: dataplane: fail setup gracefully Cornelia Huck
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Cornelia Huck @ 2014-10-15 13:15 UTC (permalink / raw)
  To: pbonzini, famz; +Cc: Cornelia Huck, qemu-devel

Setting up guest or host notifiers may fail, but the user will have
no idea why: Let's print the error returned by the callback.

Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
---
 hw/scsi/virtio-scsi-dataplane.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/hw/scsi/virtio-scsi-dataplane.c b/hw/scsi/virtio-scsi-dataplane.c
index b778e05..e068297 100644
--- a/hw/scsi/virtio-scsi-dataplane.c
+++ b/hw/scsi/virtio-scsi-dataplane.c
@@ -45,10 +45,13 @@ static VirtIOSCSIVring *virtio_scsi_vring_init(VirtIOSCSI *s,
     BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(s)));
     VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
     VirtIOSCSIVring *r = g_slice_new(VirtIOSCSIVring);
+    int rc;
 
     /* Set up virtqueue notify */
-    if (k->set_host_notifier(qbus->parent, n, true) != 0) {
-        fprintf(stderr, "virtio-scsi: Failed to set host notifier\n");
+    rc = k->set_host_notifier(qbus->parent, n, true);
+    if (rc != 0) {
+        fprintf(stderr, "virtio-scsi: Failed to set host notifier (%d)\n",
+                rc);
         exit(1);
     }
     r->host_notifier = *virtio_queue_get_host_notifier(vq);
@@ -157,8 +160,8 @@ void virtio_scsi_dataplane_start(VirtIOSCSI *s)
     /* Set up guest notifier (irq) */
     rc = k->set_guest_notifiers(qbus->parent, vs->conf.num_queues + 2, true);
     if (rc != 0) {
-        fprintf(stderr, "virtio-scsi: Failed to set guest notifiers, "
-                "ensure -enable-kvm is set\n");
+        fprintf(stderr, "virtio-scsi: Failed to set guest notifiers (%d), "
+                "ensure -enable-kvm is set\n", rc);
         exit(1);
     }
 
-- 
1.8.5.5

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH 2/3] virtio-scsi: dataplane: fail setup gracefully
  2014-10-15 13:15 [Qemu-devel] [PATCH 0/3] virtio-scsi-dataplane: graceful fail Cornelia Huck
  2014-10-15 13:15 ` [Qemu-devel] [PATCH 1/3] virtio-scsi: dataplane: print why starting failed Cornelia Huck
@ 2014-10-15 13:15 ` Cornelia Huck
  2014-10-15 13:15 ` [Qemu-devel] [PATCH 3/3] virtio-scsi: dataplane: stop trying on notifier error Cornelia Huck
  2014-10-21 12:51 ` [Qemu-devel] [PATCH 0/3] virtio-scsi-dataplane: graceful fail Paolo Bonzini
  3 siblings, 0 replies; 5+ messages in thread
From: Cornelia Huck @ 2014-10-15 13:15 UTC (permalink / raw)
  To: pbonzini, famz; +Cc: Cornelia Huck, qemu-devel

The dataplane code is currently doing a hard exit on various setup
failures. In practice, this may mean that a guest suddenly dies after
a dataplane device failed to come up (e.g., when a file descriptor
limit is hit for the nth device).

Let's just try to unwind the setup instead and return.

Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
---
 hw/scsi/virtio-scsi-dataplane.c | 73 ++++++++++++++++++++++++++++++++++++-----
 1 file changed, 64 insertions(+), 9 deletions(-)

diff --git a/hw/scsi/virtio-scsi-dataplane.c b/hw/scsi/virtio-scsi-dataplane.c
index e068297..445219c 100644
--- a/hw/scsi/virtio-scsi-dataplane.c
+++ b/hw/scsi/virtio-scsi-dataplane.c
@@ -52,7 +52,7 @@ static VirtIOSCSIVring *virtio_scsi_vring_init(VirtIOSCSI *s,
     if (rc != 0) {
         fprintf(stderr, "virtio-scsi: Failed to set host notifier (%d)\n",
                 rc);
-        exit(1);
+        return NULL;
     }
     r->host_notifier = *virtio_queue_get_host_notifier(vq);
     r->guest_notifier = *virtio_queue_get_guest_notifier(vq);
@@ -62,9 +62,15 @@ static VirtIOSCSIVring *virtio_scsi_vring_init(VirtIOSCSI *s,
 
     if (!vring_setup(&r->vring, VIRTIO_DEVICE(s), n)) {
         fprintf(stderr, "virtio-scsi: VRing setup failed\n");
-        exit(1);
+        goto fail_vring;
     }
     return r;
+
+fail_vring:
+    aio_set_event_notifier(s->ctx, &r->host_notifier, NULL);
+    k->set_host_notifier(qbus->parent, n, false);
+    g_slice_free(VirtIOSCSIVring, r);
+    return NULL;
 }
 
 VirtIOSCSIReq *virtio_scsi_pop_req_vring(VirtIOSCSI *s,
@@ -140,6 +146,40 @@ static void virtio_scsi_iothread_handle_cmd(EventNotifier *notifier)
     }
 }
 
+/* assumes s->ctx held */
+static void virtio_scsi_clear_aio(VirtIOSCSI *s)
+{
+    VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(s);
+    int i;
+
+    if (s->ctrl_vring) {
+        aio_set_event_notifier(s->ctx, &s->ctrl_vring->host_notifier, NULL);
+    }
+    if (s->event_vring) {
+        aio_set_event_notifier(s->ctx, &s->event_vring->host_notifier, NULL);
+    }
+    for (i = 0; i < vs->conf.num_queues && s->cmd_vrings[i]; i++) {
+        aio_set_event_notifier(s->ctx, &s->cmd_vrings[i]->host_notifier, NULL);
+    }
+}
+
+static void virtio_scsi_vring_teardown(VirtIOSCSI *s)
+{
+    VirtIODevice *vdev = VIRTIO_DEVICE(s);
+    VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(s);
+    int i;
+
+    if (s->ctrl_vring) {
+        vring_teardown(&s->ctrl_vring->vring, vdev, 0);
+    }
+    if (s->event_vring) {
+        vring_teardown(&s->event_vring->vring, vdev, 1);
+    }
+    for (i = 0; i < vs->conf.num_queues && s->cmd_vrings[i]; i++) {
+        vring_teardown(&s->cmd_vrings[i]->vring, vdev, 2 + i);
+    }
+}
+
 /* Context: QEMU global mutex held */
 void virtio_scsi_dataplane_start(VirtIOSCSI *s)
 {
@@ -162,27 +202,47 @@ void virtio_scsi_dataplane_start(VirtIOSCSI *s)
     if (rc != 0) {
         fprintf(stderr, "virtio-scsi: Failed to set guest notifiers (%d), "
                 "ensure -enable-kvm is set\n", rc);
-        exit(1);
+        goto fail_guest_notifiers;
     }
 
     aio_context_acquire(s->ctx);
     s->ctrl_vring = virtio_scsi_vring_init(s, vs->ctrl_vq,
                                            virtio_scsi_iothread_handle_ctrl,
                                            0);
+    if (!s->ctrl_vring) {
+        goto fail_vrings;
+    }
     s->event_vring = virtio_scsi_vring_init(s, vs->event_vq,
                                             virtio_scsi_iothread_handle_event,
                                             1);
+    if (!s->event_vring) {
+        goto fail_vrings;
+    }
     s->cmd_vrings = g_malloc0(sizeof(VirtIOSCSIVring) * vs->conf.num_queues);
     for (i = 0; i < vs->conf.num_queues; i++) {
         s->cmd_vrings[i] =
             virtio_scsi_vring_init(s, vs->cmd_vqs[i],
                                    virtio_scsi_iothread_handle_cmd,
                                    i + 2);
+        if (!s->cmd_vrings[i]) {
+            goto fail_vrings;
+        }
     }
 
     aio_context_release(s->ctx);
     s->dataplane_starting = false;
     s->dataplane_started = true;
+
+fail_vrings:
+    virtio_scsi_clear_aio(s);
+    aio_context_release(s->ctx);
+    virtio_scsi_vring_teardown(s);
+    for (i = 0; i < vs->conf.num_queues + 2; i++) {
+        k->set_host_notifier(qbus->parent, i, false);
+    }
+    k->set_guest_notifiers(qbus->parent, vs->conf.num_queues + 2, false);
+fail_guest_notifiers:
+    s->dataplane_starting = false;
 }
 
 /* Context: QEMU global mutex held */
@@ -190,7 +250,6 @@ void virtio_scsi_dataplane_stop(VirtIOSCSI *s)
 {
     BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(s)));
     VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
-    VirtIODevice *vdev = VIRTIO_DEVICE(s);
     VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(s);
     int i;
 
@@ -215,11 +274,7 @@ void virtio_scsi_dataplane_stop(VirtIOSCSI *s)
     /* Sync vring state back to virtqueue so that non-dataplane request
      * processing can continue when we disable the host notifier below.
      */
-    vring_teardown(&s->ctrl_vring->vring, vdev, 0);
-    vring_teardown(&s->event_vring->vring, vdev, 1);
-    for (i = 0; i < vs->conf.num_queues; i++) {
-        vring_teardown(&s->cmd_vrings[i]->vring, vdev, 2 + i);
-    }
+    virtio_scsi_vring_teardown(s);
 
     for (i = 0; i < vs->conf.num_queues + 2; i++) {
         k->set_host_notifier(qbus->parent, i, false);
-- 
1.8.5.5

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH 3/3] virtio-scsi: dataplane: stop trying on notifier error
  2014-10-15 13:15 [Qemu-devel] [PATCH 0/3] virtio-scsi-dataplane: graceful fail Cornelia Huck
  2014-10-15 13:15 ` [Qemu-devel] [PATCH 1/3] virtio-scsi: dataplane: print why starting failed Cornelia Huck
  2014-10-15 13:15 ` [Qemu-devel] [PATCH 2/3] virtio-scsi: dataplane: fail setup gracefully Cornelia Huck
@ 2014-10-15 13:15 ` Cornelia Huck
  2014-10-21 12:51 ` [Qemu-devel] [PATCH 0/3] virtio-scsi-dataplane: graceful fail Paolo Bonzini
  3 siblings, 0 replies; 5+ messages in thread
From: Cornelia Huck @ 2014-10-15 13:15 UTC (permalink / raw)
  To: pbonzini, famz; +Cc: Cornelia Huck, qemu-devel

There's no use to constantly trying to enable dataplane if we failed
to set up guest or host notifiers, so fence it off in that case.
We'll try again if the device is reinitialized.

Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
---
 hw/scsi/virtio-scsi-dataplane.c | 8 ++++++++
 include/hw/virtio/virtio-scsi.h | 1 +
 2 files changed, 9 insertions(+)

diff --git a/hw/scsi/virtio-scsi-dataplane.c b/hw/scsi/virtio-scsi-dataplane.c
index 445219c..30366d9 100644
--- a/hw/scsi/virtio-scsi-dataplane.c
+++ b/hw/scsi/virtio-scsi-dataplane.c
@@ -52,6 +52,7 @@ static VirtIOSCSIVring *virtio_scsi_vring_init(VirtIOSCSI *s,
     if (rc != 0) {
         fprintf(stderr, "virtio-scsi: Failed to set host notifier (%d)\n",
                 rc);
+        s->dataplane_fenced = true;
         return NULL;
     }
     r->host_notifier = *virtio_queue_get_host_notifier(vq);
@@ -191,6 +192,7 @@ void virtio_scsi_dataplane_start(VirtIOSCSI *s)
 
     if (s->dataplane_started ||
         s->dataplane_starting ||
+        s->dataplane_fenced ||
         s->ctx != iothread_get_aio_context(vs->conf.iothread)) {
         return;
     }
@@ -202,6 +204,7 @@ void virtio_scsi_dataplane_start(VirtIOSCSI *s)
     if (rc != 0) {
         fprintf(stderr, "virtio-scsi: Failed to set guest notifiers (%d), "
                 "ensure -enable-kvm is set\n", rc);
+        s->dataplane_fenced = true;
         goto fail_guest_notifiers;
     }
 
@@ -253,6 +256,11 @@ void virtio_scsi_dataplane_stop(VirtIOSCSI *s)
     VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(s);
     int i;
 
+    /* Better luck next time. */
+    if (s->dataplane_fenced) {
+        s->dataplane_fenced = false;
+        return;
+    }
     if (!s->dataplane_started || s->dataplane_stopping) {
         return;
     }
diff --git a/include/hw/virtio/virtio-scsi.h b/include/hw/virtio/virtio-scsi.h
index d6e5e79..916c320 100644
--- a/include/hw/virtio/virtio-scsi.h
+++ b/include/hw/virtio/virtio-scsi.h
@@ -195,6 +195,7 @@ typedef struct VirtIOSCSI {
     bool dataplane_starting;
     bool dataplane_stopping;
     bool dataplane_disabled;
+    bool dataplane_fenced;
     Notifier migration_state_notifier;
 } VirtIOSCSI;
 
-- 
1.8.5.5

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [Qemu-devel] [PATCH 0/3] virtio-scsi-dataplane: graceful fail
  2014-10-15 13:15 [Qemu-devel] [PATCH 0/3] virtio-scsi-dataplane: graceful fail Cornelia Huck
                   ` (2 preceding siblings ...)
  2014-10-15 13:15 ` [Qemu-devel] [PATCH 3/3] virtio-scsi: dataplane: stop trying on notifier error Cornelia Huck
@ 2014-10-21 12:51 ` Paolo Bonzini
  3 siblings, 0 replies; 5+ messages in thread
From: Paolo Bonzini @ 2014-10-21 12:51 UTC (permalink / raw)
  To: Cornelia Huck, famz; +Cc: qemu-devel



On 10/15/2014 03:15 PM, Cornelia Huck wrote:
> Hi,
>
> these patches are practically a duplicate of the patches I did for
> virtio-blk dataplane -- they don't convert to the error report
> infrastructure, for example. The aim was to do the same changes
> as for virtio-blk in order to avoid killing the whole guest if we
> run e.g. out of file handles for the notifiers.
>
> Untested (better get your kittens to a safe place before trying out),
> but a git branch is available at
>
> git://github.com/cohuck/qemu graceful-scsi-dataplane
>
> Cornelia Huck (3):
>    virtio-scsi: dataplane: print why starting failed
>    virtio-scsi: dataplane: fail setup gracefully
>    virtio-scsi: dataplane: stop trying on notifier error
>
>   hw/scsi/virtio-scsi-dataplane.c | 92 +++++++++++++++++++++++++++++++++++------
>   include/hw/virtio/virtio-scsi.h |  1 +
>   2 files changed, 80 insertions(+), 13 deletions(-)
>

Thanks.  I'll test and send a pull request.

Paolo

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2014-10-21 12:51 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-10-15 13:15 [Qemu-devel] [PATCH 0/3] virtio-scsi-dataplane: graceful fail Cornelia Huck
2014-10-15 13:15 ` [Qemu-devel] [PATCH 1/3] virtio-scsi: dataplane: print why starting failed Cornelia Huck
2014-10-15 13:15 ` [Qemu-devel] [PATCH 2/3] virtio-scsi: dataplane: fail setup gracefully Cornelia Huck
2014-10-15 13:15 ` [Qemu-devel] [PATCH 3/3] virtio-scsi: dataplane: stop trying on notifier error Cornelia Huck
2014-10-21 12:51 ` [Qemu-devel] [PATCH 0/3] virtio-scsi-dataplane: graceful fail Paolo Bonzini

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).