diff options
author | Sebastian Sanchez <sebastian.sanchez@intel.com> | 2017-02-08 08:26:25 -0500 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2017-02-19 09:18:35 -0500 |
commit | f3e862cb6894389a35d0beb10f73d62eb3317beb (patch) | |
tree | 2b9790fbcd778bedf92aa9f45b9a4a2375961d24 | |
parent | a8715b97d63718fc5c4daebc465407c259aea265 (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.c | 4 | ||||
-rw-r--r-- | drivers/infiniband/hw/hfi1/hfi.h | 5 | ||||
-rw-r--r-- | drivers/infiniband/hw/hfi1/rc.c | 10 | ||||
-rw-r--r-- | drivers/infiniband/hw/hfi1/uc.c | 2 | ||||
-rw-r--r-- | drivers/infiniband/hw/hfi1/ud.c | 2 | ||||
-rw-r--r-- | drivers/infiniband/hw/hfi1/verbs.c | 4 |
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 | ||
1587 | static inline struct hfi1_ibport *rcd_to_iport(struct hfi1_ctxtdata *rcd) | ||
1588 | { | ||
1589 | return &rcd->ppd->ibport_data; | ||
1590 | } | ||
1591 | |||
1587 | void hfi1_process_ecn_slowpath(struct rvt_qp *qp, struct hfi1_packet *pkt, | 1592 | void hfi1_process_ecn_slowpath(struct rvt_qp *qp, struct hfi1_packet *pkt, |
1588 | bool do_cnp); | 1593 | bool do_cnp); |
1589 | static inline bool process_ecn(struct rvt_qp *qp, struct hfi1_packet *pkt, | 1594 | static 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: | |||
841 | void hfi1_send_rc_ack(struct hfi1_ctxtdata *rcd, struct rvt_qp *qp, | 841 | void 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 | */ |
297 | void hfi1_uc_rcv(struct hfi1_packet *packet) | 297 | void 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 | ||
1911 | void hfi1_cnp_rcv(struct hfi1_packet *packet) | 1911 | void 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; |