From: Changli Gao Date: Tue, 22 Feb 2011 01:55:18 +0000 (+0000) Subject: llc: avoid skb_clone() if there is only one handler X-Git-Tag: v2.6.39-rc1~468^2~209 X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=696ea472e19c6d1fa843bb1abce73b9c3a414391;p=~shefty%2Frdma-dev.git llc: avoid skb_clone() if there is only one handler Signed-off-by: Changli Gao Signed-off-by: David S. Miller --- diff --git a/net/llc/llc_input.c b/net/llc/llc_input.c index f9968743913..058f1e9a912 100644 --- a/net/llc/llc_input.c +++ b/net/llc/llc_input.c @@ -181,25 +181,26 @@ int llc_rcv(struct sk_buff *skb, struct net_device *dev, * LLC functionality */ rcv = rcu_dereference(sap->rcv_func); - if (rcv) { - struct sk_buff *cskb = skb_clone(skb, GFP_ATOMIC); - if (cskb) - rcv(cskb, dev, pt, orig_dev); - } dest = llc_pdu_type(skb); - if (unlikely(!dest || !llc_type_handlers[dest - 1])) - goto drop_put; - llc_type_handlers[dest - 1](sap, skb); -out_put: + if (unlikely(!dest || !llc_type_handlers[dest - 1])) { + if (rcv) + rcv(skb, dev, pt, orig_dev); + else + kfree_skb(skb); + } else { + if (rcv) { + struct sk_buff *cskb = skb_clone(skb, GFP_ATOMIC); + if (cskb) + rcv(cskb, dev, pt, orig_dev); + } + llc_type_handlers[dest - 1](sap, skb); + } llc_sap_put(sap); out: return 0; drop: kfree_skb(skb); goto out; -drop_put: - kfree_skb(skb); - goto out_put; handle_station: if (!llc_station_handler) goto drop;