aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Sanchez <sebastian.sanchez@intel.com>2017-02-08 08:26:25 -0500
committerDoug Ledford <dledford@redhat.com>2017-02-19 09:18:35 -0500
commitf3e862cb6894389a35d0beb10f73d62eb3317beb (patch)
tree2b9790fbcd778bedf92aa9f45b9a4a2375961d24
parenta8715b97d63718fc5c4daebc465407c259aea265 (diff)
IB/hfi1: Access hfi1_ibport through rcd pointer
Receive code paths use the QP's device and port number to access the struct hfi1_ibport. When an instance of struct hfi1_ctxtdata is present, it can be used to access struct hfi1_ibport through a pointer. This makes struct hfi1_ibport lookup time faster as an array doesn't have to be indexed and access fields in other cache-lines. Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com> Signed-off-by: Sebastian Sanchez <sebastian.sanchez@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/driver.c4
-rw-r--r--drivers/infiniband/hw/hfi1/hfi.h5
-rw-r--r--drivers/infiniband/hw/hfi1/rc.c10
-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.c4
6 files changed, 16 insertions, 11 deletions
diff --git a/drivers/infiniband/hw/hfi1/driver.c b/drivers/infiniband/hw/hfi1/driver.c
index 29db67371775..3881c951f6af 100644
--- a/drivers/infiniband/hw/hfi1/driver.c
+++ b/drivers/infiniband/hw/hfi1/driver.c
@@ -284,7 +284,7 @@ static void rcv_hdrerr(struct hfi1_ctxtdata *rcd, struct hfi1_pportdata *ppd,
284 struct ib_header *rhdr = packet->hdr; 284 struct ib_header *rhdr = packet->hdr;
285 u32 rte = rhf_rcv_type_err(packet->rhf); 285 u32 rte = rhf_rcv_type_err(packet->rhf);
286 int lnh = be16_to_cpu(rhdr->lrh[0]) & 3; 286 int lnh = be16_to_cpu(rhdr->lrh[0]) & 3;
287 struct hfi1_ibport *ibp = &ppd->ibport_data; 287 struct hfi1_ibport *ibp = rcd_to_iport(rcd);
288 struct hfi1_devdata *dd = ppd->dd; 288 struct hfi1_devdata *dd = ppd->dd;
289 struct rvt_dev_info *rdi = &dd->verbs_dev.rdi; 289 struct rvt_dev_info *rdi = &dd->verbs_dev.rdi;
290 290
@@ -599,7 +599,7 @@ static void __prescan_rxq(struct hfi1_packet *packet)
599 599
600 while (1) { 600 while (1) {
601 struct hfi1_devdata *dd = rcd->dd; 601 struct hfi1_devdata *dd = rcd->dd;
602 struct hfi1_ibport *ibp = &rcd->ppd->ibport_data; 602 struct hfi1_ibport *ibp = rcd_to_iport(rcd);
603 __le32 *rhf_addr = (__le32 *)rcd->rcvhdrq + mdata.ps_head + 603 __le32 *rhf_addr = (__le32 *)rcd->rcvhdrq + mdata.ps_head +
604 dd->rhf_offset; 604 dd->rhf_offset;
605 struct rvt_qp *qp; 605 struct rvt_qp *qp;
diff --git a/drivers/infiniband/hw/hfi1/hfi.h b/drivers/infiniband/hw/hfi1/hfi.h
index 751a0fb29fa5..1d0873914a6f 100644
--- a/drivers/infiniband/hw/hfi1/hfi.h
+++ b/drivers/infiniband/hw/hfi1/hfi.h
@@ -1584,6 +1584,11 @@ static inline struct hfi1_ibport *to_iport(struct ib_device *ibdev, u8 port)
1584 return &dd->pport[pidx].ibport_data; 1584 return &dd->pport[pidx].ibport_data;
1585} 1585}
1586 1586
1587static inline struct hfi1_ibport *rcd_to_iport(struct hfi1_ctxtdata *rcd)
1588{
1589 return &rcd->ppd->ibport_data;
1590}
1591
1587void hfi1_process_ecn_slowpath(struct rvt_qp *qp, struct hfi1_packet *pkt, 1592void hfi1_process_ecn_slowpath(struct rvt_qp *qp, struct hfi1_packet *pkt,
1588 bool do_cnp); 1593 bool do_cnp);
1589static inline bool process_ecn(struct rvt_qp *qp, struct hfi1_packet *pkt, 1594static inline bool process_ecn(struct rvt_qp *qp, struct hfi1_packet *pkt,
diff --git a/drivers/infiniband/hw/hfi1/rc.c b/drivers/infiniband/hw/hfi1/rc.c
index 6446179843e9..abea4b7c92f4 100644
--- a/drivers/infiniband/hw/hfi1/rc.c
+++ b/drivers/infiniband/hw/hfi1/rc.c
@@ -841,7 +841,7 @@ bail_no_tx:
841void hfi1_send_rc_ack(struct hfi1_ctxtdata *rcd, struct rvt_qp *qp, 841void hfi1_send_rc_ack(struct hfi1_ctxtdata *rcd, struct rvt_qp *qp,
842 int is_fecn) 842 int is_fecn)
843{ 843{
844 struct hfi1_ibport *ibp = to_iport(qp->ibqp.device, qp->port_num); 844 struct hfi1_ibport *ibp = rcd_to_iport(rcd);
845 struct hfi1_pportdata *ppd = ppd_from_ibp(ibp); 845 struct hfi1_pportdata *ppd = ppd_from_ibp(ibp);
846 u64 pbc, pbc_flags = 0; 846 u64 pbc, pbc_flags = 0;
847 u16 lrh0; 847 u16 lrh0;
@@ -1326,7 +1326,7 @@ static int do_rc_ack(struct rvt_qp *qp, u32 aeth, u32 psn, int opcode,
1326 if (aeth >> 29) 1326 if (aeth >> 29)
1327 ack_psn--; 1327 ack_psn--;
1328 wqe = rvt_get_swqe_ptr(qp, qp->s_acked); 1328 wqe = rvt_get_swqe_ptr(qp, qp->s_acked);
1329 ibp = to_iport(qp->ibqp.device, qp->port_num); 1329 ibp = rcd_to_iport(rcd);
1330 1330
1331 /* 1331 /*
1332 * The MSN might be for a later WQE than the PSN indicates so 1332 * The MSN might be for a later WQE than the PSN indicates so
@@ -1791,7 +1791,7 @@ static noinline int rc_rcv_error(struct ib_other_headers *ohdr, void *data,
1791 struct rvt_qp *qp, u32 opcode, u32 psn, 1791 struct rvt_qp *qp, u32 opcode, u32 psn,
1792 int diff, struct hfi1_ctxtdata *rcd) 1792 int diff, struct hfi1_ctxtdata *rcd)
1793{ 1793{
1794 struct hfi1_ibport *ibp = to_iport(qp->ibqp.device, qp->port_num); 1794 struct hfi1_ibport *ibp = rcd_to_iport(rcd);
1795 struct rvt_ack_entry *e; 1795 struct rvt_ack_entry *e;
1796 unsigned long flags; 1796 unsigned long flags;
1797 u8 i, prev; 1797 u8 i, prev;
@@ -2100,7 +2100,7 @@ void hfi1_rc_rcv(struct hfi1_packet *packet)
2100 void *data = packet->ebuf; 2100 void *data = packet->ebuf;
2101 u32 tlen = packet->tlen; 2101 u32 tlen = packet->tlen;
2102 struct rvt_qp *qp = packet->qp; 2102 struct rvt_qp *qp = packet->qp;
2103 struct hfi1_ibport *ibp = to_iport(qp->ibqp.device, qp->port_num); 2103 struct hfi1_ibport *ibp = rcd_to_iport(rcd);
2104 struct ib_other_headers *ohdr = packet->ohdr; 2104 struct ib_other_headers *ohdr = packet->ohdr;
2105 u32 bth0, opcode; 2105 u32 bth0, opcode;
2106 u32 hdrsize = packet->hlen; 2106 u32 hdrsize = packet->hlen;
@@ -2552,7 +2552,7 @@ void hfi1_rc_hdrerr(
2552{ 2552{
2553 int has_grh = rcv_flags & HFI1_HAS_GRH; 2553 int has_grh = rcv_flags & HFI1_HAS_GRH;
2554 struct ib_other_headers *ohdr; 2554 struct ib_other_headers *ohdr;
2555 struct hfi1_ibport *ibp = to_iport(qp->ibqp.device, qp->port_num); 2555 struct hfi1_ibport *ibp = rcd_to_iport(rcd);
2556 int diff; 2556 int diff;
2557 u32 opcode; 2557 u32 opcode;
2558 u32 psn, bth0; 2558 u32 psn, bth0;
diff --git a/drivers/infiniband/hw/hfi1/uc.c b/drivers/infiniband/hw/hfi1/uc.c
index b141a78ae38b..74b7b2be458c 100644
--- a/drivers/infiniband/hw/hfi1/uc.c
+++ b/drivers/infiniband/hw/hfi1/uc.c
@@ -296,7 +296,7 @@ bail_no_tx:
296 */ 296 */
297void hfi1_uc_rcv(struct hfi1_packet *packet) 297void hfi1_uc_rcv(struct hfi1_packet *packet)
298{ 298{
299 struct hfi1_ibport *ibp = &packet->rcd->ppd->ibport_data; 299 struct hfi1_ibport *ibp = rcd_to_iport(packet->rcd);
300 struct ib_header *hdr = packet->hdr; 300 struct ib_header *hdr = packet->hdr;
301 u32 rcv_flags = packet->rcv_flags; 301 u32 rcv_flags = packet->rcv_flags;
302 void *data = packet->ebuf; 302 void *data = packet->ebuf;
diff --git a/drivers/infiniband/hw/hfi1/ud.c b/drivers/infiniband/hw/hfi1/ud.c
index c071955c0272..6d81d79720b0 100644
--- a/drivers/infiniband/hw/hfi1/ud.c
+++ b/drivers/infiniband/hw/hfi1/ud.c
@@ -672,7 +672,7 @@ void hfi1_ud_rcv(struct hfi1_packet *packet)
672 u32 src_qp; 672 u32 src_qp;
673 u16 dlid, pkey; 673 u16 dlid, pkey;
674 int mgmt_pkey_idx = -1; 674 int mgmt_pkey_idx = -1;
675 struct hfi1_ibport *ibp = &packet->rcd->ppd->ibport_data; 675 struct hfi1_ibport *ibp = rcd_to_iport(packet->rcd);
676 struct hfi1_pportdata *ppd = ppd_from_ibp(ibp); 676 struct hfi1_pportdata *ppd = ppd_from_ibp(ibp);
677 struct ib_header *hdr = packet->hdr; 677 struct ib_header *hdr = packet->hdr;
678 u32 rcv_flags = packet->rcv_flags; 678 u32 rcv_flags = packet->rcv_flags;
diff --git a/drivers/infiniband/hw/hfi1/verbs.c b/drivers/infiniband/hw/hfi1/verbs.c
index 95ed4d6da510..b937a23efc75 100644
--- a/drivers/infiniband/hw/hfi1/verbs.c
+++ b/drivers/infiniband/hw/hfi1/verbs.c
@@ -576,7 +576,7 @@ void hfi1_ib_rcv(struct hfi1_packet *packet)
576 struct ib_header *hdr = packet->hdr; 576 struct ib_header *hdr = packet->hdr;
577 u32 tlen = packet->tlen; 577 u32 tlen = packet->tlen;
578 struct hfi1_pportdata *ppd = rcd->ppd; 578 struct hfi1_pportdata *ppd = rcd->ppd;
579 struct hfi1_ibport *ibp = &ppd->ibport_data; 579 struct hfi1_ibport *ibp = rcd_to_iport(rcd);
580 struct rvt_dev_info *rdi = &ppd->dd->verbs_dev.rdi; 580 struct rvt_dev_info *rdi = &ppd->dd->verbs_dev.rdi;
581 opcode_handler packet_handler; 581 opcode_handler packet_handler;
582 unsigned long flags; 582 unsigned long flags;
@@ -1910,7 +1910,7 @@ void hfi1_unregister_ib_device(struct hfi1_devdata *dd)
1910 1910
1911void hfi1_cnp_rcv(struct hfi1_packet *packet) 1911void hfi1_cnp_rcv(struct hfi1_packet *packet)
1912{ 1912{
1913 struct hfi1_ibport *ibp = &packet->rcd->ppd->ibport_data; 1913 struct hfi1_ibport *ibp = rcd_to_iport(packet->rcd);
1914 struct hfi1_pportdata *ppd = ppd_from_ibp(ibp); 1914 struct hfi1_pportdata *ppd = ppd_from_ibp(ibp);
1915 struct ib_header *hdr = packet->hdr; 1915 struct ib_header *hdr = packet->hdr;
1916 struct rvt_qp *qp = packet->qp; 1916 struct rvt_qp *qp = packet->qp;