neigh: increase queue_len_bytes to match wmem_default
authorEric Dumazet <edumazet@google.com>
Tue, 29 Aug 2017 22:16:01 +0000 (15:16 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 29 Aug 2017 23:10:50 +0000 (16:10 -0700)
Florian reported UDP xmit drops that could be root caused to the
too small neigh limit.

Current limit is 64 KB, meaning that even a single UDP socket would hit
it, since its default sk_sndbuf comes from net.core.wmem_default
(~212992 bytes on 64bit arches).

Once ARP/ND resolution is in progress, we should allow a little more
packets to be queued, at least for one producer.

Once neigh arp_queue is filled, a rogue socket should hit its sk_sndbuf
limit and either block in sendmsg() or return -EAGAIN.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Reported-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Documentation/networking/ip-sysctl.txt
include/net/sock.h
net/core/sock.c
net/decnet/dn_neigh.c
net/ipv4/arp.c
net/ipv4/tcp_input.c
net/ipv6/ndisc.c

index 6b0bc0f..b3345d0 100644 (file)
@@ -109,7 +109,10 @@ neigh/default/unres_qlen_bytes - INTEGER
        queued for each unresolved address by other network layers.
        (added in linux 3.3)
        Setting negative value is meaningless and will return error.
-       Default: 65536 Bytes(64KB)
+       Default: SK_WMEM_MAX, (same as net.core.wmem_default).
+               Exact value depends on architecture and kernel options,
+               but should be enough to allow queuing 256 packets
+               of medium size.
 
 neigh/default/unres_qlen - INTEGER
        The maximum number of packets which may be queued for each
@@ -119,7 +122,7 @@ neigh/default/unres_qlen - INTEGER
        unexpected packet loss. The current default value is calculated
        according to default value of unres_qlen_bytes and true size of
        packet.
-       Default: 31
+       Default: 101
 
 mtu_expires - INTEGER
        Time, in seconds, that cached PMTU information is kept.
index 1c2912d..03a3625 100644 (file)
@@ -2368,6 +2368,16 @@ bool sk_net_capable(const struct sock *sk, int cap);
 
 void sk_get_meminfo(const struct sock *sk, u32 *meminfo);
 
+/* Take into consideration the size of the struct sk_buff overhead in the
+ * determination of these values, since that is non-constant across
+ * platforms.  This makes socket queueing behavior and performance
+ * not depend upon such differences.
+ */
+#define _SK_MEM_PACKETS                256
+#define _SK_MEM_OVERHEAD       SKB_TRUESIZE(256)
+#define SK_WMEM_MAX            (_SK_MEM_OVERHEAD * _SK_MEM_PACKETS)
+#define SK_RMEM_MAX            (_SK_MEM_OVERHEAD * _SK_MEM_PACKETS)
+
 extern __u32 sysctl_wmem_max;
 extern __u32 sysctl_rmem_max;
 
index dfdd14c..9b7b6bb 100644 (file)
@@ -307,16 +307,6 @@ static struct lock_class_key af_wlock_keys[AF_MAX];
 static struct lock_class_key af_elock_keys[AF_MAX];
 static struct lock_class_key af_kern_callback_keys[AF_MAX];
 
-/* Take into consideration the size of the struct sk_buff overhead in the
- * determination of these values, since that is non-constant across
- * platforms.  This makes socket queueing behavior and performance
- * not depend upon such differences.
- */
-#define _SK_MEM_PACKETS                256
-#define _SK_MEM_OVERHEAD       SKB_TRUESIZE(256)
-#define SK_WMEM_MAX            (_SK_MEM_OVERHEAD * _SK_MEM_PACKETS)
-#define SK_RMEM_MAX            (_SK_MEM_OVERHEAD * _SK_MEM_PACKETS)
-
 /* Run time adjustable parameters. */
 __u32 sysctl_wmem_max __read_mostly = SK_WMEM_MAX;
 EXPORT_SYMBOL(sysctl_wmem_max);
index 21dedf6..22bf0b9 100644 (file)
@@ -94,7 +94,7 @@ struct neigh_table dn_neigh_table = {
                        [NEIGH_VAR_BASE_REACHABLE_TIME] = 30 * HZ,
                        [NEIGH_VAR_DELAY_PROBE_TIME] = 5 * HZ,
                        [NEIGH_VAR_GC_STALETIME] = 60 * HZ,
-                       [NEIGH_VAR_QUEUE_LEN_BYTES] = 64*1024,
+                       [NEIGH_VAR_QUEUE_LEN_BYTES] = SK_WMEM_MAX,
                        [NEIGH_VAR_PROXY_QLEN] = 0,
                        [NEIGH_VAR_ANYCAST_DELAY] = 0,
                        [NEIGH_VAR_PROXY_DELAY] = 0,
index 8b52179..7c45b88 100644 (file)
@@ -171,7 +171,7 @@ struct neigh_table arp_tbl = {
                        [NEIGH_VAR_BASE_REACHABLE_TIME] = 30 * HZ,
                        [NEIGH_VAR_DELAY_PROBE_TIME] = 5 * HZ,
                        [NEIGH_VAR_GC_STALETIME] = 60 * HZ,
-                       [NEIGH_VAR_QUEUE_LEN_BYTES] = 64 * 1024,
+                       [NEIGH_VAR_QUEUE_LEN_BYTES] = SK_WMEM_MAX,
                        [NEIGH_VAR_PROXY_QLEN] = 64,
                        [NEIGH_VAR_ANYCAST_DELAY] = 1 * HZ,
                        [NEIGH_VAR_PROXY_DELAY] = (8 * HZ) / 10,
index 568ccfd..7616cd7 100644 (file)
@@ -6086,9 +6086,9 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops,
        struct tcp_sock *tp = tcp_sk(sk);
        struct net *net = sock_net(sk);
        struct sock *fastopen_sk = NULL;
-       struct dst_entry *dst = NULL;
        struct request_sock *req;
        bool want_cookie = false;
+       struct dst_entry *dst;
        struct flowi fl;
 
        /* TW buckets are converted to open requests without
index 5e338eb..266a530 100644 (file)
@@ -127,7 +127,7 @@ struct neigh_table nd_tbl = {
                        [NEIGH_VAR_BASE_REACHABLE_TIME] = ND_REACHABLE_TIME,
                        [NEIGH_VAR_DELAY_PROBE_TIME] = 5 * HZ,
                        [NEIGH_VAR_GC_STALETIME] = 60 * HZ,
-                       [NEIGH_VAR_QUEUE_LEN_BYTES] = 64 * 1024,
+                       [NEIGH_VAR_QUEUE_LEN_BYTES] = SK_WMEM_MAX,
                        [NEIGH_VAR_PROXY_QLEN] = 64,
                        [NEIGH_VAR_ANYCAST_DELAY] = 1 * HZ,
                        [NEIGH_VAR_PROXY_DELAY] = (8 * HZ) / 10,