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:
parent
24f0ab0102
commit
0ed5493e43
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user