From 3df31f9e8982b2dbc2aa88cd0978602385e65e8b Mon Sep 17 00:00:00 2001 From: Octavian Purdila Date: Sat, 26 Dec 2009 11:51:03 +0000 Subject: [PATCH] --- yaml --- r: 183327 b: refs/heads/master c: 0f7b67dd9e1192976f5e5a78934c7a339ff7c45f h: refs/heads/master i: 183325: 42dfc07c974fcde2046991041365bd404630e582 183323: 877cab5b62ae542ec870105ecbfa91d509da0360 183319: e8b378c22b9acf468d9de4513c68b821bb5f9780 183311: 226195c0c9efc0c0ab107f206e25d3441f665775 183295: 762fad266a16f262b601c0c626f383b19a21fcee v: v3 --- [refs] | 2 +- trunk/net/llc/llc_sap.c | 36 ++++++++++++++++++++++++++++-------- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index 2c5d331b95f1..464e0f46cfa7 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: b76f5a8427ac2928c07fa4ff2144bb8db072c240 +refs/heads/master: 0f7b67dd9e1192976f5e5a78934c7a339ff7c45f diff --git a/trunk/net/llc/llc_sap.c b/trunk/net/llc/llc_sap.c index 39760d013ce2..94790e60d072 100644 --- a/trunk/net/llc/llc_sap.c +++ b/trunk/net/llc/llc_sap.c @@ -355,6 +355,24 @@ static inline bool llc_mcast_match(const struct llc_sap *sap, llc->dev == skb->dev; } +static void llc_do_mcast(struct llc_sap *sap, struct sk_buff *skb, + struct sock **stack, int count) +{ + struct sk_buff *skb1; + int i; + + for (i = 0; i < count; i++) { + skb1 = skb_clone(skb, GFP_ATOMIC); + if (!skb1) { + sock_put(stack[i]); + continue; + } + + llc_sap_rcv(sap, skb1, stack[i]); + sock_put(stack[i]); + } +} + /** * llc_sap_mcast - Deliver multicast PDU's to all matching datagram sockets. * @sap: SAP @@ -367,25 +385,27 @@ static void llc_sap_mcast(struct llc_sap *sap, const struct llc_addr *laddr, struct sk_buff *skb) { - struct sock *sk; + int i = 0, count = 256 / sizeof(struct sock *); + struct sock *sk, *stack[count]; struct hlist_nulls_node *node; spin_lock_bh(&sap->sk_lock); sk_nulls_for_each_rcu(sk, node, &sap->sk_list) { - struct sk_buff *skb1; if (!llc_mcast_match(sap, laddr, skb, sk)) continue; - skb1 = skb_clone(skb, GFP_ATOMIC); - if (!skb1) - break; - sock_hold(sk); - llc_sap_rcv(sap, skb1, sk); - sock_put(sk); + if (i < count) + stack[i++] = sk; + else { + llc_do_mcast(sap, skb, stack, i); + i = 0; + } } spin_unlock_bh(&sap->sk_lock); + + llc_do_mcast(sap, skb, stack, i); }