aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/rhashtable.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/rhashtable.h')
-rw-r--r--include/linux/rhashtable.h38
1 files changed, 27 insertions, 11 deletions
diff --git a/include/linux/rhashtable.h b/include/linux/rhashtable.h
index 361c08e35dbc..c9df2527e0cd 100644
--- a/include/linux/rhashtable.h
+++ b/include/linux/rhashtable.h
@@ -207,6 +207,7 @@ struct rhashtable_iter {
207 struct rhashtable_walker walker; 207 struct rhashtable_walker walker;
208 unsigned int slot; 208 unsigned int slot;
209 unsigned int skip; 209 unsigned int skip;
210 bool end_of_table;
210}; 211};
211 212
212static inline unsigned long rht_marker(const struct rhashtable *ht, u32 hash) 213static inline unsigned long rht_marker(const struct rhashtable *ht, u32 hash)
@@ -239,34 +240,42 @@ static inline unsigned int rht_bucket_index(const struct bucket_table *tbl,
239 return (hash >> RHT_HASH_RESERVED_SPACE) & (tbl->size - 1); 240 return (hash >> RHT_HASH_RESERVED_SPACE) & (tbl->size - 1);
240} 241}
241 242
242static inline unsigned int rht_key_hashfn( 243static inline unsigned int rht_key_get_hash(struct rhashtable *ht,
243 struct rhashtable *ht, const struct bucket_table *tbl, 244 const void *key, const struct rhashtable_params params,
244 const void *key, const struct rhashtable_params params) 245 unsigned int hash_rnd)
245{ 246{
246 unsigned int hash; 247 unsigned int hash;
247 248
248 /* params must be equal to ht->p if it isn't constant. */ 249 /* params must be equal to ht->p if it isn't constant. */
249 if (!__builtin_constant_p(params.key_len)) 250 if (!__builtin_constant_p(params.key_len))
250 hash = ht->p.hashfn(key, ht->key_len, tbl->hash_rnd); 251 hash = ht->p.hashfn(key, ht->key_len, hash_rnd);
251 else if (params.key_len) { 252 else if (params.key_len) {
252 unsigned int key_len = params.key_len; 253 unsigned int key_len = params.key_len;
253 254
254 if (params.hashfn) 255 if (params.hashfn)
255 hash = params.hashfn(key, key_len, tbl->hash_rnd); 256 hash = params.hashfn(key, key_len, hash_rnd);
256 else if (key_len & (sizeof(u32) - 1)) 257 else if (key_len & (sizeof(u32) - 1))
257 hash = jhash(key, key_len, tbl->hash_rnd); 258 hash = jhash(key, key_len, hash_rnd);
258 else 259 else
259 hash = jhash2(key, key_len / sizeof(u32), 260 hash = jhash2(key, key_len / sizeof(u32), hash_rnd);
260 tbl->hash_rnd);
261 } else { 261 } else {
262 unsigned int key_len = ht->p.key_len; 262 unsigned int key_len = ht->p.key_len;
263 263
264 if (params.hashfn) 264 if (params.hashfn)
265 hash = params.hashfn(key, key_len, tbl->hash_rnd); 265 hash = params.hashfn(key, key_len, hash_rnd);
266 else 266 else
267 hash = jhash(key, key_len, tbl->hash_rnd); 267 hash = jhash(key, key_len, hash_rnd);
268 } 268 }
269 269
270 return hash;
271}
272
273static inline unsigned int rht_key_hashfn(
274 struct rhashtable *ht, const struct bucket_table *tbl,
275 const void *key, const struct rhashtable_params params)
276{
277 unsigned int hash = rht_key_get_hash(ht, key, params, tbl->hash_rnd);
278
270 return rht_bucket_index(tbl, hash); 279 return rht_bucket_index(tbl, hash);
271} 280}
272 281
@@ -378,8 +387,15 @@ void *rhashtable_insert_slow(struct rhashtable *ht, const void *key,
378void rhashtable_walk_enter(struct rhashtable *ht, 387void rhashtable_walk_enter(struct rhashtable *ht,
379 struct rhashtable_iter *iter); 388 struct rhashtable_iter *iter);
380void rhashtable_walk_exit(struct rhashtable_iter *iter); 389void rhashtable_walk_exit(struct rhashtable_iter *iter);
381int rhashtable_walk_start(struct rhashtable_iter *iter) __acquires(RCU); 390int rhashtable_walk_start_check(struct rhashtable_iter *iter) __acquires(RCU);
391
392static inline void rhashtable_walk_start(struct rhashtable_iter *iter)
393{
394 (void)rhashtable_walk_start_check(iter);
395}
396
382void *rhashtable_walk_next(struct rhashtable_iter *iter); 397void *rhashtable_walk_next(struct rhashtable_iter *iter);
398void *rhashtable_walk_peek(struct rhashtable_iter *iter);
383void rhashtable_walk_stop(struct rhashtable_iter *iter) __releases(RCU); 399void rhashtable_walk_stop(struct rhashtable_iter *iter) __releases(RCU);
384 400
385void rhashtable_free_and_destroy(struct rhashtable *ht, 401void rhashtable_free_and_destroy(struct rhashtable *ht,