aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/sw/rxe/rxe_resp.c
diff options
context:
space:
mode:
authorBob Pearson <rpearsonhpe@gmail.com>2022-06-06 09:38:36 -0500
committerJason Gunthorpe <jgg@nvidia.com>2022-06-30 14:00:21 -0300
commit8264411595fabf0455ed45badf1be612493db681 (patch)
tree3dcfe36406fcf5ddd088e31ec7e109935fb76abe /drivers/infiniband/sw/rxe/rxe_resp.c
parent220e842815f90c678394ae747e3da98348c4ba28 (diff)
downloadlinux-8264411595fabf0455ed45badf1be612493db681.tar.gz
RDMA/rxe: Move atomic original value to res
Move the saved original value to the atomic responder resource. This replaces saving it in the qp. In preparation for merging the normal and retry atomic responder flows. Link: https://lore.kernel.org/r/20220606143836.3323-5-rpearsonhpe@gmail.com Signed-off-by: Bob Pearson <rpearsonhpe@gmail.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Diffstat (limited to 'drivers/infiniband/sw/rxe/rxe_resp.c')
-rw-r--r--drivers/infiniband/sw/rxe/rxe_resp.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/drivers/infiniband/sw/rxe/rxe_resp.c b/drivers/infiniband/sw/rxe/rxe_resp.c
index 74892568cf6c..5399e2a571b5 100644
--- a/drivers/infiniband/sw/rxe/rxe_resp.c
+++ b/drivers/infiniband/sw/rxe/rxe_resp.c
@@ -579,6 +579,7 @@ static enum resp_states rxe_atomic_reply(struct rxe_qp *qp,
enum resp_states ret;
struct rxe_mr *mr = qp->resp.mr;
struct resp_res *res = qp->resp.res;
+ u64 value;
if (!res) {
res = rxe_prepare_atomic_res(qp, pkt);
@@ -599,16 +600,16 @@ static enum resp_states rxe_atomic_reply(struct rxe_qp *qp,
}
spin_lock_bh(&atomic_ops_lock);
-
- qp->resp.atomic_orig = *vaddr;
+ res->atomic.orig_val = value = *vaddr;
if (pkt->opcode == IB_OPCODE_RC_COMPARE_SWAP) {
- if (*vaddr == atmeth_comp(pkt))
- *vaddr = atmeth_swap_add(pkt);
+ if (value == atmeth_comp(pkt))
+ value = atmeth_swap_add(pkt);
} else {
- *vaddr += atmeth_swap_add(pkt);
+ value += atmeth_swap_add(pkt);
}
+ *vaddr = value;
spin_unlock_bh(&atomic_ops_lock);
qp->resp.msn++;
@@ -663,7 +664,7 @@ static struct sk_buff *prepare_ack_packet(struct rxe_qp *qp,
}
if (ack->mask & RXE_ATMACK_MASK)
- atmack_set_orig(ack, qp->resp.atomic_orig);
+ atmack_set_orig(ack, qp->resp.res->atomic.orig_val);
err = rxe_prepare(&qp->pri_av, ack, skb);
if (err) {