IB/rxe: optimize the function duplicate_request
authorZhu Yanjun <yanjun.zhu@oracle.com>
Tue, 10 Apr 2018 04:47:15 +0000 (00:47 -0400)
committerDoug Ledford <dledford@redhat.com>
Thu, 19 Apr 2018 17:58:16 +0000 (13:58 -0400)
In the function duplicate_request, the reference of skb can be increased
to replace the function skb_clone.

This will make rxe performace better and save memory.

CC: Srinivas Eeda <srinivas.eeda@oracle.com>
CC: Junxiao Bi <junxiao.bi@oracle.com>
Signed-off-by: Zhu Yanjun <yanjun.zhu@oracle.com>
Reviewed-by: Bart Van Assche <bart.vanassche@wdc.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/sw/rxe/rxe_resp.c

index a65c9969f7fcfffd808aea97906978ec78477a50..c4172edf1f074f4196ea2fada3abab6e867dab09 100644 (file)
@@ -1124,24 +1124,13 @@ static enum resp_states duplicate_request(struct rxe_qp *qp,
                /* Find the operation in our list of responder resources. */
                res = find_resource(qp, pkt->psn);
                if (res) {
-                       struct sk_buff *skb_copy;
-
-                       skb_copy = skb_clone(res->atomic.skb, GFP_ATOMIC);
-                       if (skb_copy) {
-                               rxe_add_ref(qp); /* for the new SKB */
-                       } else {
-                               pr_warn("Couldn't clone atomic resp\n");
-                               rc = RESPST_CLEANUP;
-                               goto out;
-                       }
-
+                       skb_get(res->atomic.skb);
                        /* Resend the result. */
                        rc = rxe_xmit_packet(to_rdev(qp->ibqp.device), qp,
-                                            pkt, skb_copy);
+                                            pkt, res->atomic.skb);
                        if (rc) {
                                pr_err("Failed resending result. This flow is not handled - skb ignored\n");
-                               rxe_drop_ref(qp);
-                               kfree_skb(skb_copy);
+                               kfree_skb(res->atomic.skb);
                                rc = RESPST_CLEANUP;
                                goto out;
                        }