[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:

committed by
David S. Miller

parent
3c62f75aac
commit
72a3effaf6
@@ -28,8 +28,8 @@ struct proto;
|
||||
|
||||
struct request_sock_ops {
|
||||
int family;
|
||||
kmem_cache_t *slab;
|
||||
int obj_size;
|
||||
kmem_cache_t *slab;
|
||||
int (*rtx_syn_ack)(struct sock *sk,
|
||||
struct request_sock *req,
|
||||
struct dst_entry *dst);
|
||||
@@ -51,13 +51,13 @@ struct request_sock {
|
||||
u32 rcv_wnd; /* rcv_wnd offered first time */
|
||||
u32 ts_recent;
|
||||
unsigned long expires;
|
||||
struct request_sock_ops *rsk_ops;
|
||||
const struct request_sock_ops *rsk_ops;
|
||||
struct sock *sk;
|
||||
u32 secid;
|
||||
u32 peer_secid;
|
||||
};
|
||||
|
||||
static inline struct request_sock *reqsk_alloc(struct request_sock_ops *ops)
|
||||
static inline struct request_sock *reqsk_alloc(const struct request_sock_ops *ops)
|
||||
{
|
||||
struct request_sock *req = kmem_cache_alloc(ops->slab, SLAB_ATOMIC);
|
||||
|
||||
@@ -121,7 +121,7 @@ struct request_sock_queue {
|
||||
};
|
||||
|
||||
extern int reqsk_queue_alloc(struct request_sock_queue *queue,
|
||||
const int nr_table_entries);
|
||||
unsigned int nr_table_entries);
|
||||
|
||||
static inline struct listen_sock *reqsk_queue_yank_listen_sk(struct request_sock_queue *queue)
|
||||
{
|
||||
|
Reference in New Issue
Block a user