IB/hfi1: Access hfi1_ibport through rcd pointer
authorSebastian Sanchez <sebastian.sanchez@intel.com>
Wed, 8 Feb 2017 13:26:25 +0000 (05:26 -0800)
committerDoug Ledford <dledford@redhat.com>
Sun, 19 Feb 2017 14:18:35 +0000 (09:18 -0500)
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>
drivers/infiniband/hw/hfi1/driver.c
drivers/infiniband/hw/hfi1/hfi.h
drivers/infiniband/hw/hfi1/rc.c
drivers/infiniband/hw/hfi1/uc.c
drivers/infiniband/hw/hfi1/ud.c
drivers/infiniband/hw/hfi1/verbs.c

index 29db67371775ca9cfcbf65e9ee4389aff6d0d987..3881c951f6af308dd23266ab91c78c000fa4f5d9 100644 (file)
@@ -284,7 +284,7 @@ static void rcv_hdrerr(struct hfi1_ctxtdata *rcd, struct hfi1_pportdata *ppd,
        struct ib_header *rhdr = packet->hdr;
        u32 rte = rhf_rcv_type_err(packet->rhf);
        int lnh = be16_to_cpu(rhdr->lrh[0]) & 3;
-       struct hfi1_ibport *ibp = &ppd->ibport_data;
+       struct hfi1_ibport *ibp = rcd_to_iport(rcd);
        struct hfi1_devdata *dd = ppd->dd;
        struct rvt_dev_info *rdi = &dd->verbs_dev.rdi;
 
@@ -599,7 +599,7 @@ static void __prescan_rxq(struct hfi1_packet *packet)
 
        while (1) {
                struct hfi1_devdata *dd = rcd->dd;
-               struct hfi1_ibport *ibp = &rcd->ppd->ibport_data;
+               struct hfi1_ibport *ibp = rcd_to_iport(rcd);
                __le32 *rhf_addr = (__le32 *)rcd->rcvhdrq + mdata.ps_head +
                                         dd->rhf_offset;
                struct rvt_qp *qp;
index 751a0fb29fa57bb6546dc483496fa5ff309517de..1d0873914a6fb6a1cd6eed839a66877f8c2eba35 100644 (file)
@@ -1584,6 +1584,11 @@ static inline struct hfi1_ibport *to_iport(struct ib_device *ibdev, u8 port)
        return &dd->pport[pidx].ibport_data;
 }
 
+static inline struct hfi1_ibport *rcd_to_iport(struct hfi1_ctxtdata *rcd)
+{
+       return &rcd->ppd->ibport_data;
+}
+
 void hfi1_process_ecn_slowpath(struct rvt_qp *qp, struct hfi1_packet *pkt,
                               bool do_cnp);
 static inline bool process_ecn(struct rvt_qp *qp, struct hfi1_packet *pkt,
index 6446179843e9439498435980afe61f4ebc444935..abea4b7c92f44b11ee95ad0cdb5b3537274223b4 100644 (file)
@@ -841,7 +841,7 @@ bail_no_tx:
 void hfi1_send_rc_ack(struct hfi1_ctxtdata *rcd, struct rvt_qp *qp,
                      int is_fecn)
 {
-       struct hfi1_ibport *ibp = to_iport(qp->ibqp.device, qp->port_num);
+       struct hfi1_ibport *ibp = rcd_to_iport(rcd);
        struct hfi1_pportdata *ppd = ppd_from_ibp(ibp);
        u64 pbc, pbc_flags = 0;
        u16 lrh0;
@@ -1326,7 +1326,7 @@ static int do_rc_ack(struct rvt_qp *qp, u32 aeth, u32 psn, int opcode,
        if (aeth >> 29)
                ack_psn--;
        wqe = rvt_get_swqe_ptr(qp, qp->s_acked);
-       ibp = to_iport(qp->ibqp.device, qp->port_num);
+       ibp = rcd_to_iport(rcd);
 
        /*
         * 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,
                                 struct rvt_qp *qp, u32 opcode, u32 psn,
                                 int diff, struct hfi1_ctxtdata *rcd)
 {
-       struct hfi1_ibport *ibp = to_iport(qp->ibqp.device, qp->port_num);
+       struct hfi1_ibport *ibp = rcd_to_iport(rcd);
        struct rvt_ack_entry *e;
        unsigned long flags;
        u8 i, prev;
@@ -2100,7 +2100,7 @@ void hfi1_rc_rcv(struct hfi1_packet *packet)
        void *data = packet->ebuf;
        u32 tlen = packet->tlen;
        struct rvt_qp *qp = packet->qp;
-       struct hfi1_ibport *ibp = to_iport(qp->ibqp.device, qp->port_num);
+       struct hfi1_ibport *ibp = rcd_to_iport(rcd);
        struct ib_other_headers *ohdr = packet->ohdr;
        u32 bth0, opcode;
        u32 hdrsize = packet->hlen;
@@ -2552,7 +2552,7 @@ void hfi1_rc_hdrerr(
 {
        int has_grh = rcv_flags & HFI1_HAS_GRH;
        struct ib_other_headers *ohdr;
-       struct hfi1_ibport *ibp = to_iport(qp->ibqp.device, qp->port_num);
+       struct hfi1_ibport *ibp = rcd_to_iport(rcd);
        int diff;
        u32 opcode;
        u32 psn, bth0;
index b141a78ae38b66ce927086bd9a5bc1a3d62db4ab..74b7b2be458c180db978b59af7adcdc00d1edac2 100644 (file)
@@ -296,7 +296,7 @@ bail_no_tx:
  */
 void hfi1_uc_rcv(struct hfi1_packet *packet)
 {
-       struct hfi1_ibport *ibp = &packet->rcd->ppd->ibport_data;
+       struct hfi1_ibport *ibp = rcd_to_iport(packet->rcd);
        struct ib_header *hdr = packet->hdr;
        u32 rcv_flags = packet->rcv_flags;
        void *data = packet->ebuf;
index c071955c0272ebfd2126a0490c00cd4a13e1d3f1..6d81d79720b09b8799602c500ff1d7f2953020fc 100644 (file)
@@ -672,7 +672,7 @@ void hfi1_ud_rcv(struct hfi1_packet *packet)
        u32 src_qp;
        u16 dlid, pkey;
        int mgmt_pkey_idx = -1;
-       struct hfi1_ibport *ibp = &packet->rcd->ppd->ibport_data;
+       struct hfi1_ibport *ibp = rcd_to_iport(packet->rcd);
        struct hfi1_pportdata *ppd = ppd_from_ibp(ibp);
        struct ib_header *hdr = packet->hdr;
        u32 rcv_flags = packet->rcv_flags;
index 95ed4d6da510c474fce19f92fcdda8098fd926b1..b937a23efc755162dac2a3d444e081afe704145b 100644 (file)
@@ -576,7 +576,7 @@ void hfi1_ib_rcv(struct hfi1_packet *packet)
        struct ib_header *hdr = packet->hdr;
        u32 tlen = packet->tlen;
        struct hfi1_pportdata *ppd = rcd->ppd;
-       struct hfi1_ibport *ibp = &ppd->ibport_data;
+       struct hfi1_ibport *ibp = rcd_to_iport(rcd);
        struct rvt_dev_info *rdi = &ppd->dd->verbs_dev.rdi;
        opcode_handler packet_handler;
        unsigned long flags;
@@ -1910,7 +1910,7 @@ void hfi1_unregister_ib_device(struct hfi1_devdata *dd)
 
 void hfi1_cnp_rcv(struct hfi1_packet *packet)
 {
-       struct hfi1_ibport *ibp = &packet->rcd->ppd->ibport_data;
+       struct hfi1_ibport *ibp = rcd_to_iport(packet->rcd);
        struct hfi1_pportdata *ppd = ppd_from_ibp(ibp);
        struct ib_header *hdr = packet->hdr;
        struct rvt_qp *qp = packet->qp;