|
@@ -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;
|
|
|
}
|
|
|
|