|
@@ -969,7 +969,6 @@ static int send_atomic_ack(struct rxe_qp *qp, struct rxe_pkt_info *pkt,
|
|
|
int rc = 0;
|
|
|
struct rxe_pkt_info ack_pkt;
|
|
|
struct sk_buff *skb;
|
|
|
- struct sk_buff *skb_copy;
|
|
|
struct rxe_dev *rxe = to_rdev(qp->ibqp.device);
|
|
|
struct resp_res *res;
|
|
|
|
|
@@ -981,14 +980,7 @@ static int send_atomic_ack(struct rxe_qp *qp, struct rxe_pkt_info *pkt,
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- skb_copy = skb_clone(skb, GFP_ATOMIC);
|
|
|
- if (skb_copy)
|
|
|
- rxe_add_ref(qp); /* for the new SKB */
|
|
|
- else {
|
|
|
- pr_warn("Could not clone atomic response\n");
|
|
|
- rc = -ENOMEM;
|
|
|
- goto out;
|
|
|
- }
|
|
|
+ rxe_add_ref(qp);
|
|
|
|
|
|
res = &qp->resp.resources[qp->resp.res_head];
|
|
|
free_rd_atomic_resource(qp, res);
|
|
@@ -998,19 +990,18 @@ static int send_atomic_ack(struct rxe_qp *qp, struct rxe_pkt_info *pkt,
|
|
|
memset((unsigned char *)SKB_TO_PKT(skb) + sizeof(ack_pkt), 0,
|
|
|
sizeof(skb->cb) - sizeof(ack_pkt));
|
|
|
|
|
|
+ refcount_inc(&skb->users);
|
|
|
res->type = RXE_ATOMIC_MASK;
|
|
|
res->atomic.skb = skb;
|
|
|
res->first_psn = ack_pkt.psn;
|
|
|
res->last_psn = ack_pkt.psn;
|
|
|
res->cur_psn = ack_pkt.psn;
|
|
|
|
|
|
- rc = rxe_xmit_packet(rxe, qp, &ack_pkt, skb_copy);
|
|
|
+ rc = rxe_xmit_packet(rxe, qp, &ack_pkt, skb);
|
|
|
if (rc) {
|
|
|
pr_err_ratelimited("Failed sending ack\n");
|
|
|
rxe_drop_ref(qp);
|
|
|
- kfree_skb(skb_copy);
|
|
|
}
|
|
|
-
|
|
|
out:
|
|
|
return rc;
|
|
|
}
|