IB/rxe: optimize mcast recv process
authorZhu Yanjun <yanjun.zhu@oracle.com>
Wed, 21 Mar 2018 08:08:37 +0000 (04:08 -0400)
committerJason Gunthorpe <jgg@mellanox.com>
Thu, 29 Mar 2018 19:25:22 +0000 (13:25 -0600)
In mcast recv process, the function skb_clone is used. In fact,
the refcount can be increased to replace cloning a new skb since
the original skb will not be modified before it is freed.

This can make the performance better and save the 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: Yuval Shaia <yuval.shaia@oracle.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/sw/rxe/rxe_recv.c

index 08ad9dc72205e9d9fb59c579ac49017bbee9a2b9..dd80c7d9074ad3e1bf14700a59eb3d1465121253 100644 (file)
@@ -276,7 +276,6 @@ static void rxe_rcv_mcast_pkt(struct rxe_dev *rxe, struct sk_buff *skb)
 {
        struct rxe_pkt_info *pkt = SKB_TO_PKT(skb);
        struct rxe_mc_grp *mcg;
-       struct sk_buff *skb_copy;
        struct rxe_mc_elem *mce;
        struct rxe_qp *qp;
        union ib_gid dgid;
@@ -309,18 +308,14 @@ static void rxe_rcv_mcast_pkt(struct rxe_dev *rxe, struct sk_buff *skb)
                        continue;
 
                /* if *not* the last qp in the list
-                * make a copy of the skb to post to the next qp
+                * increase the users of the skb then post to the next qp
                 */
-               skb_copy = (mce->qp_list.next != &mcg->qp_list) ?
-                               skb_clone(skb, GFP_ATOMIC) : NULL;
+               if (mce->qp_list.next != &mcg->qp_list)
+                       refcount_inc(&skb->users);
 
                pkt->qp = qp;
                rxe_add_ref(qp);
                rxe_rcv_pkt(rxe, pkt, skb);
-
-               skb = skb_copy;
-               if (!skb)
-                       break;
        }
 
        spin_unlock_bh(&mcg->mcg_lock);
@@ -328,8 +323,7 @@ static void rxe_rcv_mcast_pkt(struct rxe_dev *rxe, struct sk_buff *skb)
        rxe_drop_ref(mcg);      /* drop ref from rxe_pool_get_key. */
 
 err1:
-       if (skb)
-               kfree_skb(skb);
+       kfree_skb(skb);
 }
 
 static int rxe_match_dgid(struct rxe_dev *rxe, struct sk_buff *skb)