Commit f994ae0a authored by Li Zhijian's avatar Li Zhijian Committed by Jason Gunthorpe

RDMA/rxe: Add send_common_ack() helper

Most code in send_ack() and send_atomic_ack() are duplicate, move them to
a new helper send_common_ack().

In newer IBA spec, some opcodes require acknowledge with a zero-length
read response, with this new helper, we can easily implement it later.

Link: https://lore.kernel.org/r/1659335010-2-1-git-send-email-lizhijian@fujitsu.comSigned-off-by: default avatarLi Zhijian <lizhijian@fujitsu.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent b300729b
...@@ -1024,50 +1024,41 @@ static enum resp_states do_complete(struct rxe_qp *qp, ...@@ -1024,50 +1024,41 @@ static enum resp_states do_complete(struct rxe_qp *qp,
return RESPST_CLEANUP; return RESPST_CLEANUP;
} }
static int send_ack(struct rxe_qp *qp, u8 syndrome, u32 psn)
static int send_common_ack(struct rxe_qp *qp, u8 syndrome, u32 psn,
int opcode, const char *msg)
{ {
int err = 0; int err;
struct rxe_pkt_info ack_pkt; struct rxe_pkt_info ack_pkt;
struct sk_buff *skb; struct sk_buff *skb;
skb = prepare_ack_packet(qp, &ack_pkt, IB_OPCODE_RC_ACKNOWLEDGE, skb = prepare_ack_packet(qp, &ack_pkt, opcode, 0, psn, syndrome);
0, psn, syndrome); if (!skb)
if (!skb) { return -ENOMEM;
err = -ENOMEM;
goto err1;
}
err = rxe_xmit_packet(qp, &ack_pkt, skb); err = rxe_xmit_packet(qp, &ack_pkt, skb);
if (err) if (err)
pr_err_ratelimited("Failed sending ack\n"); pr_err_ratelimited("Failed sending %s\n", msg);
err1:
return err; return err;
} }
static int send_atomic_ack(struct rxe_qp *qp, u8 syndrome, u32 psn) static int send_ack(struct rxe_qp *qp, u8 syndrome, u32 psn)
{ {
int err = 0; return send_common_ack(qp, syndrome, psn,
struct rxe_pkt_info ack_pkt; IB_OPCODE_RC_ACKNOWLEDGE, "ACK");
struct sk_buff *skb; }
skb = prepare_ack_packet(qp, &ack_pkt, IB_OPCODE_RC_ATOMIC_ACKNOWLEDGE,
0, psn, syndrome);
if (!skb) {
err = -ENOMEM;
goto out;
}
err = rxe_xmit_packet(qp, &ack_pkt, skb); static int send_atomic_ack(struct rxe_qp *qp, u8 syndrome, u32 psn)
if (err) {
pr_err_ratelimited("Failed sending atomic ack\n"); int ret = send_common_ack(qp, syndrome, psn,
IB_OPCODE_RC_ATOMIC_ACKNOWLEDGE, "ATOMIC ACK");
/* have to clear this since it is used to trigger /* have to clear this since it is used to trigger
* long read replies * long read replies
*/ */
qp->resp.res = NULL; qp->resp.res = NULL;
out: return ret;
return err;
} }
static enum resp_states acknowledge(struct rxe_qp *qp, static enum resp_states acknowledge(struct rxe_qp *qp,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment