RDMA/rxe: Add send_common_ack() helper
authorLi Zhijian <lizhijian@fujitsu.com>
Mon, 1 Aug 2022 06:23:30 +0000 (06:23 +0000)
committerJason Gunthorpe <jgg@nvidia.com>
Mon, 26 Sep 2022 17:14:25 +0000 (14:14 -0300)
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.com
Signed-off-by: Li Zhijian <lizhijian@fujitsu.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/sw/rxe/rxe_resp.c

index 7c336db..ed5a09e 100644 (file)
@@ -1024,50 +1024,41 @@ finish:
                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 sk_buff *skb;
 
-       skb = prepare_ack_packet(qp, &ack_pkt, IB_OPCODE_RC_ACKNOWLEDGE,
-                                0, psn, syndrome);
-       if (!skb) {
-               err = -ENOMEM;
-               goto err1;
-       }
+       skb = prepare_ack_packet(qp, &ack_pkt, opcode, 0, psn, syndrome);
+       if (!skb)
+               return -ENOMEM;
 
        err = rxe_xmit_packet(qp, &ack_pkt, skb);
        if (err)
-               pr_err_ratelimited("Failed sending ack\n");
+               pr_err_ratelimited("Failed sending %s\n", msg);
 
-err1:
        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;
-       struct rxe_pkt_info ack_pkt;
-       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;
-       }
+       return send_common_ack(qp, syndrome, psn,
+                       IB_OPCODE_RC_ACKNOWLEDGE, "ACK");
+}
 
-       err = rxe_xmit_packet(qp, &ack_pkt, skb);
-       if (err)
-               pr_err_ratelimited("Failed sending atomic ack\n");
+static int send_atomic_ack(struct rxe_qp *qp, u8 syndrome, u32 psn)
+{
+       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
         * long read replies
         */
        qp->resp.res = NULL;
-out:
-       return err;
+       return ret;
 }
 
 static enum resp_states acknowledge(struct rxe_qp *qp,