RDMA/rxe: Get rid of pkt resend on err
authorBob Pearson <rpearsonhpe@gmail.com>
Fri, 29 Mar 2024 14:55:14 +0000 (09:55 -0500)
committerJason Gunthorpe <jgg@nvidia.com>
Mon, 22 Apr 2024 19:54:34 +0000 (16:54 -0300)
Currently the rxe_driver detects packet drops by ip_local_out() which
occur before the packet is sent on the wire and attempts to resend
them. This is redundant with the usual retry mechanism which covers
packets that get dropped in transit to or from the remote node.

The way this is implemented is not robust since it sets need_req_skb and
waits for the number of local skbs outstanding for this qp to drop below a
low water mark. This is racy since the skb may be sent to the destructor
before the requester can set the need_req_skb flag. This will cause a
deadlock in the send path for that qp.

This patch removes this mechanism since the normal retry path will correct
the error and resend the packet and it makes no difference if the packet
is dropped locally or later.

Link: https://lore.kernel.org/r/20240329145513.35381-14-rpearsonhpe@gmail.com
Signed-off-by: Bob Pearson <rpearsonhpe@gmail.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/sw/rxe/rxe_net.c
drivers/infiniband/sw/rxe/rxe_req.c

index d081409450a411f5ba546fe873c136c285784f4e..b58eab75df9787cc5e4d56a10d996054b49e64df 100644 (file)
@@ -371,12 +371,7 @@ static int rxe_send(struct sk_buff *skb, struct rxe_pkt_info *pkt)
        else
                err = ip6_local_out(dev_net(skb_dst(skb)->dev), skb->sk, skb);
 
-       if (unlikely(net_xmit_eval(err))) {
-               rxe_dbg_qp(pkt->qp, "error sending packet: %d\n", err);
-               return -EAGAIN;
-       }
-
-       return 0;
+       return err;
 }
 
 /* fix up a send packet to match the packets
index 34c55dee077412431bf22d9fb7dbbe2271ef8f8b..cd14c4c2dff9d0d0a8710dc935c39560824c7ddd 100644 (file)
@@ -802,18 +802,8 @@ int rxe_requester(struct rxe_qp *qp)
 
        err = rxe_xmit_packet(qp, &pkt, skb);
        if (err) {
-               if (err != -EAGAIN) {
-                       wqe->status = IB_WC_LOC_QP_OP_ERR;
-                       goto err;
-               }
-
-               /* force a delay until the dropped packet is freed and
-                * the send queue is drained below the low water mark
-                */
-               qp->need_req_skb = 1;
-
-               rxe_sched_task(&qp->send_task);
-               goto exit;
+               wqe->status = IB_WC_LOC_QP_OP_ERR;
+               goto err;
        }
 
        update_wqe_state(qp, wqe, &pkt);