From fb6fa4a4919540113a7a3c25080f732a9b250601 Mon Sep 17 00:00:00 2001 From: Pavel Emelyanov Date: Thu, 15 Nov 2007 02:57:06 -0800 Subject: [PATCH] --- yaml --- r: 73871 b: refs/heads/master c: dab6ba36888a12f3e3edff71eeef968fc159178a h: refs/heads/master i: 73869: 3375089f58e8252719c7ee2453e63c11f4492bdf 73867: 830d203e984877f950c0591c8f17c50278e13c00 73863: cc18ef7c46bd15a58f585f2aec33c77df9655f24 73855: f80fbff17128d2851a5df07d02a080cb8491a7b3 v: v3 --- [refs] | 2 +- trunk/include/net/request_sock.h | 18 +--------------- trunk/net/core/request_sock.c | 35 ++++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 18 deletions(-) diff --git a/[refs] b/[refs] index b43286f22f14..e709992b8e92 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: bd7b3f34198071d8bec05180530c362f1800ba46 +refs/heads/master: dab6ba36888a12f3e3edff71eeef968fc159178a diff --git a/trunk/include/net/request_sock.h b/trunk/include/net/request_sock.h index 7aed02ce2b65..cff4608179c1 100644 --- a/trunk/include/net/request_sock.h +++ b/trunk/include/net/request_sock.h @@ -124,23 +124,7 @@ struct request_sock_queue { extern int reqsk_queue_alloc(struct request_sock_queue *queue, unsigned int nr_table_entries); -static inline struct listen_sock *reqsk_queue_yank_listen_sk(struct request_sock_queue *queue) -{ - struct listen_sock *lopt; - - write_lock_bh(&queue->syn_wait_lock); - lopt = queue->listen_opt; - queue->listen_opt = NULL; - write_unlock_bh(&queue->syn_wait_lock); - - return lopt; -} - -static inline void __reqsk_queue_destroy(struct request_sock_queue *queue) -{ - kfree(reqsk_queue_yank_listen_sk(queue)); -} - +extern void __reqsk_queue_destroy(struct request_sock_queue *queue); extern void reqsk_queue_destroy(struct request_sock_queue *queue); static inline struct request_sock * diff --git a/trunk/net/core/request_sock.c b/trunk/net/core/request_sock.c index 5f0818d815e6..45aed75cb571 100644 --- a/trunk/net/core/request_sock.c +++ b/trunk/net/core/request_sock.c @@ -71,6 +71,41 @@ int reqsk_queue_alloc(struct request_sock_queue *queue, EXPORT_SYMBOL(reqsk_queue_alloc); +void __reqsk_queue_destroy(struct request_sock_queue *queue) +{ + struct listen_sock *lopt; + size_t lopt_size; + + /* + * this is an error recovery path only + * no locking needed and the lopt is not NULL + */ + + lopt = queue->listen_opt; + lopt_size = sizeof(struct listen_sock) + + lopt->nr_table_entries * sizeof(struct request_sock *); + + if (lopt_size > PAGE_SIZE) + vfree(lopt); + else + kfree(lopt); +} + +EXPORT_SYMBOL(__reqsk_queue_destroy); + +static inline struct listen_sock *reqsk_queue_yank_listen_sk( + struct request_sock_queue *queue) +{ + struct listen_sock *lopt; + + write_lock_bh(&queue->syn_wait_lock); + lopt = queue->listen_opt; + queue->listen_opt = NULL; + write_unlock_bh(&queue->syn_wait_lock); + + return lopt; +} + void reqsk_queue_destroy(struct request_sock_queue *queue) { /* make all the listen_opt local to us */