Commit eaa72dc4 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

neigh: increase queue_len_bytes to match wmem_default



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: default avatarEric Dumazet <edumazet@google.com>
Reported-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0dd5759d
Loading
Loading
Loading
Loading
+5 −2
Original line number Original line Diff line number Diff line
@@ -109,7 +109,10 @@ neigh/default/unres_qlen_bytes - INTEGER
	queued for each	unresolved address by other network layers.
	queued for each	unresolved address by other network layers.
	(added in linux 3.3)
	(added in linux 3.3)
	Setting negative value is meaningless and will return error.
	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
neigh/default/unres_qlen - INTEGER
	The maximum number of packets which may be queued for each
	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
	unexpected packet loss. The current default value is calculated
	according to default value of unres_qlen_bytes and true size of
	according to default value of unres_qlen_bytes and true size of
	packet.
	packet.
	Default: 31
	Default: 101


mtu_expires - INTEGER
mtu_expires - INTEGER
	Time, in seconds, that cached PMTU information is kept.
	Time, in seconds, that cached PMTU information is kept.
+10 −0
Original line number Original line Diff line number Diff line
@@ -2368,6 +2368,16 @@ bool sk_net_capable(const struct sock *sk, int cap);


void sk_get_meminfo(const struct sock *sk, u32 *meminfo);
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_wmem_max;
extern __u32 sysctl_rmem_max;
extern __u32 sysctl_rmem_max;


+0 −10
Original line number Original line Diff line number Diff line
@@ -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_elock_keys[AF_MAX];
static struct lock_class_key af_kern_callback_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. */
/* Run time adjustable parameters. */
__u32 sysctl_wmem_max __read_mostly = SK_WMEM_MAX;
__u32 sysctl_wmem_max __read_mostly = SK_WMEM_MAX;
EXPORT_SYMBOL(sysctl_wmem_max);
EXPORT_SYMBOL(sysctl_wmem_max);
+1 −1
Original line number Original line Diff line number Diff line
@@ -94,7 +94,7 @@ struct neigh_table dn_neigh_table = {
			[NEIGH_VAR_BASE_REACHABLE_TIME] = 30 * HZ,
			[NEIGH_VAR_BASE_REACHABLE_TIME] = 30 * HZ,
			[NEIGH_VAR_DELAY_PROBE_TIME] = 5 * HZ,
			[NEIGH_VAR_DELAY_PROBE_TIME] = 5 * HZ,
			[NEIGH_VAR_GC_STALETIME] = 60 * 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_PROXY_QLEN] = 0,
			[NEIGH_VAR_ANYCAST_DELAY] = 0,
			[NEIGH_VAR_ANYCAST_DELAY] = 0,
			[NEIGH_VAR_PROXY_DELAY] = 0,
			[NEIGH_VAR_PROXY_DELAY] = 0,
+1 −1
Original line number Original line Diff line number Diff line
@@ -171,7 +171,7 @@ struct neigh_table arp_tbl = {
			[NEIGH_VAR_BASE_REACHABLE_TIME] = 30 * HZ,
			[NEIGH_VAR_BASE_REACHABLE_TIME] = 30 * HZ,
			[NEIGH_VAR_DELAY_PROBE_TIME] = 5 * HZ,
			[NEIGH_VAR_DELAY_PROBE_TIME] = 5 * HZ,
			[NEIGH_VAR_GC_STALETIME] = 60 * 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_PROXY_QLEN] = 64,
			[NEIGH_VAR_ANYCAST_DELAY] = 1 * HZ,
			[NEIGH_VAR_ANYCAST_DELAY] = 1 * HZ,
			[NEIGH_VAR_PROXY_DELAY]	= (8 * HZ) / 10,
			[NEIGH_VAR_PROXY_DELAY]	= (8 * HZ) / 10,
Loading