diff options
author | Mike Marciniszyn <mike.marciniszyn@intel.com> | 2017-05-04 08:14:04 -0400 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2017-05-04 19:31:46 -0400 |
commit | 688f21c0be9e3ddd6c5b2241daeb9fe978c0e081 (patch) | |
tree | 35a23885dbec15d72e12545b14913846e1d02cf2 | |
parent | 02d1008bcf41c7eada7882df673ae3794f7bfea8 (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.c | 4 | ||||
-rw-r--r-- | drivers/infiniband/hw/hfi1/rc.c | 13 | ||||
-rw-r--r-- | drivers/infiniband/hw/hfi1/verbs.h | 1 | ||||
-rw-r--r-- | include/rdma/rdmavt_qp.h | 1 |
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 | ||
732 | void notify_qp_reset(struct rvt_qp *qp) | 732 | void 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 | ||
1605 | static inline void rc_cancel_ack(struct rvt_qp *qp) | 1604 | static 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 | ||