From patchwork Thu Nov 5 18:33:21 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lucian Adrian Grijincu X-Patchwork-Id: 37797 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by ozlabs.org (Postfix) with ESMTP id E4CC9B7B9D for ; Fri, 6 Nov 2009 05:33:31 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757867AbZKESdV (ORCPT ); Thu, 5 Nov 2009 13:33:21 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1757625AbZKESdV (ORCPT ); Thu, 5 Nov 2009 13:33:21 -0500 Received: from ixro-out-rtc.ixiacom.com ([92.87.192.98]:13698 "EHLO ixro-ex1.ixiacom.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1757262AbZKESdU (ORCPT ); Thu, 5 Nov 2009 13:33:20 -0500 Received: from ixro-lgrijincu.localnet ([10.205.9.89]) by ixro-ex1.ixiacom.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 5 Nov 2009 20:33:25 +0200 Subject: [PATCH 1/2] udp: cleanup __udp4_lib_mcast_deliver From: Lucian Adrian Grijincu Organization: IXIACOM Date: Thu, 5 Nov 2009 20:33:21 +0200 To: netdev@vger.kernel.org Cc: opurdila@ixiacom.com MIME-Version: 1.0 Message-Id: <200911052033.21964.lgrijincu@ixiacom.com> X-OriginalArrivalTime: 05 Nov 2009 18:33:25.0133 (UTC) FILETIME=[75D893D0:01CA5E46] Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org __udp4_lib_mcast_deliver always returned 0. It's caller can return 0 explicitly to make things clearer. Also, we don't need the spin_lock() on the hslot to free the skb. Signed-off-by: Lucian Adrian Grijincu --- net/ipv4/udp.c | 57 +++++++++++++++++++++++++++++-------------------------- 1 files changed, 30 insertions(+), 27 deletions(-) diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 4274c1c..425b2d4 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -1198,12 +1198,12 @@ drop: * Note: called only from the BH handler context, * so we don't need to lock the hashes. */ -static int __udp4_lib_mcast_deliver(struct net *net, struct sk_buff *skb, +static void __udp4_lib_mcast_deliver(struct net *net, struct sk_buff *skb, struct udphdr *uh, __be32 saddr, __be32 daddr, struct udp_table *udptable) { - struct sock *sk; + struct sock *sk, *sknext; struct udp_hslot *hslot = udp_hashslot(udptable, net, ntohs(uh->dest)); int dif; @@ -1211,31 +1211,32 @@ static int __udp4_lib_mcast_deliver(struct net *net, struct sk_buff *skb, sk = sk_nulls_head(&hslot->head); dif = skb->dev->ifindex; sk = udp_v4_mcast_next(net, sk, uh->dest, daddr, uh->source, saddr, dif); - if (sk) { - struct sock *sknext = NULL; - - do { - struct sk_buff *skb1 = skb; - - sknext = udp_v4_mcast_next(net, sk_nulls_next(sk), uh->dest, - daddr, uh->source, saddr, - dif); - if (sknext) - skb1 = skb_clone(skb, GFP_ATOMIC); - - if (skb1) { - int ret = udp_queue_rcv_skb(sk, skb1); - if (ret > 0) - /* we should probably re-process instead - * of dropping packets here. */ - kfree_skb(skb1); - } - sk = sknext; - } while (sknext); - } else + if (!sk) { + spin_unlock(&hslot->lock); consume_skb(skb); + return; + } + + do { + struct sk_buff *skb1 = skb; + + sknext = udp_v4_mcast_next(net, sk_nulls_next(sk), uh->dest, + daddr, uh->source, saddr, + dif); + if (sknext) + skb1 = skb_clone(skb, GFP_ATOMIC); + + if (skb1) { + int ret = udp_queue_rcv_skb(sk, skb1); + if (ret > 0) + /* we should probably re-process instead + * of dropping packets here. */ + kfree_skb(skb1); + } + sk = sknext; + } while (sknext); spin_unlock(&hslot->lock); - return 0; + return; } /* Initialize UDP checksum. If exited with zero value (success), @@ -1314,9 +1315,11 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, saddr = ip_hdr(skb)->saddr; daddr = ip_hdr(skb)->daddr; - if (rt->rt_flags & (RTCF_BROADCAST|RTCF_MULTICAST)) - return __udp4_lib_mcast_deliver(net, skb, uh, + if (rt->rt_flags & (RTCF_BROADCAST|RTCF_MULTICAST)) { + __udp4_lib_mcast_deliver(net, skb, uh, saddr, daddr, udptable); + return 0; + } sk = __udp4_lib_lookup_skb(skb, uh->source, uh->dest, udptable);