inet: frags: break the 2GB limit for frags storage
authorEric Dumazet <edumazet@google.com>
Sat, 31 Mar 2018 19:58:53 +0000 (12:58 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sun, 1 Apr 2018 03:25:39 +0000 (23:25 -0400)
commit3e67f106f619dcfaf6f4e2039599bdb69848c714
tree2c8c6574733f683d59de6fe388e308694b3c904d
parent2d44ed22e607f9a285b049de2263e3840673a260
inet: frags: break the 2GB limit for frags storage

Some users are willing to provision huge amounts of memory to be able
to perform reassembly reasonnably well under pressure.

Current memory tracking is using one atomic_t and integers.

Switch to atomic_long_t so that 64bit arches can use more than 2GB,
without any cost for 32bit arches.

Note that this patch avoids an overflow error, if high_thresh was set
to ~2GB, since this test in inet_frag_alloc() was never true :

if (... || frag_mem_limit(nf) > nf->high_thresh)

Tested:

$ echo 16000000000 >/proc/sys/net/ipv4/ipfrag_high_thresh

<frag DDOS>

$ grep FRAG /proc/net/sockstat
FRAG: inuse 14705885 memory 16000002880

$ nstat -n ; sleep 1 ; nstat | grep Reas
IpReasmReqds                    3317150            0.0
IpReasmFails                    3317112            0.0

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Documentation/networking/ip-sysctl.txt
include/net/inet_frag.h
net/ieee802154/6lowpan/reassembly.c
net/ipv4/ip_fragment.c
net/ipv4/proc.c
net/ipv6/netfilter/nf_conntrack_reasm.c
net/ipv6/proc.c
net/ipv6/reassembly.c