RDMA//rxe: Optimize send path in rxe_resp.c
authorBob Pearson <rpearsonhpe@gmail.com>
Tue, 30 May 2023 22:13:31 +0000 (17:13 -0500)
committerJason Gunthorpe <jgg@nvidia.com>
Fri, 9 Jun 2023 16:18:52 +0000 (13:18 -0300)
Bypass calling check_rkey() in rxe_resp.c for non-rdma messages.

Link: https://lore.kernel.org/r/20230530221334.89432-3-rpearsonhpe@gmail.com
Signed-off-by: Bob Pearson <rpearsonhpe@gmail.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/sw/rxe/rxe_opcode.h
drivers/infiniband/sw/rxe/rxe_resp.c

index cea4e0a..5686b69 100644 (file)
@@ -91,6 +91,9 @@ enum rxe_hdr_mask {
        RXE_READ_OR_ATOMIC_MASK = (RXE_READ_MASK | RXE_ATOMIC_MASK),
        RXE_WRITE_OR_SEND_MASK  = (RXE_WRITE_MASK | RXE_SEND_MASK),
        RXE_READ_OR_WRITE_MASK  = (RXE_READ_MASK | RXE_WRITE_MASK),
+       RXE_RDMA_OP_MASK        = (RXE_READ_MASK | RXE_WRITE_MASK |
+                                  RXE_ATOMIC_WRITE_MASK | RXE_FLUSH_MASK |
+                                  RXE_ATOMIC_MASK),
 };
 
 #define OPCODE_NONE            (-1)
index b92c41c..0729920 100644 (file)
@@ -387,7 +387,10 @@ static enum resp_states rxe_resp_check_length(struct rxe_qp *qp,
                }
        }
 
-       return RESPST_CHK_RKEY;
+       if (pkt->mask & RXE_RDMA_OP_MASK)
+               return RESPST_CHK_RKEY;
+       else
+               return RESPST_EXECUTE;
 }
 
 /* if the reth length field is zero we can assume nothing
@@ -434,6 +437,10 @@ static enum resp_states check_rkey(struct rxe_qp *qp,
        enum resp_states state;
        int access = 0;
 
+       /* parse RETH or ATMETH header for first/only packets
+        * for va, length, rkey, etc. or use current value for
+        * middle/last packets.
+        */
        if (pkt->mask & (RXE_READ_OR_WRITE_MASK | RXE_ATOMIC_WRITE_MASK)) {
                if (pkt->mask & RXE_RETH_MASK)
                        qp_resp_from_reth(qp, pkt);
@@ -454,7 +461,8 @@ static enum resp_states check_rkey(struct rxe_qp *qp,
                qp_resp_from_atmeth(qp, pkt);
                access = IB_ACCESS_REMOTE_ATOMIC;
        } else {
-               return RESPST_EXECUTE;
+               /* shouldn't happen */
+               WARN_ON(1);
        }
 
        /* A zero-byte read or write op is not required to