Skip to content

Commit

Permalink
IB/rxe: optimize mcast recv process
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Zhu Yanjun authored and Jason Gunthorpe committed Mar 29, 2018
1 parent a343e3f commit 99dae69
Showing 1 changed file with 4 additions and 10 deletions.
14 changes: 4 additions & 10 deletions drivers/infiniband/sw/rxe/rxe_recv.c
Original file line number Diff line number Diff line change
@@ -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,27 +308,22 @@ 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);

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)

0 comments on commit 99dae69

Please sign in to comment.