From patchwork Wed Apr 21 11:27:33 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 50654 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.180.67]) by ozlabs.org (Postfix) with ESMTP id E42D2B7D0B for ; Wed, 21 Apr 2010 21:27:47 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752486Ab0DUL1m (ORCPT ); Wed, 21 Apr 2010 07:27:42 -0400 Received: from mail-bw0-f225.google.com ([209.85.218.225]:57125 "EHLO mail-bw0-f225.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752143Ab0DUL1m (ORCPT ); Wed, 21 Apr 2010 07:27:42 -0400 Received: by bwz25 with SMTP id 25so7982222bwz.28 for ; Wed, 21 Apr 2010 04:27:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:subject:from:to:cc :in-reply-to:references:content-type:date:message-id:mime-version :x-mailer:content-transfer-encoding; bh=ZfoZ3spip0G+eIDDK03NNnlEltBjzDfgEqX8fthhvII=; b=MmLEoycD/RZgW8flAS7dZ7hrLvLqqjzQ/BN6LP1W9qH3fhIumE0piLP+4u93tEywCA QnomvQUWXPKHnffBgFyPV+mNtGT0be2G+YE6UrRHCDmdGsu0Efaq9/O/XkarWDJIx5gN cyOfJbwBbsY/8iDJWknhAMEPZi7j92mc7nv3Q= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=subject:from:to:cc:in-reply-to:references:content-type:date :message-id:mime-version:x-mailer:content-transfer-encoding; b=QqmjKRY3XvK3O1e5/XS5Kq6P2Bfsil40imC6Ls1qTx+BAYkeShzJuNtpUy0dvBvCG9 WC5dG0AkL8bqvto+wdCZeNCV+07fI6jZvVVCNKUFiFrbCSekvoOcoB34LoSAyoypc6R4 f7Q/NZsFNuu4kJJ72HEBWBCYTSAx7M+VEJaFQ= Received: by 10.204.6.193 with SMTP id a1mr7078666bka.104.1271849260116; Wed, 21 Apr 2010 04:27:40 -0700 (PDT) Received: from [127.0.0.1] (gw1.cosmosbay.com [212.99.114.194]) by mx.google.com with ESMTPS id 13sm4066838bwz.15.2010.04.21.04.27.38 (version=SSLv3 cipher=RC4-MD5); Wed, 21 Apr 2010 04:27:39 -0700 (PDT) Subject: Re: PROBLEM: Linux kernel 2.6.31 IPv4 TCP fails to open huge amount of outgoing connections (unable to bind ... ) From: Eric Dumazet To: Evgeniy Polyakov Cc: Ben Greear , David Miller , Gaspar Chilingarov , netdev In-Reply-To: <20100421095812.GA14778@ioremap.net> References: <4BCE33B9.8050101@candelatech.com> <4BCE392F.60104@candelatech.com> <4BCE3D8D.3030500@candelatech.com> <1271808314.7895.614.camel@edumazet-laptop> <20100421003022.GA3107@ioremap.net> <1271828799.7895.1287.camel@edumazet-laptop> <20100421082559.GA32475@ioremap.net> <1271840535.7895.1612.camel@edumazet-laptop> <20100421095812.GA14778@ioremap.net> Date: Wed, 21 Apr 2010 13:27:33 +0200 Message-ID: <1271849253.7895.1929.camel@edumazet-laptop> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Here is the patch I use now and my test application is now able to open and connect 1000000 sockets (ulimit -n 1000000) Trick is bind_conflict() must refuse a socket to bind to a port on a non null IP if another socket already uses same port on same IP. Plus the previous patch sent (check a conflict before exiting the search loop) What do you think ? --- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index e0a3e35..78cbc39 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c @@ -70,13 +70,17 @@ int inet_csk_bind_conflict(const struct sock *sk, (!sk->sk_bound_dev_if || !sk2->sk_bound_dev_if || sk->sk_bound_dev_if == sk2->sk_bound_dev_if)) { + const __be32 sk2_rcv_saddr = inet_rcv_saddr(sk2); + if (!reuse || !sk2->sk_reuse || sk2->sk_state == TCP_LISTEN) { - const __be32 sk2_rcv_saddr = inet_rcv_saddr(sk2); if (!sk2_rcv_saddr || !sk_rcv_saddr || sk2_rcv_saddr == sk_rcv_saddr) break; - } + } else if (reuse && sk2->sk_reuse && + sk2_rcv_saddr && + sk2_rcv_saddr == sk_rcv_saddr) + break; } } return node != NULL; @@ -120,9 +124,11 @@ again: smallest_size = tb->num_owners; smallest_rover = rover; if (atomic_read(&hashinfo->bsockets) > (high - low) + 1) { - spin_unlock(&head->lock); - snum = smallest_rover; - goto have_snum; + if (!inet_csk(sk)->icsk_af_ops->bind_conflict(sk, tb)) { + spin_unlock(&head->lock); + snum = smallest_rover; + goto have_snum; + } } } goto next;