IB/hfi1: Do not update hcrc for a KDETH packet during fault injection
authorKaike Wan <kaike.wan@intel.com>
Mon, 15 Jul 2019 16:45:46 +0000 (12:45 -0400)
committerJason Gunthorpe <jgg@mellanox.com>
Mon, 22 Jul 2019 19:10:48 +0000 (16:10 -0300)
When a KDETH packet is subject to fault injection during transmission,
HCRC is supposed to be omitted from the packet so that the hardware on the
receiver side would drop the packet. When creating pbc, the PbcInsertHcrc
field is set to be PBC_IHCRC_NONE if the KDETH packet is subject to fault
injection, but overwritten with PBC_IHCRC_LKDETH when update_hcrc() is
called later.

This problem is fixed by not calling update_hcrc() when the packet is
subject to fault injection.

Fixes: 6b6cf9357f78 ("IB/hfi1: Set PbcInsertHcrc for TID RDMA packets")
Cc: <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/20190715164546.74174.99296.stgit@awfm-01.aw.intel.com
Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: Kaike Wan <kaike.wan@intel.com>
Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/hfi1/verbs.c

index c4b243f50c76d660b18922035c4f51ec8b89e177..f4ca436118abf490fc6793031e68e5b2e8053005 100644 (file)
@@ -873,16 +873,17 @@ int hfi1_verbs_send_dma(struct rvt_qp *qp, struct hfi1_pkt_state *ps,
                        else
                                pbc |= (ib_is_sc5(sc5) << PBC_DC_INFO_SHIFT);
 
-                       if (unlikely(hfi1_dbg_should_fault_tx(qp, ps->opcode)))
-                               pbc = hfi1_fault_tx(qp, ps->opcode, pbc);
                        pbc = create_pbc(ppd,
                                         pbc,
                                         qp->srate_mbps,
                                         vl,
                                         plen);
 
-                       /* Update HCRC based on packet opcode */
-                       pbc = update_hcrc(ps->opcode, pbc);
+                       if (unlikely(hfi1_dbg_should_fault_tx(qp, ps->opcode)))
+                               pbc = hfi1_fault_tx(qp, ps->opcode, pbc);
+                       else
+                               /* Update HCRC based on packet opcode */
+                               pbc = update_hcrc(ps->opcode, pbc);
                }
                tx->wqe = qp->s_wqe;
                ret = build_verbs_tx_desc(tx->sde, len, tx, ahg_info, pbc);
@@ -1029,12 +1030,12 @@ int hfi1_verbs_send_pio(struct rvt_qp *qp, struct hfi1_pkt_state *ps,
                else
                        pbc |= (ib_is_sc5(sc5) << PBC_DC_INFO_SHIFT);
 
+               pbc = create_pbc(ppd, pbc, qp->srate_mbps, vl, plen);
                if (unlikely(hfi1_dbg_should_fault_tx(qp, ps->opcode)))
                        pbc = hfi1_fault_tx(qp, ps->opcode, pbc);
-               pbc = create_pbc(ppd, pbc, qp->srate_mbps, vl, plen);
-
-               /* Update HCRC based on packet opcode */
-               pbc = update_hcrc(ps->opcode, pbc);
+               else
+                       /* Update HCRC based on packet opcode */
+                       pbc = update_hcrc(ps->opcode, pbc);
        }
        if (cb)
                iowait_pio_inc(&priv->s_iowait);