mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-22 23:04:43 +00:00
[NET]: Size listen hash tables using backlog hint
We currently allocate a fixed size (TCP_SYNQ_HSIZE=512) slots hash table for each LISTEN socket, regardless of various parameters (listen backlog for example) On x86_64, this means order-1 allocations (might fail), even for 'small' sockets, expecting few connections. On the contrary, a huge server wanting a backlog of 50000 is slowed down a bit because of this fixed limit. This patch makes the sizing of listen hash table a dynamic parameter, depending of : - net.core.somaxconn tunable (default is 128) - net.ipv4.tcp_max_syn_backlog tunable (default : 256, 1024 or 128) - backlog value given by user application (2nd parameter of listen()) For large allocations (bigger than PAGE_SIZE), we use vmalloc() instead of kmalloc(). We still limit memory allocation with the two existing tunables (somaxconn & tcp_max_syn_backlog). So for standard setups, this patch actually reduce RAM usage. Signed-off-by: Eric Dumazet <dada1@cosmosbay.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
3c62f75aac
commit
72a3effaf6
9 changed files with 38 additions and 24 deletions
|
@ -715,7 +715,7 @@ static struct ip_options *tcp_v4_save_options(struct sock *sk,
|
|||
return dopt;
|
||||
}
|
||||
|
||||
struct request_sock_ops tcp_request_sock_ops = {
|
||||
struct request_sock_ops tcp_request_sock_ops __read_mostly = {
|
||||
.family = PF_INET,
|
||||
.obj_size = sizeof(struct tcp_request_sock),
|
||||
.rtx_syn_ack = tcp_v4_send_synack,
|
||||
|
@ -1385,7 +1385,7 @@ static void *listening_get_next(struct seq_file *seq, void *cur)
|
|||
if (st->state == TCP_SEQ_STATE_OPENREQ) {
|
||||
struct request_sock *req = cur;
|
||||
|
||||
icsk = inet_csk(st->syn_wait_sk);
|
||||
icsk = inet_csk(st->syn_wait_sk);
|
||||
req = req->dl_next;
|
||||
while (1) {
|
||||
while (req) {
|
||||
|
@ -1395,7 +1395,7 @@ static void *listening_get_next(struct seq_file *seq, void *cur)
|
|||
}
|
||||
req = req->dl_next;
|
||||
}
|
||||
if (++st->sbucket >= TCP_SYNQ_HSIZE)
|
||||
if (++st->sbucket >= icsk->icsk_accept_queue.listen_opt->nr_table_entries)
|
||||
break;
|
||||
get_req:
|
||||
req = icsk->icsk_accept_queue.listen_opt->syn_table[st->sbucket];
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue