Lines Matching full:ht

113 static inline void *rht_obj(const struct rhashtable *ht,  in rht_obj()  argument
116 return (char *)he - ht->p.head_offset; in rht_obj()
125 static inline unsigned int rht_key_get_hash(struct rhashtable *ht, in rht_key_get_hash() argument
131 /* params must be equal to ht->p if it isn't constant. */ in rht_key_get_hash()
133 hash = ht->p.hashfn(key, ht->key_len, hash_rnd); in rht_key_get_hash()
144 unsigned int key_len = ht->p.key_len; in rht_key_get_hash()
156 struct rhashtable *ht, const struct bucket_table *tbl, in rht_key_hashfn() argument
159 unsigned int hash = rht_key_get_hash(ht, key, params, tbl->hash_rnd); in rht_key_hashfn()
165 struct rhashtable *ht, const struct bucket_table *tbl, in rht_head_hashfn() argument
168 const char *ptr = rht_obj(ht, he); in rht_head_hashfn()
172 ht->p.key_len, in rht_head_hashfn()
174 rht_key_hashfn(ht, tbl, ptr + params.key_offset, params); in rht_head_hashfn()
179 * @ht: hash table
182 static inline bool rht_grow_above_75(const struct rhashtable *ht, in rht_grow_above_75() argument
186 return atomic_read(&ht->nelems) > (tbl->size / 4 * 3) && in rht_grow_above_75()
187 (!ht->p.max_size || tbl->size < ht->p.max_size); in rht_grow_above_75()
192 * @ht: hash table
195 static inline bool rht_shrink_below_30(const struct rhashtable *ht, in rht_shrink_below_30() argument
199 return atomic_read(&ht->nelems) < (tbl->size * 3 / 10) && in rht_shrink_below_30()
200 tbl->size > ht->p.min_size; in rht_shrink_below_30()
205 * @ht: hash table
208 static inline bool rht_grow_above_100(const struct rhashtable *ht, in rht_grow_above_100() argument
211 return atomic_read(&ht->nelems) > tbl->size && in rht_grow_above_100()
212 (!ht->p.max_size || tbl->size < ht->p.max_size); in rht_grow_above_100()
217 * @ht: hash table
220 static inline bool rht_grow_above_max(const struct rhashtable *ht, in rht_grow_above_max() argument
223 return atomic_read(&ht->nelems) >= ht->max_elems; in rht_grow_above_max()
227 int lockdep_rht_mutex_is_held(struct rhashtable *ht);
230 static inline int lockdep_rht_mutex_is_held(struct rhashtable *ht) in lockdep_rht_mutex_is_held() argument
242 void *rhashtable_insert_slow(struct rhashtable *ht, const void *key,
245 void rhashtable_walk_enter(struct rhashtable *ht,
259 void rhashtable_free_and_destroy(struct rhashtable *ht,
262 void rhashtable_destroy(struct rhashtable *ht);
269 struct rhashtable *ht, struct bucket_table *tbl, unsigned int hash);
271 #define rht_dereference(p, ht) \ argument
272 rcu_dereference_protected(p, lockdep_rht_mutex_is_held(ht))
274 #define rht_dereference_rcu(p, ht) \ argument
275 rcu_dereference_check(p, lockdep_rht_mutex_is_held(ht))
301 struct rhashtable *ht, struct bucket_table *tbl, unsigned int hash) in rht_bucket_insert() argument
303 return unlikely(tbl->nest) ? rht_bucket_nested_insert(ht, tbl, hash) : in rht_bucket_insert()
582 struct rhashtable *ht = arg->ht; in rhashtable_compare() local
585 return memcmp(ptr + ht->p.key_offset, arg->key, ht->p.key_len); in rhashtable_compare()
590 struct rhashtable *ht, const void *key, in __rhashtable_lookup() argument
594 .ht = ht, in __rhashtable_lookup()
602 tbl = rht_dereference_rcu(ht->tbl, ht); in __rhashtable_lookup()
604 hash = rht_key_hashfn(ht, tbl, key, params); in __rhashtable_lookup()
609 params.obj_cmpfn(&arg, rht_obj(ht, he)) : in __rhashtable_lookup()
610 rhashtable_compare(&arg, rht_obj(ht, he))) in __rhashtable_lookup()
622 tbl = rht_dereference_rcu(tbl->future_tbl, ht); in __rhashtable_lookup()
631 * @ht: hash table
643 struct rhashtable *ht, const void *key, in rhashtable_lookup() argument
646 struct rhash_head *he = __rhashtable_lookup(ht, key, params); in rhashtable_lookup()
648 return he ? rht_obj(ht, he) : NULL; in rhashtable_lookup()
653 * @ht: hash table
666 struct rhashtable *ht, const void *key, in rhashtable_lookup_fast() argument
672 obj = rhashtable_lookup(ht, key, params); in rhashtable_lookup_fast()
696 struct rhash_head *he = __rhashtable_lookup(&hlt->ht, key, params); in rhltable_lookup()
706 struct rhashtable *ht, const void *key, struct rhash_head *obj, in __rhashtable_insert_fast() argument
710 .ht = ht, in __rhashtable_insert_fast()
724 tbl = rht_dereference_rcu(ht->tbl, ht); in __rhashtable_insert_fast()
725 hash = rht_head_hashfn(ht, tbl, obj, params); in __rhashtable_insert_fast()
727 bkt = rht_bucket_insert(ht, tbl, hash); in __rhashtable_insert_fast()
738 return rhashtable_insert_slow(ht, key, obj); in __rhashtable_insert_fast()
748 params.obj_cmpfn(&arg, rht_obj(ht, head)) : in __rhashtable_insert_fast()
749 rhashtable_compare(&arg, rht_obj(ht, head)))) { in __rhashtable_insert_fast()
754 data = rht_obj(ht, head); in __rhashtable_insert_fast()
779 if (unlikely(rht_grow_above_max(ht, tbl))) in __rhashtable_insert_fast()
782 if (unlikely(rht_grow_above_100(ht, tbl))) in __rhashtable_insert_fast()
796 atomic_inc(&ht->nelems); in __rhashtable_insert_fast()
799 if (rht_grow_above_75(ht, tbl)) in __rhashtable_insert_fast()
800 schedule_work(&ht->run_work); in __rhashtable_insert_fast()
815 * @ht: hash table
829 struct rhashtable *ht, struct rhash_head *obj, in rhashtable_insert_fast() argument
834 ret = __rhashtable_insert_fast(ht, NULL, obj, params, false); in rhashtable_insert_fast()
861 return PTR_ERR(__rhashtable_insert_fast(&hlt->ht, key, &list->rhead, in rhltable_insert_key()
884 const char *key = rht_obj(&hlt->ht, &list->rhead); in rhltable_insert()
893 * @ht: hash table
906 struct rhashtable *ht, struct rhash_head *obj, in rhashtable_lookup_insert_fast() argument
909 const char *key = rht_obj(ht, obj); in rhashtable_lookup_insert_fast()
912 BUG_ON(ht->p.obj_hashfn); in rhashtable_lookup_insert_fast()
914 ret = __rhashtable_insert_fast(ht, key + ht->p.key_offset, obj, params, in rhashtable_lookup_insert_fast()
924 * @ht: hash table
933 struct rhashtable *ht, struct rhash_head *obj, in rhashtable_lookup_get_insert_fast() argument
936 const char *key = rht_obj(ht, obj); in rhashtable_lookup_get_insert_fast()
938 BUG_ON(ht->p.obj_hashfn); in rhashtable_lookup_get_insert_fast()
940 return __rhashtable_insert_fast(ht, key + ht->p.key_offset, obj, params, in rhashtable_lookup_get_insert_fast()
947 * @ht: hash table
960 struct rhashtable *ht, const void *key, struct rhash_head *obj, in rhashtable_lookup_insert_key() argument
965 BUG_ON(!ht->p.obj_hashfn || !key); in rhashtable_lookup_insert_key()
967 ret = __rhashtable_insert_fast(ht, key, obj, params, false); in rhashtable_lookup_insert_key()
976 * @ht: hash table
986 struct rhashtable *ht, const void *key, struct rhash_head *obj, in rhashtable_lookup_get_insert_key() argument
989 BUG_ON(!ht->p.obj_hashfn || !key); in rhashtable_lookup_get_insert_key()
991 return __rhashtable_insert_fast(ht, key, obj, params, false); in rhashtable_lookup_get_insert_key()
996 struct rhashtable *ht, struct bucket_table *tbl, in __rhashtable_remove_fast_one() argument
1007 hash = rht_head_hashfn(ht, tbl, obj, params); in __rhashtable_remove_fast_one()
1066 atomic_dec(&ht->nelems); in __rhashtable_remove_fast_one()
1067 if (unlikely(ht->p.automatic_shrinking && in __rhashtable_remove_fast_one()
1068 rht_shrink_below_30(ht, tbl))) in __rhashtable_remove_fast_one()
1069 schedule_work(&ht->run_work); in __rhashtable_remove_fast_one()
1078 struct rhashtable *ht, struct rhash_head *obj, in __rhashtable_remove_fast() argument
1086 tbl = rht_dereference_rcu(ht->tbl, ht); in __rhashtable_remove_fast()
1093 while ((err = __rhashtable_remove_fast_one(ht, tbl, obj, params, in __rhashtable_remove_fast()
1095 (tbl = rht_dereference_rcu(tbl->future_tbl, ht))) in __rhashtable_remove_fast()
1105 * @ht: hash table
1119 struct rhashtable *ht, struct rhash_head *obj, in rhashtable_remove_fast() argument
1122 return __rhashtable_remove_fast(ht, obj, params, false); in rhashtable_remove_fast()
1144 return __rhashtable_remove_fast(&hlt->ht, &list->rhead, params, true); in rhltable_remove()
1149 struct rhashtable *ht, struct bucket_table *tbl, in __rhashtable_replace_fast() argument
1163 hash = rht_head_hashfn(ht, tbl, obj_old, params); in __rhashtable_replace_fast()
1164 if (hash != rht_head_hashfn(ht, tbl, obj_new, params)) in __rhashtable_replace_fast()
1199 * @ht: hash table
1212 struct rhashtable *ht, struct rhash_head *obj_old, in rhashtable_replace_fast() argument
1221 tbl = rht_dereference_rcu(ht->tbl, ht); in rhashtable_replace_fast()
1228 while ((err = __rhashtable_replace_fast(ht, tbl, obj_old, in rhashtable_replace_fast()
1230 (tbl = rht_dereference_rcu(tbl->future_tbl, ht))) in rhashtable_replace_fast()
1262 return rhashtable_walk_enter(&hlt->ht, iter); in rhltable_walk_enter()
1278 return rhashtable_free_and_destroy(&hlt->ht, free_fn, arg); in rhltable_free_and_destroy()