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: Eric Dumazet <edumazet@google.com> Reported-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
0dd5759dbb
commit
eaa72dc474
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue