diff options
author | David S. Miller <davem@davemloft.net> | 2015-03-20 12:40:33 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-03-20 12:40:33 -0400 |
commit | 750f2f9165bafb5fc20a1ec689f46c89dac54658 (patch) | |
tree | 1c688749f3b5570f62245a7bb317c94f4af43a80 /net/core/request_sock.c | |
parent | a998f712f77ea4892d3fcf24e0a67603e63da128 (diff) | |
parent | becb74f0acca19b5abfcb24dc602530f3deea66a (diff) |
Merge branch 'listener_refactor_part_14'
Eric Dumazet says:
====================
inet: tcp listener refactoring part 14
OK, we have serious patches here.
We get rid of the central timer handling SYNACK rtx,
which is killing us under even medium SYN flood.
We still use the listener specific hash table.
This will be done in next round ;)
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core/request_sock.c')
-rw-r--r-- | net/core/request_sock.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/net/core/request_sock.c b/net/core/request_sock.c index cc39a2aa663a..cdc0ddd9ac9f 100644 --- a/net/core/request_sock.c +++ b/net/core/request_sock.c @@ -94,21 +94,26 @@ void reqsk_queue_destroy(struct request_sock_queue *queue) /* make all the listen_opt local to us */ struct listen_sock *lopt = reqsk_queue_yank_listen_sk(queue); - if (lopt->qlen != 0) { + if (listen_sock_qlen(lopt) != 0) { unsigned int i; for (i = 0; i < lopt->nr_table_entries; i++) { struct request_sock *req; + write_lock_bh(&queue->syn_wait_lock); while ((req = lopt->syn_table[i]) != NULL) { lopt->syn_table[i] = req->dl_next; - lopt->qlen--; + atomic_inc(&lopt->qlen_dec); + if (del_timer(&req->rsk_timer)) + reqsk_put(req); reqsk_put(req); } + write_unlock_bh(&queue->syn_wait_lock); } } - WARN_ON(lopt->qlen != 0); + if (WARN_ON(listen_sock_qlen(lopt) != 0)) + pr_err("qlen %u\n", listen_sock_qlen(lopt)); kvfree(lopt); } @@ -187,7 +192,7 @@ void reqsk_fastopen_remove(struct sock *sk, struct request_sock *req, * * For more details see CoNext'11 "TCP Fast Open" paper. */ - req->expires = jiffies + 60*HZ; + req->rsk_timer.expires = jiffies + 60*HZ; if (fastopenq->rskq_rst_head == NULL) fastopenq->rskq_rst_head = req; else |