RDMA/rxe: Add a responder state for atomic reply
authorBob Pearson <rpearsonhpe@gmail.com>
Mon, 6 Jun 2022 14:38:34 +0000 (09:38 -0500)
committerJason Gunthorpe <jgg@nvidia.com>
Thu, 30 Jun 2022 16:54:04 +0000 (13:54 -0300)
Add a responder state for atomic reply similar to read reply and rename
process_atomic() rxe_atomic_reply(). In preparation for merging the normal
and retry atomic responder flows.

Link: https://lore.kernel.org/r/20220606143836.3323-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_resp.c

index bc84aad..66d4d02 100644 (file)
@@ -21,6 +21,7 @@ enum resp_states {
        RESPST_CHK_RKEY,
        RESPST_EXECUTE,
        RESPST_READ_REPLY,
+       RESPST_ATOMIC_REPLY,
        RESPST_COMPLETE,
        RESPST_ACKNOWLEDGE,
        RESPST_CLEANUP,
@@ -55,6 +56,7 @@ static char *resp_state_name[] = {
        [RESPST_CHK_RKEY]                       = "CHK_RKEY",
        [RESPST_EXECUTE]                        = "EXECUTE",
        [RESPST_READ_REPLY]                     = "READ_REPLY",
+       [RESPST_ATOMIC_REPLY]                   = "ATOMIC_REPLY",
        [RESPST_COMPLETE]                       = "COMPLETE",
        [RESPST_ACKNOWLEDGE]                    = "ACKNOWLEDGE",
        [RESPST_CLEANUP]                        = "CLEANUP",
@@ -552,8 +554,8 @@ out:
 /* Guarantee atomicity of atomic operations at the machine level. */
 static DEFINE_SPINLOCK(atomic_ops_lock);
 
-static enum resp_states process_atomic(struct rxe_qp *qp,
-                                      struct rxe_pkt_info *pkt)
+static enum resp_states rxe_atomic_reply(struct rxe_qp *qp,
+                                        struct rxe_pkt_info *pkt)
 {
        u64 *vaddr;
        enum resp_states ret;
@@ -585,7 +587,16 @@ static enum resp_states process_atomic(struct rxe_qp *qp,
 
        spin_unlock_bh(&atomic_ops_lock);
 
-       ret = RESPST_NONE;
+       qp->resp.msn++;
+
+       /* next expected psn, read handles this separately */
+       qp->resp.psn = (pkt->psn + 1) & BTH_PSN_MASK;
+       qp->resp.ack_psn = qp->resp.psn;
+
+       qp->resp.opcode = pkt->opcode;
+       qp->resp.status = IB_WC_SUCCESS;
+
+       ret = RESPST_ACKNOWLEDGE;
 out:
        return ret;
 }
@@ -857,9 +868,7 @@ static enum resp_states execute(struct rxe_qp *qp, struct rxe_pkt_info *pkt)
                qp->resp.msn++;
                return RESPST_READ_REPLY;
        } else if (pkt->mask & RXE_ATOMIC_MASK) {
-               err = process_atomic(qp, pkt);
-               if (err)
-                       return err;
+               return RESPST_ATOMIC_REPLY;
        } else {
                /* Unreachable */
                WARN_ON_ONCE(1);
@@ -1323,6 +1332,9 @@ int rxe_responder(void *arg)
                case RESPST_READ_REPLY:
                        state = read_reply(qp, pkt);
                        break;
+               case RESPST_ATOMIC_REPLY:
+                       state = rxe_atomic_reply(qp, pkt);
+                       break;
                case RESPST_ACKNOWLEDGE:
                        state = acknowledge(qp, pkt);
                        break;