diff options
Diffstat (limited to 'include/net/inet_hashtables.h')
| -rw-r--r-- | include/net/inet_hashtables.h | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/include/net/inet_hashtables.h b/include/net/inet_hashtables.h index 2dbbbff5e1e3..9141e95529e7 100644 --- a/include/net/inet_hashtables.h +++ b/include/net/inet_hashtables.h | |||
| @@ -111,6 +111,7 @@ struct inet_bind_hashbucket { | |||
| 111 | */ | 111 | */ |
| 112 | struct inet_listen_hashbucket { | 112 | struct inet_listen_hashbucket { |
| 113 | spinlock_t lock; | 113 | spinlock_t lock; |
| 114 | unsigned int count; | ||
| 114 | struct hlist_head head; | 115 | struct hlist_head head; |
| 115 | }; | 116 | }; |
| 116 | 117 | ||
| @@ -132,12 +133,13 @@ struct inet_hashinfo { | |||
| 132 | /* Ok, let's try this, I give up, we do need a local binding | 133 | /* Ok, let's try this, I give up, we do need a local binding |
| 133 | * TCP hash as well as the others for fast bind/connect. | 134 | * TCP hash as well as the others for fast bind/connect. |
| 134 | */ | 135 | */ |
| 136 | struct kmem_cache *bind_bucket_cachep; | ||
| 135 | struct inet_bind_hashbucket *bhash; | 137 | struct inet_bind_hashbucket *bhash; |
| 136 | |||
| 137 | unsigned int bhash_size; | 138 | unsigned int bhash_size; |
| 138 | /* 4 bytes hole on 64 bit */ | ||
| 139 | 139 | ||
| 140 | struct kmem_cache *bind_bucket_cachep; | 140 | /* The 2nd listener table hashed by local port and address */ |
| 141 | unsigned int lhash2_mask; | ||
| 142 | struct inet_listen_hashbucket *lhash2; | ||
| 141 | 143 | ||
| 142 | /* All the above members are written once at bootup and | 144 | /* All the above members are written once at bootup and |
| 143 | * never written again _or_ are predominantly read-access. | 145 | * never written again _or_ are predominantly read-access. |
| @@ -145,14 +147,25 @@ struct inet_hashinfo { | |||
| 145 | * Now align to a new cache line as all the following members | 147 | * Now align to a new cache line as all the following members |
| 146 | * might be often dirty. | 148 | * might be often dirty. |
| 147 | */ | 149 | */ |
| 148 | /* All sockets in TCP_LISTEN state will be in here. This is the only | 150 | /* All sockets in TCP_LISTEN state will be in listening_hash. |
| 149 | * table where wildcard'd TCP sockets can exist. Hash function here | 151 | * This is the only table where wildcard'd TCP sockets can |
| 150 | * is just local port number. | 152 | * exist. listening_hash is only hashed by local port number. |
| 153 | * If lhash2 is initialized, the same socket will also be hashed | ||
| 154 | * to lhash2 by port and address. | ||
| 151 | */ | 155 | */ |
| 152 | struct inet_listen_hashbucket listening_hash[INET_LHTABLE_SIZE] | 156 | struct inet_listen_hashbucket listening_hash[INET_LHTABLE_SIZE] |
| 153 | ____cacheline_aligned_in_smp; | 157 | ____cacheline_aligned_in_smp; |
| 154 | }; | 158 | }; |
| 155 | 159 | ||
| 160 | #define inet_lhash2_for_each_icsk_rcu(__icsk, list) \ | ||
| 161 | hlist_for_each_entry_rcu(__icsk, list, icsk_listen_portaddr_node) | ||
| 162 | |||
| 163 | static inline struct inet_listen_hashbucket * | ||
| 164 | inet_lhash2_bucket(struct inet_hashinfo *h, u32 hash) | ||
| 165 | { | ||
| 166 | return &h->lhash2[hash & h->lhash2_mask]; | ||
| 167 | } | ||
| 168 | |||
| 156 | static inline struct inet_ehash_bucket *inet_ehash_bucket( | 169 | static inline struct inet_ehash_bucket *inet_ehash_bucket( |
| 157 | struct inet_hashinfo *hashinfo, | 170 | struct inet_hashinfo *hashinfo, |
| 158 | unsigned int hash) | 171 | unsigned int hash) |
| @@ -208,6 +221,10 @@ int __inet_inherit_port(const struct sock *sk, struct sock *child); | |||
| 208 | void inet_put_port(struct sock *sk); | 221 | void inet_put_port(struct sock *sk); |
| 209 | 222 | ||
| 210 | void inet_hashinfo_init(struct inet_hashinfo *h); | 223 | void inet_hashinfo_init(struct inet_hashinfo *h); |
| 224 | void inet_hashinfo2_init(struct inet_hashinfo *h, const char *name, | ||
| 225 | unsigned long numentries, int scale, | ||
| 226 | unsigned long low_limit, | ||
| 227 | unsigned long high_limit); | ||
| 211 | 228 | ||
| 212 | bool inet_ehash_insert(struct sock *sk, struct sock *osk); | 229 | bool inet_ehash_insert(struct sock *sk, struct sock *osk); |
| 213 | bool inet_ehash_nolisten(struct sock *sk, struct sock *osk); | 230 | bool inet_ehash_nolisten(struct sock *sk, struct sock *osk); |
