aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Marciniszyn <mike.marciniszyn@intel.com>2017-05-04 08:14:04 -0400
committerDoug Ledford <dledford@redhat.com>2017-05-04 19:31:46 -0400
commit688f21c0be9e3ddd6c5b2241daeb9fe978c0e081 (patch)
tree35a23885dbec15d72e12545b14913846e1d02cf2
parent02d1008bcf41c7eada7882df673ae3794f7bfea8 (diff)
IB/hfi1, IB/rdmavt: Move r_adefered to r_lock cache line
This field is causing excessive cache line bouncing. There are spare bytes in the r_lock cache line so the best approach is to make an rvt QP field and remove from the hfi1 priv field. Signed-off-by: Sebastian Sanchez <sebastian.sanchez@intel.com> Signed-off-by: Mike Marciniszyn <mike.marciniszyn@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/qp.c4
-rw-r--r--drivers/infiniband/hw/hfi1/rc.c13
-rw-r--r--drivers/infiniband/hw/hfi1/verbs.h1
-rw-r--r--include/rdma/rdmavt_qp.h1
4 files changed, 6 insertions, 13 deletions
diff --git a/drivers/infiniband/hw/hfi1/qp.c b/drivers/infiniband/hw/hfi1/qp.c
index 4573e4c9f35c..650305cc0373 100644
--- a/drivers/infiniband/hw/hfi1/qp.c
+++ b/drivers/infiniband/hw/hfi1/qp.c
@@ -731,9 +731,7 @@ void quiesce_qp(struct rvt_qp *qp)
731 731
732void notify_qp_reset(struct rvt_qp *qp) 732void notify_qp_reset(struct rvt_qp *qp)
733{ 733{
734 struct hfi1_qp_priv *priv = qp->priv; 734 qp->r_adefered = 0;
735
736 priv->r_adefered = 0;
737 clear_ahg(qp); 735 clear_ahg(qp);
738} 736}
739 737
diff --git a/drivers/infiniband/hw/hfi1/rc.c b/drivers/infiniband/hw/hfi1/rc.c
index 75a729cd0c3d..069bdaf061ab 100644
--- a/drivers/infiniband/hw/hfi1/rc.c
+++ b/drivers/infiniband/hw/hfi1/rc.c
@@ -727,10 +727,9 @@ void hfi1_send_rc_ack(struct hfi1_ctxtdata *rcd, struct rvt_qp *qp,
727 struct ib_header hdr; 727 struct ib_header hdr;
728 struct ib_other_headers *ohdr; 728 struct ib_other_headers *ohdr;
729 unsigned long flags; 729 unsigned long flags;
730 struct hfi1_qp_priv *priv = qp->priv;
731 730
732 /* clear the defer count */ 731 /* clear the defer count */
733 priv->r_adefered = 0; 732 qp->r_adefered = 0;
734 733
735 /* Don't send ACK or NAK if a RDMA read or atomic is pending. */ 734 /* Don't send ACK or NAK if a RDMA read or atomic is pending. */
736 if (qp->s_flags & RVT_S_RESP_PENDING) 735 if (qp->s_flags & RVT_S_RESP_PENDING)
@@ -1604,9 +1603,7 @@ static inline void rc_defered_ack(struct hfi1_ctxtdata *rcd,
1604 1603
1605static inline void rc_cancel_ack(struct rvt_qp *qp) 1604static inline void rc_cancel_ack(struct rvt_qp *qp)
1606{ 1605{
1607 struct hfi1_qp_priv *priv = qp->priv; 1606 qp->r_adefered = 0;
1608
1609 priv->r_adefered = 0;
1610 if (list_empty(&qp->rspwait)) 1607 if (list_empty(&qp->rspwait))
1611 return; 1608 return;
1612 list_del_init(&qp->rspwait); 1609 list_del_init(&qp->rspwait);
@@ -2314,13 +2311,11 @@ send_last:
2314 qp->r_nak_state = 0; 2311 qp->r_nak_state = 0;
2315 /* Send an ACK if requested or required. */ 2312 /* Send an ACK if requested or required. */
2316 if (psn & IB_BTH_REQ_ACK) { 2313 if (psn & IB_BTH_REQ_ACK) {
2317 struct hfi1_qp_priv *priv = qp->priv;
2318
2319 if (packet->numpkt == 0) { 2314 if (packet->numpkt == 0) {
2320 rc_cancel_ack(qp); 2315 rc_cancel_ack(qp);
2321 goto send_ack; 2316 goto send_ack;
2322 } 2317 }
2323 if (priv->r_adefered >= HFI1_PSN_CREDIT) { 2318 if (qp->r_adefered >= HFI1_PSN_CREDIT) {
2324 rc_cancel_ack(qp); 2319 rc_cancel_ack(qp);
2325 goto send_ack; 2320 goto send_ack;
2326 } 2321 }
@@ -2328,7 +2323,7 @@ send_last:
2328 rc_cancel_ack(qp); 2323 rc_cancel_ack(qp);
2329 goto send_ack; 2324 goto send_ack;
2330 } 2325 }
2331 priv->r_adefered++; 2326 qp->r_adefered++;
2332 rc_defered_ack(rcd, qp); 2327 rc_defered_ack(rcd, qp);
2333 } 2328 }
2334 return; 2329 return;
diff --git a/drivers/infiniband/hw/hfi1/verbs.h b/drivers/infiniband/hw/hfi1/verbs.h
index 52ff275caf54..c0913c6c8002 100644
--- a/drivers/infiniband/hw/hfi1/verbs.h
+++ b/drivers/infiniband/hw/hfi1/verbs.h
@@ -125,7 +125,6 @@ struct hfi1_qp_priv {
125 struct sdma_engine *s_sde; /* current sde */ 125 struct sdma_engine *s_sde; /* current sde */
126 struct send_context *s_sendcontext; /* current sendcontext */ 126 struct send_context *s_sendcontext; /* current sendcontext */
127 u8 s_sc; /* SC[0..4] for next packet */ 127 u8 s_sc; /* SC[0..4] for next packet */
128 u8 r_adefered; /* number of acks defered */
129 struct iowait s_iowait; 128 struct iowait s_iowait;
130 struct rvt_qp *owner; 129 struct rvt_qp *owner;
131}; 130};
diff --git a/include/rdma/rdmavt_qp.h b/include/rdma/rdmavt_qp.h
index 1d8141a88d3c..be6472e5b06b 100644
--- a/include/rdma/rdmavt_qp.h
+++ b/include/rdma/rdmavt_qp.h
@@ -324,6 +324,7 @@ struct rvt_qp {
324 u8 r_state; /* opcode of last packet received */ 324 u8 r_state; /* opcode of last packet received */
325 u8 r_flags; 325 u8 r_flags;
326 u8 r_head_ack_queue; /* index into s_ack_queue[] */ 326 u8 r_head_ack_queue; /* index into s_ack_queue[] */
327 u8 r_adefered; /* defered ack count */
327 328
328 struct list_head rspwait; /* link for waiting to respond */ 329 struct list_head rspwait; /* link for waiting to respond */
329 330