]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.14-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 27 Jun 2015 00:56:42 +0000 (17:56 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 27 Jun 2015 00:56:42 +0000 (17:56 -0700)
added patches:
lpfc-add-iotag-memory-barrier.patch

queue-3.14/lpfc-add-iotag-memory-barrier.patch [new file with mode: 0644]
queue-3.14/series

diff --git a/queue-3.14/lpfc-add-iotag-memory-barrier.patch b/queue-3.14/lpfc-add-iotag-memory-barrier.patch
new file mode 100644 (file)
index 0000000..ae21bb0
--- /dev/null
@@ -0,0 +1,67 @@
+From 27f344eb15dd0da80ebec80c7245e8c85043f841 Mon Sep 17 00:00:00 2001
+From: James Smart <james.smart@emulex.com>
+Date: Wed, 7 May 2014 17:16:46 -0400
+Subject: lpfc: Add iotag memory barrier
+
+From: James Smart <james.smart@emulex.com>
+
+commit 27f344eb15dd0da80ebec80c7245e8c85043f841 upstream.
+
+Add a memory barrier to ensure the valid bit is read before
+any of the cqe payload is read. This fixes an issue seen
+on Power where the cqe payload was getting loaded before
+the valid bit. When this occurred, we saw an iotag out of
+range error when a command completed, but since the iotag
+looked invalid the command didn't get completed to scsi core.
+Later we hit the command timeout, attempted to abort the command,
+then waited for the aborted command to get returned. Since the
+adapter already returned the command, we timeout waiting,
+and end up escalating EEH all the way to host reset. This
+patch fixes this issue.
+
+Signed-off-by: Brian King <brking@linux.vnet.ibm.com>
+Signed-off-by: James Smart <james.smart@emulex.com>
+Signed-off-by: Christoph Hellwig <hch@lst.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/scsi/lpfc/lpfc_sli.c |   21 +++++++++++++++++++++
+ 1 file changed, 21 insertions(+)
+
+--- a/drivers/scsi/lpfc/lpfc_sli.c
++++ b/drivers/scsi/lpfc/lpfc_sli.c
+@@ -265,6 +265,16 @@ lpfc_sli4_eq_get(struct lpfc_queue *q)
+               return NULL;
+       q->hba_index = idx;
++
++      /*
++       * insert barrier for instruction interlock : data from the hardware
++       * must have the valid bit checked before it can be copied and acted
++       * upon. Given what was seen in lpfc_sli4_cq_get() of speculative
++       * instructions allowing action on content before valid bit checked,
++       * add barrier here as well. May not be needed as "content" is a
++       * single 32-bit entity here (vs multi word structure for cq's).
++       */
++      mb();
+       return eqe;
+ }
+@@ -370,6 +380,17 @@ lpfc_sli4_cq_get(struct lpfc_queue *q)
+       cqe = q->qe[q->hba_index].cqe;
+       q->hba_index = idx;
++
++      /*
++       * insert barrier for instruction interlock : data from the hardware
++       * must have the valid bit checked before it can be copied and acted
++       * upon. Speculative instructions were allowing a bcopy at the start
++       * of lpfc_sli4_fp_handle_wcqe(), which is called immediately
++       * after our return, to copy data before the valid bit check above
++       * was done. As such, some of the copied data was stale. The barrier
++       * ensures the check is before any data is copied.
++       */
++      mb();
+       return cqe;
+ }
index 6b5974403c5fade26ad69a797ac9b802ff3873dd..977c000e99345e26a6c7e613ff10c7311a9f8271 100644 (file)
@@ -4,3 +4,4 @@ drm-mgag200-reject-non-character-cell-aligned-mode-widths.patch
 ath3k-add-support-of-0489-e076-ar3012-device.patch
 ath3k-add-support-of-13d3-3474-ar3012-device.patch
 pipe-iovec-fix-memory-corruption-when-retrying-atomi-3.14.patch
+lpfc-add-iotag-memory-barrier.patch