• Alex Copot's avatar
    tcp: bind() use stronger condition for bind_conflict · aacd9289
    Alex Copot authored
    We must try harder to get unique (addr, port) pairs when
    doing port autoselection for sockets with SO_REUSEADDR
    option set.
    
    We achieve this by adding a relaxation parameter to
    inet_csk_bind_conflict. When 'relax' parameter is off
    we return a conflict whenever the current searched
    pair (addr, port) is not unique.
    
    This tries to address the problems reported in patch:
    	8d238b25
    	Revert "tcp: bind() fix when many ports are bound"
    
    Tests where ran for creating and binding(0) many sockets
    on 100 IPs. The results are, on average:
    
    	* 60000 sockets, 600 ports / IP:
    		* 0.210 s, 620 (IP, port) duplicates without patch
    		* 0.219 s, no duplicates with patch
    	* 100000 sockets, 1000 ports / IP:
    		* 0.371 s, 1720 duplicates without patch
    		* 0.373 s, no duplicates with patch
    	* 200000 sockets, 2000 ports / IP:
    		* 0.766 s, 6900 duplicates without patch
    		* 0.768 s, no duplicates with patch
    	* 500000 sockets, 5000 ports / IP:
    		* 2.227 s, 41500 duplicates without patch
    		* 2.284 s, no duplicates with patch
    Signed-off-by: default avatarAlex Copot <alex.mihai.c@gmail.com>
    Signed-off-by: default avatarDaniel Baluta <dbaluta@ixiacom.com>
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    aacd9289
inet_connection_sock.h 10.6 KB