aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDon Hiatt <don.hiatt@intel.com>2016-12-07 22:33:00 -0500
committerDoug Ledford <dledford@redhat.com>2016-12-11 15:25:13 -0500
commite922ae06e90a37ab0b212f844e8aed9b6021cf21 (patch)
tree92eac529bee79a8c012645d91eb14bd734c9868b
parentb7481944b06e99dc84f4c7da2681ac89528b2020 (diff)
IB/hfi1: Remove dependence on qp->s_cur_size
The qp->s_cur_size field assumes that the S_BUSY bit protects the field from modification after the slock is dropped. Scaling the send engine to multiple cores would break that assumption. Correct the issue by carrying the payload size in the txreq structure. Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com> Signed-off-by: Don Hiatt <don.hiatt@intel.com> Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r--drivers/infiniband/hw/hfi1/rc.c4
-rw-r--r--drivers/infiniband/hw/hfi1/ruc.c4
-rw-r--r--drivers/infiniband/hw/hfi1/uc.c2
-rw-r--r--drivers/infiniband/hw/hfi1/ud.c2
-rw-r--r--drivers/infiniband/hw/hfi1/verbs.c6
-rw-r--r--drivers/infiniband/hw/hfi1/verbs_txreq.h1
6 files changed, 10 insertions, 9 deletions
diff --git a/drivers/infiniband/hw/hfi1/rc.c b/drivers/infiniband/hw/hfi1/rc.c
index aaca8588e199..e69161e007db 100644
--- a/drivers/infiniband/hw/hfi1/rc.c
+++ b/drivers/infiniband/hw/hfi1/rc.c
@@ -351,7 +351,7 @@ normal:
351 qp->s_rdma_ack_cnt++; 351 qp->s_rdma_ack_cnt++;
352 qp->s_hdrwords = hwords; 352 qp->s_hdrwords = hwords;
353 ps->s_txreq->sde = priv->s_sde; 353 ps->s_txreq->sde = priv->s_sde;
354 qp->s_cur_size = len; 354 ps->s_txreq->s_cur_size = len;
355 hfi1_make_ruc_header(qp, ohdr, bth0, bth2, middle, ps); 355 hfi1_make_ruc_header(qp, ohdr, bth0, bth2, middle, ps);
356 /* pbc */ 356 /* pbc */
357 ps->s_txreq->hdr_dwords = qp->s_hdrwords + 2; 357 ps->s_txreq->hdr_dwords = qp->s_hdrwords + 2;
@@ -802,7 +802,7 @@ int hfi1_make_rc_req(struct rvt_qp *qp, struct hfi1_pkt_state *ps)
802 qp->s_hdrwords = hwords; 802 qp->s_hdrwords = hwords;
803 ps->s_txreq->sde = priv->s_sde; 803 ps->s_txreq->sde = priv->s_sde;
804 qp->s_cur_sge = ss; 804 qp->s_cur_sge = ss;
805 qp->s_cur_size = len; 805 ps->s_txreq->s_cur_size = len;
806 hfi1_make_ruc_header( 806 hfi1_make_ruc_header(
807 qp, 807 qp,
808 ohdr, 808 ohdr,
diff --git a/drivers/infiniband/hw/hfi1/ruc.c b/drivers/infiniband/hw/hfi1/ruc.c
index 5a70e91b5191..2ec3e908691b 100644
--- a/drivers/infiniband/hw/hfi1/ruc.c
+++ b/drivers/infiniband/hw/hfi1/ruc.c
@@ -767,8 +767,8 @@ void hfi1_make_ruc_header(struct rvt_qp *qp, struct ib_other_headers *ohdr,
767 u32 bth1; 767 u32 bth1;
768 768
769 /* Construct the header. */ 769 /* Construct the header. */
770 extra_bytes = -qp->s_cur_size & 3; 770 extra_bytes = -ps->s_txreq->s_cur_size & 3;
771 nwords = (qp->s_cur_size + extra_bytes) >> 2; 771 nwords = (ps->s_txreq->s_cur_size + extra_bytes) >> 2;
772 lrh0 = HFI1_LRH_BTH; 772 lrh0 = HFI1_LRH_BTH;
773 if (unlikely(qp->remote_ah_attr.ah_flags & IB_AH_GRH)) { 773 if (unlikely(qp->remote_ah_attr.ah_flags & IB_AH_GRH)) {
774 qp->s_hdrwords += hfi1_make_grh(ibp, 774 qp->s_hdrwords += hfi1_make_grh(ibp,
diff --git a/drivers/infiniband/hw/hfi1/uc.c b/drivers/infiniband/hw/hfi1/uc.c
index 5e6d1bac4914..d062c3537f7c 100644
--- a/drivers/infiniband/hw/hfi1/uc.c
+++ b/drivers/infiniband/hw/hfi1/uc.c
@@ -259,7 +259,7 @@ int hfi1_make_uc_req(struct rvt_qp *qp, struct hfi1_pkt_state *ps)
259 qp->s_hdrwords = hwords; 259 qp->s_hdrwords = hwords;
260 ps->s_txreq->sde = priv->s_sde; 260 ps->s_txreq->sde = priv->s_sde;
261 qp->s_cur_sge = &qp->s_sge; 261 qp->s_cur_sge = &qp->s_sge;
262 qp->s_cur_size = len; 262 ps->s_txreq->s_cur_size = len;
263 hfi1_make_ruc_header(qp, ohdr, bth0 | (qp->s_state << 24), 263 hfi1_make_ruc_header(qp, ohdr, bth0 | (qp->s_state << 24),
264 mask_psn(qp->s_psn++), middle, ps); 264 mask_psn(qp->s_psn++), middle, ps);
265 /* pbc */ 265 /* pbc */
diff --git a/drivers/infiniband/hw/hfi1/ud.c b/drivers/infiniband/hw/hfi1/ud.c
index 97ae24b6314c..d742ac1af947 100644
--- a/drivers/infiniband/hw/hfi1/ud.c
+++ b/drivers/infiniband/hw/hfi1/ud.c
@@ -354,7 +354,7 @@ int hfi1_make_ud_req(struct rvt_qp *qp, struct hfi1_pkt_state *ps)
354 354
355 /* header size in 32-bit words LRH+BTH+DETH = (8+12+8)/4. */ 355 /* header size in 32-bit words LRH+BTH+DETH = (8+12+8)/4. */
356 qp->s_hdrwords = 7; 356 qp->s_hdrwords = 7;
357 qp->s_cur_size = wqe->length; 357 ps->s_txreq->s_cur_size = wqe->length;
358 qp->s_cur_sge = &qp->s_sge; 358 qp->s_cur_sge = &qp->s_sge;
359 qp->s_srate = ah_attr->static_rate; 359 qp->s_srate = ah_attr->static_rate;
360 qp->srate_mbps = ib_rate_to_mbps(qp->s_srate); 360 qp->srate_mbps = ib_rate_to_mbps(qp->s_srate);
diff --git a/drivers/infiniband/hw/hfi1/verbs.c b/drivers/infiniband/hw/hfi1/verbs.c
index 09132582e09c..65f2f1d76fc8 100644
--- a/drivers/infiniband/hw/hfi1/verbs.c
+++ b/drivers/infiniband/hw/hfi1/verbs.c
@@ -895,7 +895,7 @@ int hfi1_verbs_send_dma(struct rvt_qp *qp, struct hfi1_pkt_state *ps,
895 struct hfi1_ahg_info *ahg_info = priv->s_ahg; 895 struct hfi1_ahg_info *ahg_info = priv->s_ahg;
896 u32 hdrwords = qp->s_hdrwords; 896 u32 hdrwords = qp->s_hdrwords;
897 struct rvt_sge_state *ss = qp->s_cur_sge; 897 struct rvt_sge_state *ss = qp->s_cur_sge;
898 u32 len = qp->s_cur_size; 898 u32 len = ps->s_txreq->s_cur_size;
899 u32 plen = hdrwords + ((len + 3) >> 2) + 2; /* includes pbc */ 899 u32 plen = hdrwords + ((len + 3) >> 2) + 2; /* includes pbc */
900 struct hfi1_ibdev *dev = ps->dev; 900 struct hfi1_ibdev *dev = ps->dev;
901 struct hfi1_pportdata *ppd = ps->ppd; 901 struct hfi1_pportdata *ppd = ps->ppd;
@@ -1012,7 +1012,7 @@ int hfi1_verbs_send_pio(struct rvt_qp *qp, struct hfi1_pkt_state *ps,
1012 struct hfi1_qp_priv *priv = qp->priv; 1012 struct hfi1_qp_priv *priv = qp->priv;
1013 u32 hdrwords = qp->s_hdrwords; 1013 u32 hdrwords = qp->s_hdrwords;
1014 struct rvt_sge_state *ss = qp->s_cur_sge; 1014 struct rvt_sge_state *ss = qp->s_cur_sge;
1015 u32 len = qp->s_cur_size; 1015 u32 len = ps->s_txreq->s_cur_size;
1016 u32 dwords = (len + 3) >> 2; 1016 u32 dwords = (len + 3) >> 2;
1017 u32 plen = hdrwords + dwords + 2; /* includes pbc */ 1017 u32 plen = hdrwords + dwords + 2; /* includes pbc */
1018 struct hfi1_pportdata *ppd = ps->ppd; 1018 struct hfi1_pportdata *ppd = ps->ppd;
@@ -1240,7 +1240,7 @@ static inline send_routine get_send_routine(struct rvt_qp *qp,
1240 u8 op = get_opcode(h); 1240 u8 op = get_opcode(h);
1241 1241
1242 if (piothreshold && 1242 if (piothreshold &&
1243 qp->s_cur_size <= min(piothreshold, qp->pmtu) && 1243 tx->s_cur_size <= min(piothreshold, qp->pmtu) &&
1244 (BIT(op & OPMASK) & pio_opmask[op >> 5]) && 1244 (BIT(op & OPMASK) & pio_opmask[op >> 5]) &&
1245 iowait_sdma_pending(&priv->s_iowait) == 0 && 1245 iowait_sdma_pending(&priv->s_iowait) == 0 &&
1246 !sdma_txreq_built(&tx->txreq)) 1246 !sdma_txreq_built(&tx->txreq))
diff --git a/drivers/infiniband/hw/hfi1/verbs_txreq.h b/drivers/infiniband/hw/hfi1/verbs_txreq.h
index 5660897593ba..76216f2ef35a 100644
--- a/drivers/infiniband/hw/hfi1/verbs_txreq.h
+++ b/drivers/infiniband/hw/hfi1/verbs_txreq.h
@@ -65,6 +65,7 @@ struct verbs_txreq {
65 struct sdma_engine *sde; 65 struct sdma_engine *sde;
66 struct send_context *psc; 66 struct send_context *psc;
67 u16 hdr_dwords; 67 u16 hdr_dwords;
68 u16 s_cur_size;
68}; 69};
69 70
70struct hfi1_ibdev; 71struct hfi1_ibdev;