ipv4: tcp: remove per net tcp_sock
authorEric Dumazet <edumazet@google.com>
Thu, 19 Jul 2012 07:34:03 +0000 (07:34 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 19 Jul 2012 17:35:30 +0000 (10:35 -0700)
commitbe9f4a44e7d41cee50ddb5f038fc2391cbbb4046
tree184e45a62fa0b4d15961427c0e8d5a496f0617a5
parentaee06da6726d4981c51928c2d6d1e2cabeec7a10
ipv4: tcp: remove per net tcp_sock

tcp_v4_send_reset() and tcp_v4_send_ack() use a single socket
per network namespace.

This leads to bad behavior on multiqueue NICS, because many cpus
contend for the socket lock and once socket lock is acquired, extra
false sharing on various socket fields slow down the operations.

To better resist to attacks, we use a percpu socket. Each cpu can
run without contention, using appropriate memory (local node)

Additional features :

1) We also mirror the queue_mapping of the incoming skb, so that
answers use the same queue if possible.

2) Setting SOCK_USE_WRITE_QUEUE socket flag speedup sock_wfree()

3) We now limit the number of in-flight RST/ACK [1] packets
per cpu, instead of per namespace, and we honor the sysctl_wmem_default
limit dynamically. (Prior to this patch, sysctl_wmem_default value was
copied at boot time, so any further change would not affect tcp_sock
limit)

[1] These packets are only generated when no socket was matched for
the incoming packet.

Reported-by: Bill Sommerfeld <wsommerfeld@google.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Tom Herbert <therbert@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/ip.h
include/net/netns/ipv4.h
net/ipv4/ip_output.c
net/ipv4/tcp_ipv4.c