IB/hfi1: Optimize packet type comparison using 9B and bypass code paths
authorSebastian Sanchez <sebastian.sanchez@intel.com>
Thu, 1 Feb 2018 18:46:23 +0000 (10:46 -0800)
committerJason Gunthorpe <jgg@mellanox.com>
Thu, 1 Feb 2018 22:43:28 +0000 (15:43 -0700)
The packet type comparison used to find out if a packet is a bypass
packet in the hot path is an expensive operation as seen in a profile.

Determine packet's pkey and migration bit through the bypass and 9B
code paths instead.

Reviewed-by: Don Hiatt <don.hiatt@intel.com>
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: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/hfi1/driver.c
drivers/infiniband/hw/hfi1/hfi.h
drivers/infiniband/hw/hfi1/ruc.c
drivers/infiniband/hw/hfi1/verbs.h
include/rdma/ib_hdrs.h

index 067b29f..bb1a41b 100644 (file)
@@ -1440,6 +1440,8 @@ static int hfi1_setup_9B_packet(struct hfi1_packet *packet)
        packet->extra_byte = 0;
        packet->fecn = ib_bth_get_fecn(packet->ohdr);
        packet->becn = ib_bth_get_becn(packet->ohdr);
+       packet->pkey = ib_bth_get_pkey(packet->ohdr);
+       packet->migrated = ib_bth_is_migration(packet->ohdr);
 
        return 0;
 drop:
@@ -1506,6 +1508,8 @@ static int hfi1_setup_bypass_packet(struct hfi1_packet *packet)
        packet->extra_byte = SIZE_OF_LT;
        packet->fecn = hfi1_16B_get_fecn(packet->hdr);
        packet->becn = hfi1_16B_get_becn(packet->hdr);
+       packet->pkey = hfi1_16B_get_pkey(packet->hdr);
+       packet->migrated = opa_bth_is_migration(packet->ohdr);
 
        if (hfi1_bypass_ingress_pkt_check(packet))
                goto drop;
index 5757d0e..2c257ac 100644 (file)
@@ -341,6 +341,7 @@ struct hfi1_packet {
        u32 slid;
        u16 tlen;
        s16 etail;
+       u16 pkey;
        u8 hlen;
        u8 numpkt;
        u8 rsize;
@@ -353,6 +354,7 @@ struct hfi1_packet {
        u8 opcode;
        bool becn;
        bool fecn;
+       bool migrated;
 };
 
 /* Packet types */
index 0cced9a..6434207 100644 (file)
@@ -225,19 +225,8 @@ int hfi1_ruc_check_hdr(struct hfi1_ibport *ibp, struct hfi1_packet *packet)
        u32 dlid = packet->dlid;
        u32 slid = packet->slid;
        u32 sl = packet->sl;
-       int migrated;
-       u32 bth0, bth1;
-       u16 pkey;
-
-       bth0 = be32_to_cpu(packet->ohdr->bth[0]);
-       bth1 = be32_to_cpu(packet->ohdr->bth[1]);
-       if (packet->etype == RHF_RCV_TYPE_BYPASS) {
-               pkey = hfi1_16B_get_pkey(packet->hdr);
-               migrated = bth1 & OPA_BTH_MIG_REQ;
-       } else {
-               pkey = ib_bth_get_pkey(packet->ohdr);
-               migrated = bth0 & IB_BTH_MIG_REQ;
-       }
+       bool migrated = packet->migrated;
+       u16 pkey = packet->pkey;
 
        if (qp->s_mig_state == IB_MIG_ARMED && migrated) {
                if (!packet->grh) {
index c2aeb32..ffc933e 100644 (file)
@@ -405,6 +405,11 @@ static inline void cacheless_memcpy(void *dst, void *src, size_t n)
        __copy_user_nocache(dst, (void __user *)src, n, 0);
 }
 
+static inline bool opa_bth_is_migration(struct ib_other_headers *ohdr)
+{
+       return ohdr->bth[1] & cpu_to_be32(OPA_BTH_MIG_REQ);
+}
+
 extern const enum ib_wc_opcode ib_hfi1_wc_opcode[];
 
 extern const u8 hdr_len_by_opcode[];
index 6b1e803..6ee9854 100644 (file)
@@ -335,4 +335,9 @@ static inline bool ib_bth_is_solicited(struct ib_other_headers *ohdr)
 {
        return ohdr->bth[0] & cpu_to_be32(IB_BTH_SOLICITED);
 }
+
+static inline bool ib_bth_is_migration(struct ib_other_headers *ohdr)
+{
+       return ohdr->bth[0] & cpu_to_be32(IB_BTH_MIG_REQ);
+}
 #endif                          /* IB_HDRS_H */