|
@@ -906,6 +906,18 @@ static int bnx2x_rx_int(struct bnx2x_fastpath *fp, int budget)
|
|
|
bd_prod = RX_BD(bd_prod);
|
|
|
bd_cons = RX_BD(bd_cons);
|
|
|
|
|
|
+ /* A rmb() is required to ensure that the CQE is not read
|
|
|
+ * before it is written by the adapter DMA. PCI ordering
|
|
|
+ * rules will make sure the other fields are written before
|
|
|
+ * the marker at the end of struct eth_fast_path_rx_cqe
|
|
|
+ * but without rmb() a weakly ordered processor can process
|
|
|
+ * stale data. Without the barrier TPA state-machine might
|
|
|
+ * enter inconsistent state and kernel stack might be
|
|
|
+ * provided with incorrect packet description - these lead
|
|
|
+ * to various kernel crashed.
|
|
|
+ */
|
|
|
+ rmb();
|
|
|
+
|
|
|
cqe_fp_flags = cqe_fp->type_error_flags;
|
|
|
cqe_fp_type = cqe_fp_flags & ETH_FAST_PATH_RX_CQE_TYPE;
|
|
|
|