From patchwork Wed Oct 8 13:55:36 2008 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 3318 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 157D6DE1AD for ; Thu, 9 Oct 2008 00:56:00 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754056AbYJHNzw (ORCPT ); Wed, 8 Oct 2008 09:55:52 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1753716AbYJHNzw (ORCPT ); Wed, 8 Oct 2008 09:55:52 -0400 Received: from smtp19.orange.fr ([80.12.242.18]:65265 "EHLO smtp19.orange.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753197AbYJHNzv (ORCPT ); Wed, 8 Oct 2008 09:55:51 -0400 Received: from me-wanadoo.net (localhost [127.0.0.1]) by mwinf1927.orange.fr (SMTP Server) with ESMTP id 583E61C000A6; Wed, 8 Oct 2008 15:55:49 +0200 (CEST) Received: from dniepr.adsl.jetmultimedia.fr (LNeuilly-152-23-22-3.w193-252.abo.wanadoo.fr [193.252.36.3]) by mwinf1927.orange.fr (SMTP Server) with SMTP id B13721C0008F; Wed, 8 Oct 2008 15:55:48 +0200 (CEST) X-ME-UUID: 20081008135548725.B13721C0008F@mwinf1927.orange.fr Received: from [127.0.0.1] ([192.168.4.161]) by dniepr.adsl.jetmultimedia.fr (8.11.7+Sun/8.11.7) with SMTP id m98DtlN07388; Wed, 8 Oct 2008 15:55:47 +0200 (MEST) Message-ID: <48ECBBD8.9060602@cosmosbay.com> Date: Wed, 08 Oct 2008 15:55:36 +0200 From: Eric Dumazet User-Agent: Thunderbird 2.0.0.17 (Windows/20080914) MIME-Version: 1.0 To: David Miller Cc: shemminger@vyatta.com, benny+usenet@amorsen.dk, minyard@acm.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, paulmck@linux.vnet.ibm.com Subject: Re: [PATCH 3/3] Convert the UDP hash lock to RCU References: <48EB5D28.7000503@cosmosbay.com> <20081007160729.60c076c4@speedy> <20081007.135548.56141000.davem@davemloft.net> In-Reply-To: <20081007.135548.56141000.davem@davemloft.net> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 85f8e8e..67d8430 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -155,55 +155,23 @@ int udp_lib_get_port(struct sock *sk, unsigned short snum, write_lock_bh(&udp_hash_lock); if (!snum) { - int i, low, high, remaining; - unsigned rover, best, best_size_so_far; + int low, high, remaining; + unsigned rand; + unsigned short first; inet_get_local_port_range(&low, &high); remaining = (high - low) + 1; - best_size_so_far = UINT_MAX; - best = rover = net_random() % remaining + low; - - /* 1st pass: look for empty (or shortest) hash chain */ - for (i = 0; i < UDP_HTABLE_SIZE; i++) { - int size = 0; - - head = &udptable[udp_hashfn(net, rover)]; - if (hlist_empty(head)) - goto gotit; - - sk_for_each(sk2, node, head) { - if (++size >= best_size_so_far) - goto next; - } - best_size_so_far = size; - best = rover; - next: - /* fold back if end of range */ - if (++rover > high) - rover = low + ((rover - low) - & (UDP_HTABLE_SIZE - 1)); - - - } - - /* 2nd pass: find hole in shortest hash chain */ - rover = best; - for (i = 0; i < (1 << 16) / UDP_HTABLE_SIZE; i++) { - if (! __udp_lib_lport_inuse(net, rover, udptable)) - goto gotit; - rover += UDP_HTABLE_SIZE; - if (rover > high) - rover = low + ((rover - low) - & (UDP_HTABLE_SIZE - 1)); + rand = net_random(); + snum = first = rand % remaining + low; + rand |= 1; + while (__udp_lib_lport_inuse(net, snum, udptable)) { + do { + snum = snum + rand; + } while (snum < low || snum > high); + if (snum == first) + goto fail; } - - - /* All ports in use! */ - goto fail; - -gotit: - snum = rover; } else { head = &udptable[udp_hashfn(net, snum)];