RDMA/rxe: Don't set BTH_ACK_MASK for UC or UD QPs
authorHonggang LI <honggangli@163.com>
Mon, 24 Jun 2024 02:03:48 +0000 (10:03 +0800)
committerJason Gunthorpe <jgg@nvidia.com>
Wed, 26 Jun 2024 13:53:29 +0000 (10:53 -0300)
BTH_ACK_MASK bit is used to indicate that an acknowledge
(for this packet) should be scheduled by the responder.
Both UC and UD QPs are unacknowledged, so don't set
BTH_ACK_MASK for UC or UD QPs.

Fixes: 8700e3e7c485 ("Soft RoCE driver")
Signed-off-by: Honggang LI <honggangli@163.com>
Link: https://lore.kernel.org/r/20240624020348.494338-1-honggangli@163.com
Reviewed-by: Zhu Yanjun <yanjun.zhu@linux.dev>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/sw/rxe/rxe_req.c

index cd14c4c2dff9d0d0a8710dc935c39560824c7ddd..479c07e6e4ed3eab4646400455897cd20e3316a2 100644 (file)
@@ -424,7 +424,7 @@ static struct sk_buff *init_req_packet(struct rxe_qp *qp,
        int                     paylen;
        int                     solicited;
        u32                     qp_num;
-       int                     ack_req;
+       int                     ack_req = 0;
 
        /* length from start of bth to end of icrc */
        paylen = rxe_opcode[opcode].length + payload + pad + RXE_ICRC_SIZE;
@@ -445,8 +445,9 @@ static struct sk_buff *init_req_packet(struct rxe_qp *qp,
        qp_num = (pkt->mask & RXE_DETH_MASK) ? ibwr->wr.ud.remote_qpn :
                                         qp->attr.dest_qp_num;
 
-       ack_req = ((pkt->mask & RXE_END_MASK) ||
-               (qp->req.noack_pkts++ > RXE_MAX_PKT_PER_ACK));
+       if (qp_type(qp) != IB_QPT_UD && qp_type(qp) != IB_QPT_UC)
+               ack_req = ((pkt->mask & RXE_END_MASK) ||
+                          (qp->req.noack_pkts++ > RXE_MAX_PKT_PER_ACK));
        if (ack_req)
                qp->req.noack_pkts = 0;