RDMA/rxe: Add a responder state for atomic reply

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>
This commit is contained in:
Bob Pearson 2022-06-06 09:38:34 -05:00 committed by Jason Gunthorpe
parent 24f0ab0102
commit 0ed5493e43

View File

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