tcp/dccp: shrink struct listen_sock
authorEric Dumazet <edumazet@google.com>
Fri, 2 Oct 2015 18:43:33 +0000 (11:43 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sat, 3 Oct 2015 11:32:42 +0000 (04:32 -0700)
We no longer use hash_rnd, nr_table_entries and syn_table[]

For a listener with a backlog of 10 millions sockets, this
saves 80 MBytes of vmalloced memory.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/request_sock.h
net/core/request_sock.c

index e1850923c4f57d75b1f4e16697b34972554e5c68..353cb61bb399d00f8fe2e85459ac835d84740ce9 100644 (file)
@@ -125,9 +125,6 @@ extern int sysctl_max_syn_backlog;
  */
 struct listen_sock {
        u32                     max_qlen_log;
-       u32                     hash_rnd;
-       u32                     nr_table_entries;
-       struct request_sock     *syn_table[0];
 };
 
 /*
index a4b305d8ca2ba19daecddcc8fb2a87e7e8ed22d7..124f61c5bfefd12a8f20dbf3fb134086e4c0f312 100644 (file)
@@ -46,18 +46,11 @@ int reqsk_queue_alloc(struct request_sock_queue *queue,
        nr_table_entries = min_t(u32, nr_table_entries, sysctl_max_syn_backlog);
        nr_table_entries = max_t(u32, nr_table_entries, 8);
        nr_table_entries = roundup_pow_of_two(nr_table_entries + 1);
-       lopt_size += nr_table_entries * sizeof(struct request_sock *);
 
-       if (lopt_size <= (PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER))
-               lopt = kzalloc(lopt_size, GFP_KERNEL |
-                                         __GFP_NOWARN |
-                                         __GFP_NORETRY);
-       if (!lopt)
-               lopt = vzalloc(lopt_size);
+       lopt = kzalloc(lopt_size, GFP_KERNEL);
        if (!lopt)
                return -ENOMEM;
 
-       get_random_bytes(&lopt->hash_rnd, sizeof(lopt->hash_rnd));
        spin_lock_init(&queue->rskq_lock);
        spin_lock_init(&queue->syn_wait_lock);
 
@@ -68,7 +61,6 @@ int reqsk_queue_alloc(struct request_sock_queue *queue,
        queue->fastopenq.max_qlen = 0;
 
        queue->rskq_accept_head = NULL;
-       lopt->nr_table_entries = nr_table_entries;
        lopt->max_qlen_log = ilog2(nr_table_entries);
 
        spin_lock_bh(&queue->syn_wait_lock);
@@ -81,7 +73,7 @@ int reqsk_queue_alloc(struct request_sock_queue *queue,
 void __reqsk_queue_destroy(struct request_sock_queue *queue)
 {
        /* This is an error recovery path only, no locking needed */
-       kvfree(queue->listen_opt);
+       kfree(queue->listen_opt);
 }
 
 static inline struct listen_sock *reqsk_queue_yank_listen_sk(
@@ -102,7 +94,7 @@ void reqsk_queue_destroy(struct request_sock_queue *queue)
        struct listen_sock *lopt = reqsk_queue_yank_listen_sk(queue);
 
        /* cleaning is done by req timers */
-       kvfree(lopt);
+       kfree(lopt);
 }
 
 /*