]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.10-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 7 Jul 2014 03:06:35 +0000 (20:06 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 7 Jul 2014 03:06:35 +0000 (20:06 -0700)
added patches:
ibmvscsi-abort-init-sequence-during-error-recovery.patch
ibmvscsi-add-memory-barriers-for-send-receive.patch
virtio-scsi-avoid-cancelling-uninitialized-work-items.patch
virtio-scsi-fix-various-bad-behavior-on-aborted-requests.patch

queue-3.10/ibmvscsi-abort-init-sequence-during-error-recovery.patch [new file with mode: 0644]
queue-3.10/ibmvscsi-add-memory-barriers-for-send-receive.patch [new file with mode: 0644]
queue-3.10/series
queue-3.10/virtio-scsi-avoid-cancelling-uninitialized-work-items.patch [new file with mode: 0644]
queue-3.10/virtio-scsi-fix-various-bad-behavior-on-aborted-requests.patch [new file with mode: 0644]

diff --git a/queue-3.10/ibmvscsi-abort-init-sequence-during-error-recovery.patch b/queue-3.10/ibmvscsi-abort-init-sequence-during-error-recovery.patch
new file mode 100644 (file)
index 0000000..6ef5ff5
--- /dev/null
@@ -0,0 +1,36 @@
+From 9ee755974bea2f9880e517ec985dc9dede1b3a36 Mon Sep 17 00:00:00 2001
+From: Brian King <brking@linux.vnet.ibm.com>
+Date: Fri, 23 May 2014 10:52:10 -0500
+Subject: ibmvscsi: Abort init sequence during error recovery
+
+From: Brian King <brking@linux.vnet.ibm.com>
+
+commit 9ee755974bea2f9880e517ec985dc9dede1b3a36 upstream.
+
+If a CRQ reset is triggered for some reason while in the middle
+of performing VSCSI adapter initialization, we don't want to
+call the done function for the initialization MAD commands as
+this will only result in two threads attempting initialization
+at the same time, resulting in failures.
+
+Signed-off-by: Brian King <brking@linux.vnet.ibm.com>
+Acked-by: Nathan Fontenot <nfont@linux.vnet.ibm.com>
+Signed-off-by: Christoph Hellwig <hch@lst.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/scsi/ibmvscsi/ibmvscsi.c |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/drivers/scsi/ibmvscsi/ibmvscsi.c
++++ b/drivers/scsi/ibmvscsi/ibmvscsi.c
+@@ -794,7 +794,8 @@ static void purge_requests(struct ibmvsc
+                                      evt->hostdata->dev);
+                       if (evt->cmnd_done)
+                               evt->cmnd_done(evt->cmnd);
+-              } else if (evt->done)
++              } else if (evt->done && evt->crq.format != VIOSRP_MAD_FORMAT &&
++                         evt->iu.srp.login_req.opcode != SRP_LOGIN_REQ)
+                       evt->done(evt);
+               free_event_struct(&evt->hostdata->pool, evt);
+               spin_lock_irqsave(hostdata->host->host_lock, flags);
diff --git a/queue-3.10/ibmvscsi-add-memory-barriers-for-send-receive.patch b/queue-3.10/ibmvscsi-add-memory-barriers-for-send-receive.patch
new file mode 100644 (file)
index 0000000..6c92d7d
--- /dev/null
@@ -0,0 +1,48 @@
+From 7114aae02742d6b5c5a0d39a41deb61d415d3717 Mon Sep 17 00:00:00 2001
+From: Brian King <brking@linux.vnet.ibm.com>
+Date: Fri, 23 May 2014 10:52:11 -0500
+Subject: ibmvscsi: Add memory barriers for send / receive
+
+From: Brian King <brking@linux.vnet.ibm.com>
+
+commit 7114aae02742d6b5c5a0d39a41deb61d415d3717 upstream.
+
+Add a memory barrier prior to sending a new command to the VIOS
+to ensure the VIOS does not receive stale data in the command buffer.
+Also add a memory barrier when processing the CRQ for completed commands.
+
+Signed-off-by: Brian King <brking@linux.vnet.ibm.com>
+Acked-by: Nathan Fontenot <nfont@linux.vnet.ibm.com>
+Signed-off-by: Christoph Hellwig <hch@lst.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/scsi/ibmvscsi/ibmvscsi.c |   10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+--- a/drivers/scsi/ibmvscsi/ibmvscsi.c
++++ b/drivers/scsi/ibmvscsi/ibmvscsi.c
+@@ -185,6 +185,11 @@ static struct viosrp_crq *crq_queue_next
+       if (crq->valid & 0x80) {
+               if (++queue->cur == queue->size)
+                       queue->cur = 0;
++
++              /* Ensure the read of the valid bit occurs before reading any
++               * other bits of the CRQ entry
++               */
++              rmb();
+       } else
+               crq = NULL;
+       spin_unlock_irqrestore(&queue->lock, flags);
+@@ -203,6 +208,11 @@ static int ibmvscsi_send_crq(struct ibmv
+ {
+       struct vio_dev *vdev = to_vio_dev(hostdata->dev);
++      /*
++       * Ensure the command buffer is flushed to memory before handing it
++       * over to the VIOS to prevent it from fetching any stale data.
++       */
++      mb();
+       return plpar_hcall_norets(H_SEND_CRQ, vdev->unit_address, word1, word2);
+ }
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..76865e9f0da50ba1f7c24e84e8fe63058bc1bfdc 100644 (file)
@@ -0,0 +1,4 @@
+ibmvscsi-abort-init-sequence-during-error-recovery.patch
+ibmvscsi-add-memory-barriers-for-send-receive.patch
+virtio-scsi-avoid-cancelling-uninitialized-work-items.patch
+virtio-scsi-fix-various-bad-behavior-on-aborted-requests.patch
diff --git a/queue-3.10/virtio-scsi-avoid-cancelling-uninitialized-work-items.patch b/queue-3.10/virtio-scsi-avoid-cancelling-uninitialized-work-items.patch
new file mode 100644 (file)
index 0000000..9867b0a
--- /dev/null
@@ -0,0 +1,49 @@
+From cdda0e5acbb78f7b777049f8c27899e5c5bb368f Mon Sep 17 00:00:00 2001
+From: Paolo Bonzini <pbonzini@redhat.com>
+Date: Wed, 4 Jun 2014 13:34:56 +0200
+Subject: virtio-scsi: avoid cancelling uninitialized work items
+
+From: Paolo Bonzini <pbonzini@redhat.com>
+
+commit cdda0e5acbb78f7b777049f8c27899e5c5bb368f upstream.
+
+Calling the workqueue interface on uninitialized work items isn't a
+good idea even if they're zeroed. It's not failing catastrophically only
+through happy accidents.
+
+Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
+Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
+Signed-off-by: Christoph Hellwig <hch@lst.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/scsi/virtio_scsi.c |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+--- a/drivers/scsi/virtio_scsi.c
++++ b/drivers/scsi/virtio_scsi.c
+@@ -288,6 +288,8 @@ static void virtscsi_ctrl_done(struct vi
+       virtscsi_vq_done(vscsi, &vscsi->ctrl_vq, virtscsi_complete_free);
+ };
++static void virtscsi_handle_event(struct work_struct *work);
++
+ static int virtscsi_kick_event(struct virtio_scsi *vscsi,
+                              struct virtio_scsi_event_node *event_node)
+ {
+@@ -295,6 +297,7 @@ static int virtscsi_kick_event(struct vi
+       struct scatterlist sg;
+       unsigned long flags;
++      INIT_WORK(&event_node->work, virtscsi_handle_event);
+       sg_init_one(&sg, &event_node->event, sizeof(struct virtio_scsi_event));
+       spin_lock_irqsave(&vscsi->event_vq.vq_lock, flags);
+@@ -412,7 +415,6 @@ static void virtscsi_complete_event(stru
+ {
+       struct virtio_scsi_event_node *event_node = buf;
+-      INIT_WORK(&event_node->work, virtscsi_handle_event);
+       schedule_work(&event_node->work);
+ }
diff --git a/queue-3.10/virtio-scsi-fix-various-bad-behavior-on-aborted-requests.patch b/queue-3.10/virtio-scsi-fix-various-bad-behavior-on-aborted-requests.patch
new file mode 100644 (file)
index 0000000..92a8296
--- /dev/null
@@ -0,0 +1,62 @@
+From 8faeb529b2dabb9df691d614dda18910a43d05c9 Mon Sep 17 00:00:00 2001
+From: Paolo Bonzini <pbonzini@redhat.com>
+Date: Wed, 4 Jun 2014 13:34:58 +0200
+Subject: virtio-scsi: fix various bad behavior on aborted requests
+
+From: Paolo Bonzini <pbonzini@redhat.com>
+
+commit 8faeb529b2dabb9df691d614dda18910a43d05c9 upstream.
+
+Even though the virtio-scsi spec guarantees that all requests related
+to the TMF will have been completed by the time the TMF itself completes,
+the request queue's callback might not have run yet.  This causes requests
+to be completed more than once, and as a result triggers a variety of
+BUGs or oopses.
+
+Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
+Reviewed-by: Venkatesh Srinivas <venkateshs@google.com>
+Signed-off-by: Christoph Hellwig <hch@lst.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/scsi/virtio_scsi.c |   22 ++++++++++++++++++++++
+ 1 file changed, 22 insertions(+)
+
+--- a/drivers/scsi/virtio_scsi.c
++++ b/drivers/scsi/virtio_scsi.c
+@@ -270,6 +270,16 @@ static void virtscsi_req_done(struct vir
+       virtscsi_vq_done(vscsi, req_vq, virtscsi_complete_cmd);
+ };
++static void virtscsi_poll_requests(struct virtio_scsi *vscsi)
++{
++      int i, num_vqs;
++
++      num_vqs = vscsi->num_queues;
++      for (i = 0; i < num_vqs; i++)
++              virtscsi_vq_done(vscsi, &vscsi->req_vqs[i],
++                               virtscsi_complete_cmd);
++}
++
+ static void virtscsi_complete_free(struct virtio_scsi *vscsi, void *buf)
+ {
+       struct virtio_scsi_cmd *cmd = buf;
+@@ -604,6 +614,18 @@ static int virtscsi_tmf(struct virtio_sc
+           cmd->resp.tmf.response == VIRTIO_SCSI_S_FUNCTION_SUCCEEDED)
+               ret = SUCCESS;
++      /*
++       * The spec guarantees that all requests related to the TMF have
++       * been completed, but the callback might not have run yet if
++       * we're using independent interrupts (e.g. MSI).  Poll the
++       * virtqueues once.
++       *
++       * In the abort case, sc->scsi_done will do nothing, because
++       * the block layer must have detected a timeout and as a result
++       * REQ_ATOM_COMPLETE has been set.
++       */
++      virtscsi_poll_requests(vscsi);
++
+ out:
+       mempool_free(cmd, virtscsi_cmd_pool);
+       return ret;