diff options
Diffstat (limited to 'net/ipv4/inet_timewait_sock.c')
| -rw-r--r-- | net/ipv4/inet_timewait_sock.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/net/ipv4/inet_timewait_sock.c b/net/ipv4/inet_timewait_sock.c index 8554d0ea171..61283f92882 100644 --- a/net/ipv4/inet_timewait_sock.c +++ b/net/ipv4/inet_timewait_sock.c | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | */ | 9 | */ |
| 10 | 10 | ||
| 11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
| 12 | #include <linux/kmemcheck.h> | ||
| 12 | #include <net/inet_hashtables.h> | 13 | #include <net/inet_hashtables.h> |
| 13 | #include <net/inet_timewait_sock.h> | 14 | #include <net/inet_timewait_sock.h> |
| 14 | #include <net/ip.h> | 15 | #include <net/ip.h> |
| @@ -49,19 +50,22 @@ static void __inet_twsk_kill(struct inet_timewait_sock *tw, | |||
| 49 | inet_twsk_put(tw); | 50 | inet_twsk_put(tw); |
| 50 | } | 51 | } |
| 51 | 52 | ||
| 52 | void inet_twsk_put(struct inet_timewait_sock *tw) | 53 | static noinline void inet_twsk_free(struct inet_timewait_sock *tw) |
| 53 | { | 54 | { |
| 54 | if (atomic_dec_and_test(&tw->tw_refcnt)) { | 55 | struct module *owner = tw->tw_prot->owner; |
| 55 | struct module *owner = tw->tw_prot->owner; | 56 | twsk_destructor((struct sock *)tw); |
| 56 | twsk_destructor((struct sock *)tw); | ||
| 57 | #ifdef SOCK_REFCNT_DEBUG | 57 | #ifdef SOCK_REFCNT_DEBUG |
| 58 | printk(KERN_DEBUG "%s timewait_sock %p released\n", | 58 | pr_debug("%s timewait_sock %p released\n", tw->tw_prot->name, tw); |
| 59 | tw->tw_prot->name, tw); | ||
| 60 | #endif | 59 | #endif |
| 61 | release_net(twsk_net(tw)); | 60 | release_net(twsk_net(tw)); |
| 62 | kmem_cache_free(tw->tw_prot->twsk_prot->twsk_slab, tw); | 61 | kmem_cache_free(tw->tw_prot->twsk_prot->twsk_slab, tw); |
| 63 | module_put(owner); | 62 | module_put(owner); |
| 64 | } | 63 | } |
| 64 | |||
| 65 | void inet_twsk_put(struct inet_timewait_sock *tw) | ||
| 66 | { | ||
| 67 | if (atomic_dec_and_test(&tw->tw_refcnt)) | ||
| 68 | inet_twsk_free(tw); | ||
| 65 | } | 69 | } |
| 66 | EXPORT_SYMBOL_GPL(inet_twsk_put); | 70 | EXPORT_SYMBOL_GPL(inet_twsk_put); |
| 67 | 71 | ||
| @@ -117,6 +121,8 @@ struct inet_timewait_sock *inet_twsk_alloc(const struct sock *sk, const int stat | |||
| 117 | if (tw != NULL) { | 121 | if (tw != NULL) { |
| 118 | const struct inet_sock *inet = inet_sk(sk); | 122 | const struct inet_sock *inet = inet_sk(sk); |
| 119 | 123 | ||
| 124 | kmemcheck_annotate_bitfield(tw, flags); | ||
| 125 | |||
| 120 | /* Give us an identity. */ | 126 | /* Give us an identity. */ |
| 121 | tw->tw_daddr = inet->daddr; | 127 | tw->tw_daddr = inet->daddr; |
| 122 | tw->tw_rcv_saddr = inet->rcv_saddr; | 128 | tw->tw_rcv_saddr = inet->rcv_saddr; |
