xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8723ds/os_dep/linux/rhashtable.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Resizable, Scalable, Concurrent Hash Table
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright (c) 2015 Herbert Xu <herbert@gondor.apana.org.au>
5*4882a593Smuzhiyun  * Copyright (c) 2014-2015 Thomas Graf <tgraf@suug.ch>
6*4882a593Smuzhiyun  * Copyright (c) 2008-2014 Patrick McHardy <kaber@trash.net>
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * Code partially derived from nft_hash
9*4882a593Smuzhiyun  * Rewritten with rehash code from br_multicast plus single list
10*4882a593Smuzhiyun  * pointer as suggested by Josh Triplett
11*4882a593Smuzhiyun  *
12*4882a593Smuzhiyun  * This program is free software; you can redistribute it and/or modify
13*4882a593Smuzhiyun  * it under the terms of the GNU General Public License version 2 as
14*4882a593Smuzhiyun  * published by the Free Software Foundation.
15*4882a593Smuzhiyun  */
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #include <linux/atomic.h>
18*4882a593Smuzhiyun #include <linux/kernel.h>
19*4882a593Smuzhiyun #include <linux/init.h>
20*4882a593Smuzhiyun #include <linux/log2.h>
21*4882a593Smuzhiyun #include <linux/sched.h>
22*4882a593Smuzhiyun #include <linux/slab.h>
23*4882a593Smuzhiyun #include <linux/vmalloc.h>
24*4882a593Smuzhiyun #include <linux/mm.h>
25*4882a593Smuzhiyun #include <linux/jhash.h>
26*4882a593Smuzhiyun #include <linux/random.h>
27*4882a593Smuzhiyun #include <linux/err.h>
28*4882a593Smuzhiyun #include <linux/export.h>
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #define HASH_DEFAULT_SIZE	64UL
31*4882a593Smuzhiyun #define HASH_MIN_SIZE		4U
32*4882a593Smuzhiyun #define BUCKET_LOCKS_PER_CPU   128UL
33*4882a593Smuzhiyun 
head_hashfn(struct rhashtable * ht,const struct bucket_table * tbl,const struct rhash_head * he)34*4882a593Smuzhiyun static u32 head_hashfn(struct rhashtable *ht,
35*4882a593Smuzhiyun 		       const struct bucket_table *tbl,
36*4882a593Smuzhiyun 		       const struct rhash_head *he)
37*4882a593Smuzhiyun {
38*4882a593Smuzhiyun 	return rht_head_hashfn(ht, tbl, he, ht->p);
39*4882a593Smuzhiyun }
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun #ifdef CONFIG_PROVE_LOCKING
42*4882a593Smuzhiyun #define ASSERT_RHT_MUTEX(HT) BUG_ON(!lockdep_rht_mutex_is_held(HT))
43*4882a593Smuzhiyun 
lockdep_rht_mutex_is_held(struct rhashtable * ht)44*4882a593Smuzhiyun int lockdep_rht_mutex_is_held(struct rhashtable *ht)
45*4882a593Smuzhiyun {
46*4882a593Smuzhiyun 	return (debug_locks) ? lockdep_is_held(&ht->mutex) : 1;
47*4882a593Smuzhiyun }
48*4882a593Smuzhiyun 
lockdep_rht_bucket_is_held(const struct bucket_table * tbl,u32 hash)49*4882a593Smuzhiyun int lockdep_rht_bucket_is_held(const struct bucket_table *tbl, u32 hash)
50*4882a593Smuzhiyun {
51*4882a593Smuzhiyun 	spinlock_t *lock = rht_bucket_lock(tbl, hash);
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun 	return (debug_locks) ? lockdep_is_held(lock) : 1;
54*4882a593Smuzhiyun }
55*4882a593Smuzhiyun #else
56*4882a593Smuzhiyun #define ASSERT_RHT_MUTEX(HT)
57*4882a593Smuzhiyun #endif
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun 
alloc_bucket_locks(struct rhashtable * ht,struct bucket_table * tbl,gfp_t gfp)60*4882a593Smuzhiyun static int alloc_bucket_locks(struct rhashtable *ht, struct bucket_table *tbl,
61*4882a593Smuzhiyun 			      gfp_t gfp)
62*4882a593Smuzhiyun {
63*4882a593Smuzhiyun 	unsigned int i, size;
64*4882a593Smuzhiyun #if defined(CONFIG_PROVE_LOCKING)
65*4882a593Smuzhiyun 	unsigned int nr_pcpus = 2;
66*4882a593Smuzhiyun #else
67*4882a593Smuzhiyun 	unsigned int nr_pcpus = num_possible_cpus();
68*4882a593Smuzhiyun #endif
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun 	nr_pcpus = min_t(unsigned int, nr_pcpus, 32UL);
71*4882a593Smuzhiyun 	size = roundup_pow_of_two(nr_pcpus * ht->p.locks_mul);
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun 	/* Never allocate more than 0.5 locks per bucket */
74*4882a593Smuzhiyun 	size = min_t(unsigned int, size, tbl->size >> 1);
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun 	if (sizeof(spinlock_t) != 0) {
77*4882a593Smuzhiyun #ifdef CONFIG_NUMA
78*4882a593Smuzhiyun 		if (size * sizeof(spinlock_t) > PAGE_SIZE &&
79*4882a593Smuzhiyun 		    gfp == GFP_KERNEL)
80*4882a593Smuzhiyun 			tbl->locks = vmalloc(size * sizeof(spinlock_t));
81*4882a593Smuzhiyun 		else
82*4882a593Smuzhiyun #endif
83*4882a593Smuzhiyun 		tbl->locks = kmalloc_array(size, sizeof(spinlock_t),
84*4882a593Smuzhiyun 					   gfp);
85*4882a593Smuzhiyun 		if (!tbl->locks)
86*4882a593Smuzhiyun 			return -ENOMEM;
87*4882a593Smuzhiyun 		for (i = 0; i < size; i++)
88*4882a593Smuzhiyun 			spin_lock_init(&tbl->locks[i]);
89*4882a593Smuzhiyun 	}
90*4882a593Smuzhiyun 	tbl->locks_mask = size - 1;
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun 	return 0;
93*4882a593Smuzhiyun }
94*4882a593Smuzhiyun 
bucket_table_free(const struct bucket_table * tbl)95*4882a593Smuzhiyun static void bucket_table_free(const struct bucket_table *tbl)
96*4882a593Smuzhiyun {
97*4882a593Smuzhiyun 	if (tbl)
98*4882a593Smuzhiyun 		kvfree(tbl->locks);
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun 	kvfree(tbl);
101*4882a593Smuzhiyun }
102*4882a593Smuzhiyun 
bucket_table_free_rcu(struct rcu_head * head)103*4882a593Smuzhiyun static void bucket_table_free_rcu(struct rcu_head *head)
104*4882a593Smuzhiyun {
105*4882a593Smuzhiyun 	bucket_table_free(container_of(head, struct bucket_table, rcu));
106*4882a593Smuzhiyun }
107*4882a593Smuzhiyun 
bucket_table_alloc(struct rhashtable * ht,size_t nbuckets,gfp_t gfp)108*4882a593Smuzhiyun static struct bucket_table *bucket_table_alloc(struct rhashtable *ht,
109*4882a593Smuzhiyun 					       size_t nbuckets,
110*4882a593Smuzhiyun 					       gfp_t gfp)
111*4882a593Smuzhiyun {
112*4882a593Smuzhiyun 	struct bucket_table *tbl = NULL;
113*4882a593Smuzhiyun 	size_t size;
114*4882a593Smuzhiyun 	int i;
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun 	size = sizeof(*tbl) + nbuckets * sizeof(tbl->buckets[0]);
117*4882a593Smuzhiyun 	if (size <= (PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER) ||
118*4882a593Smuzhiyun 	    gfp != GFP_KERNEL)
119*4882a593Smuzhiyun 		tbl = kzalloc(size, gfp | __GFP_NOWARN | __GFP_NORETRY);
120*4882a593Smuzhiyun 	if (tbl == NULL && gfp == GFP_KERNEL)
121*4882a593Smuzhiyun 		tbl = vzalloc(size);
122*4882a593Smuzhiyun 	if (tbl == NULL)
123*4882a593Smuzhiyun 		return NULL;
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun 	tbl->size = nbuckets;
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun 	if (alloc_bucket_locks(ht, tbl, gfp) < 0) {
128*4882a593Smuzhiyun 		bucket_table_free(tbl);
129*4882a593Smuzhiyun 		return NULL;
130*4882a593Smuzhiyun 	}
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun 	INIT_LIST_HEAD(&tbl->walkers);
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun 	get_random_bytes(&tbl->hash_rnd, sizeof(tbl->hash_rnd));
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun 	for (i = 0; i < nbuckets; i++)
137*4882a593Smuzhiyun 		INIT_RHT_NULLS_HEAD(tbl->buckets[i], ht, i);
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun 	return tbl;
140*4882a593Smuzhiyun }
141*4882a593Smuzhiyun 
rhashtable_last_table(struct rhashtable * ht,struct bucket_table * tbl)142*4882a593Smuzhiyun static struct bucket_table *rhashtable_last_table(struct rhashtable *ht,
143*4882a593Smuzhiyun 						  struct bucket_table *tbl)
144*4882a593Smuzhiyun {
145*4882a593Smuzhiyun 	struct bucket_table *new_tbl;
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun 	do {
148*4882a593Smuzhiyun 		new_tbl = tbl;
149*4882a593Smuzhiyun 		tbl = rht_dereference_rcu(tbl->future_tbl, ht);
150*4882a593Smuzhiyun 	} while (tbl);
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun 	return new_tbl;
153*4882a593Smuzhiyun }
154*4882a593Smuzhiyun 
rhashtable_rehash_one(struct rhashtable * ht,unsigned int old_hash)155*4882a593Smuzhiyun static int rhashtable_rehash_one(struct rhashtable *ht, unsigned int old_hash)
156*4882a593Smuzhiyun {
157*4882a593Smuzhiyun 	struct bucket_table *old_tbl = rht_dereference(ht->tbl, ht);
158*4882a593Smuzhiyun 	struct bucket_table *new_tbl = rhashtable_last_table(ht,
159*4882a593Smuzhiyun 		rht_dereference_rcu(old_tbl->future_tbl, ht));
160*4882a593Smuzhiyun 	struct rhash_head __rcu **pprev = &old_tbl->buckets[old_hash];
161*4882a593Smuzhiyun 	int err = -ENOENT;
162*4882a593Smuzhiyun 	struct rhash_head *head, *next, *entry;
163*4882a593Smuzhiyun 	spinlock_t *new_bucket_lock;
164*4882a593Smuzhiyun 	unsigned int new_hash;
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun 	rht_for_each(entry, old_tbl, old_hash) {
167*4882a593Smuzhiyun 		err = 0;
168*4882a593Smuzhiyun 		next = rht_dereference_bucket(entry->next, old_tbl, old_hash);
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun 		if (rht_is_a_nulls(next))
171*4882a593Smuzhiyun 			break;
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun 		pprev = &entry->next;
174*4882a593Smuzhiyun 	}
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun 	if (err)
177*4882a593Smuzhiyun 		goto out;
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun 	new_hash = head_hashfn(ht, new_tbl, entry);
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun 	new_bucket_lock = rht_bucket_lock(new_tbl, new_hash);
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun 	spin_lock_nested(new_bucket_lock, SINGLE_DEPTH_NESTING);
184*4882a593Smuzhiyun 	head = rht_dereference_bucket(new_tbl->buckets[new_hash],
185*4882a593Smuzhiyun 				      new_tbl, new_hash);
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun 	RCU_INIT_POINTER(entry->next, head);
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun 	rcu_assign_pointer(new_tbl->buckets[new_hash], entry);
190*4882a593Smuzhiyun 	spin_unlock(new_bucket_lock);
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun 	rcu_assign_pointer(*pprev, next);
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun out:
195*4882a593Smuzhiyun 	return err;
196*4882a593Smuzhiyun }
197*4882a593Smuzhiyun 
rhashtable_rehash_chain(struct rhashtable * ht,unsigned int old_hash)198*4882a593Smuzhiyun static void rhashtable_rehash_chain(struct rhashtable *ht,
199*4882a593Smuzhiyun 				    unsigned int old_hash)
200*4882a593Smuzhiyun {
201*4882a593Smuzhiyun 	struct bucket_table *old_tbl = rht_dereference(ht->tbl, ht);
202*4882a593Smuzhiyun 	spinlock_t *old_bucket_lock;
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun 	old_bucket_lock = rht_bucket_lock(old_tbl, old_hash);
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun 	spin_lock_bh(old_bucket_lock);
207*4882a593Smuzhiyun 	while (!rhashtable_rehash_one(ht, old_hash))
208*4882a593Smuzhiyun 		;
209*4882a593Smuzhiyun 	old_tbl->rehash++;
210*4882a593Smuzhiyun 	spin_unlock_bh(old_bucket_lock);
211*4882a593Smuzhiyun }
212*4882a593Smuzhiyun 
rhashtable_rehash_attach(struct rhashtable * ht,struct bucket_table * old_tbl,struct bucket_table * new_tbl)213*4882a593Smuzhiyun static int rhashtable_rehash_attach(struct rhashtable *ht,
214*4882a593Smuzhiyun 				    struct bucket_table *old_tbl,
215*4882a593Smuzhiyun 				    struct bucket_table *new_tbl)
216*4882a593Smuzhiyun {
217*4882a593Smuzhiyun 	/* Protect future_tbl using the first bucket lock. */
218*4882a593Smuzhiyun 	spin_lock_bh(old_tbl->locks);
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun 	/* Did somebody beat us to it? */
221*4882a593Smuzhiyun 	if (rcu_access_pointer(old_tbl->future_tbl)) {
222*4882a593Smuzhiyun 		spin_unlock_bh(old_tbl->locks);
223*4882a593Smuzhiyun 		return -EEXIST;
224*4882a593Smuzhiyun 	}
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun 	/* Make insertions go into the new, empty table right away. Deletions
227*4882a593Smuzhiyun 	 * and lookups will be attempted in both tables until we synchronize.
228*4882a593Smuzhiyun 	 */
229*4882a593Smuzhiyun 	rcu_assign_pointer(old_tbl->future_tbl, new_tbl);
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun 	/* Ensure the new table is visible to readers. */
232*4882a593Smuzhiyun 	smp_wmb();
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun 	spin_unlock_bh(old_tbl->locks);
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun 	return 0;
237*4882a593Smuzhiyun }
238*4882a593Smuzhiyun 
rhashtable_rehash_table(struct rhashtable * ht)239*4882a593Smuzhiyun static int rhashtable_rehash_table(struct rhashtable *ht)
240*4882a593Smuzhiyun {
241*4882a593Smuzhiyun 	struct bucket_table *old_tbl = rht_dereference(ht->tbl, ht);
242*4882a593Smuzhiyun 	struct bucket_table *new_tbl;
243*4882a593Smuzhiyun 	struct rhashtable_walker *walker;
244*4882a593Smuzhiyun 	unsigned int old_hash;
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun 	new_tbl = rht_dereference(old_tbl->future_tbl, ht);
247*4882a593Smuzhiyun 	if (!new_tbl)
248*4882a593Smuzhiyun 		return 0;
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	for (old_hash = 0; old_hash < old_tbl->size; old_hash++)
251*4882a593Smuzhiyun 		rhashtable_rehash_chain(ht, old_hash);
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun 	/* Publish the new table pointer. */
254*4882a593Smuzhiyun 	rcu_assign_pointer(ht->tbl, new_tbl);
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun 	spin_lock(&ht->lock);
257*4882a593Smuzhiyun 	list_for_each_entry(walker, &old_tbl->walkers, list)
258*4882a593Smuzhiyun 		walker->tbl = NULL;
259*4882a593Smuzhiyun 	spin_unlock(&ht->lock);
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun 	/* Wait for readers. All new readers will see the new
262*4882a593Smuzhiyun 	 * table, and thus no references to the old table will
263*4882a593Smuzhiyun 	 * remain.
264*4882a593Smuzhiyun 	 */
265*4882a593Smuzhiyun 	call_rcu(&old_tbl->rcu, bucket_table_free_rcu);
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun 	return rht_dereference(new_tbl->future_tbl, ht) ? -EAGAIN : 0;
268*4882a593Smuzhiyun }
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun /**
271*4882a593Smuzhiyun  * rhashtable_expand - Expand hash table while allowing concurrent lookups
272*4882a593Smuzhiyun  * @ht:		the hash table to expand
273*4882a593Smuzhiyun  *
274*4882a593Smuzhiyun  * A secondary bucket array is allocated and the hash entries are migrated.
275*4882a593Smuzhiyun  *
276*4882a593Smuzhiyun  * This function may only be called in a context where it is safe to call
277*4882a593Smuzhiyun  * synchronize_rcu(), e.g. not within a rcu_read_lock() section.
278*4882a593Smuzhiyun  *
279*4882a593Smuzhiyun  * The caller must ensure that no concurrent resizing occurs by holding
280*4882a593Smuzhiyun  * ht->mutex.
281*4882a593Smuzhiyun  *
282*4882a593Smuzhiyun  * It is valid to have concurrent insertions and deletions protected by per
283*4882a593Smuzhiyun  * bucket locks or concurrent RCU protected lookups and traversals.
284*4882a593Smuzhiyun  */
rhashtable_expand(struct rhashtable * ht)285*4882a593Smuzhiyun static int rhashtable_expand(struct rhashtable *ht)
286*4882a593Smuzhiyun {
287*4882a593Smuzhiyun 	struct bucket_table *new_tbl, *old_tbl = rht_dereference(ht->tbl, ht);
288*4882a593Smuzhiyun 	int err;
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun 	ASSERT_RHT_MUTEX(ht);
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	old_tbl = rhashtable_last_table(ht, old_tbl);
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun 	new_tbl = bucket_table_alloc(ht, old_tbl->size * 2, GFP_KERNEL);
295*4882a593Smuzhiyun 	if (new_tbl == NULL)
296*4882a593Smuzhiyun 		return -ENOMEM;
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun 	err = rhashtable_rehash_attach(ht, old_tbl, new_tbl);
299*4882a593Smuzhiyun 	if (err)
300*4882a593Smuzhiyun 		bucket_table_free(new_tbl);
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun 	return err;
303*4882a593Smuzhiyun }
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun /**
306*4882a593Smuzhiyun  * rhashtable_shrink - Shrink hash table while allowing concurrent lookups
307*4882a593Smuzhiyun  * @ht:		the hash table to shrink
308*4882a593Smuzhiyun  *
309*4882a593Smuzhiyun  * This function shrinks the hash table to fit, i.e., the smallest
310*4882a593Smuzhiyun  * size would not cause it to expand right away automatically.
311*4882a593Smuzhiyun  *
312*4882a593Smuzhiyun  * The caller must ensure that no concurrent resizing occurs by holding
313*4882a593Smuzhiyun  * ht->mutex.
314*4882a593Smuzhiyun  *
315*4882a593Smuzhiyun  * The caller must ensure that no concurrent table mutations take place.
316*4882a593Smuzhiyun  * It is however valid to have concurrent lookups if they are RCU protected.
317*4882a593Smuzhiyun  *
318*4882a593Smuzhiyun  * It is valid to have concurrent insertions and deletions protected by per
319*4882a593Smuzhiyun  * bucket locks or concurrent RCU protected lookups and traversals.
320*4882a593Smuzhiyun  */
rhashtable_shrink(struct rhashtable * ht)321*4882a593Smuzhiyun static int rhashtable_shrink(struct rhashtable *ht)
322*4882a593Smuzhiyun {
323*4882a593Smuzhiyun 	struct bucket_table *new_tbl, *old_tbl = rht_dereference(ht->tbl, ht);
324*4882a593Smuzhiyun 	unsigned int size;
325*4882a593Smuzhiyun 	int err;
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun 	ASSERT_RHT_MUTEX(ht);
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun 	size = roundup_pow_of_two(atomic_read(&ht->nelems) * 3 / 2);
330*4882a593Smuzhiyun 	if (size < ht->p.min_size)
331*4882a593Smuzhiyun 		size = ht->p.min_size;
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun 	if (old_tbl->size <= size)
334*4882a593Smuzhiyun 		return 0;
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun 	if (rht_dereference(old_tbl->future_tbl, ht))
337*4882a593Smuzhiyun 		return -EEXIST;
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun 	new_tbl = bucket_table_alloc(ht, size, GFP_KERNEL);
340*4882a593Smuzhiyun 	if (new_tbl == NULL)
341*4882a593Smuzhiyun 		return -ENOMEM;
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun 	err = rhashtable_rehash_attach(ht, old_tbl, new_tbl);
344*4882a593Smuzhiyun 	if (err)
345*4882a593Smuzhiyun 		bucket_table_free(new_tbl);
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun 	return err;
348*4882a593Smuzhiyun }
349*4882a593Smuzhiyun 
rht_deferred_worker(struct work_struct * work)350*4882a593Smuzhiyun static void rht_deferred_worker(struct work_struct *work)
351*4882a593Smuzhiyun {
352*4882a593Smuzhiyun 	struct rhashtable *ht;
353*4882a593Smuzhiyun 	struct bucket_table *tbl;
354*4882a593Smuzhiyun 	int err = 0;
355*4882a593Smuzhiyun 
356*4882a593Smuzhiyun 	ht = container_of(work, struct rhashtable, run_work);
357*4882a593Smuzhiyun 	mutex_lock(&ht->mutex);
358*4882a593Smuzhiyun 
359*4882a593Smuzhiyun 	tbl = rht_dereference(ht->tbl, ht);
360*4882a593Smuzhiyun 	tbl = rhashtable_last_table(ht, tbl);
361*4882a593Smuzhiyun 
362*4882a593Smuzhiyun 	if (rht_grow_above_75(ht, tbl))
363*4882a593Smuzhiyun 		rhashtable_expand(ht);
364*4882a593Smuzhiyun 	else if (ht->p.automatic_shrinking && rht_shrink_below_30(ht, tbl))
365*4882a593Smuzhiyun 		rhashtable_shrink(ht);
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun 	err = rhashtable_rehash_table(ht);
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun 	mutex_unlock(&ht->mutex);
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun 	if (err)
372*4882a593Smuzhiyun 		schedule_work(&ht->run_work);
373*4882a593Smuzhiyun }
374*4882a593Smuzhiyun 
rhashtable_check_elasticity(struct rhashtable * ht,struct bucket_table * tbl,unsigned int hash)375*4882a593Smuzhiyun static bool rhashtable_check_elasticity(struct rhashtable *ht,
376*4882a593Smuzhiyun 					struct bucket_table *tbl,
377*4882a593Smuzhiyun 					unsigned int hash)
378*4882a593Smuzhiyun {
379*4882a593Smuzhiyun 	unsigned int elasticity = ht->elasticity;
380*4882a593Smuzhiyun 	struct rhash_head *head;
381*4882a593Smuzhiyun 
382*4882a593Smuzhiyun 	rht_for_each(head, tbl, hash)
383*4882a593Smuzhiyun 		if (!--elasticity)
384*4882a593Smuzhiyun 			return true;
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun 	return false;
387*4882a593Smuzhiyun }
388*4882a593Smuzhiyun 
rhashtable_insert_rehash(struct rhashtable * ht,struct bucket_table * tbl)389*4882a593Smuzhiyun int rhashtable_insert_rehash(struct rhashtable *ht,
390*4882a593Smuzhiyun 			     struct bucket_table *tbl)
391*4882a593Smuzhiyun {
392*4882a593Smuzhiyun 	struct bucket_table *old_tbl;
393*4882a593Smuzhiyun 	struct bucket_table *new_tbl;
394*4882a593Smuzhiyun 	unsigned int size;
395*4882a593Smuzhiyun 	int err;
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun 	old_tbl = rht_dereference_rcu(ht->tbl, ht);
398*4882a593Smuzhiyun 
399*4882a593Smuzhiyun 	size = tbl->size;
400*4882a593Smuzhiyun 
401*4882a593Smuzhiyun 	err = -EBUSY;
402*4882a593Smuzhiyun 
403*4882a593Smuzhiyun 	if (rht_grow_above_75(ht, tbl))
404*4882a593Smuzhiyun 		size *= 2;
405*4882a593Smuzhiyun 	/* Do not schedule more than one rehash */
406*4882a593Smuzhiyun 	else if (old_tbl != tbl)
407*4882a593Smuzhiyun 		goto fail;
408*4882a593Smuzhiyun 
409*4882a593Smuzhiyun 	err = -ENOMEM;
410*4882a593Smuzhiyun 
411*4882a593Smuzhiyun 	new_tbl = bucket_table_alloc(ht, size, GFP_ATOMIC);
412*4882a593Smuzhiyun 	if (new_tbl == NULL)
413*4882a593Smuzhiyun 		goto fail;
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun 	err = rhashtable_rehash_attach(ht, tbl, new_tbl);
416*4882a593Smuzhiyun 	if (err) {
417*4882a593Smuzhiyun 		bucket_table_free(new_tbl);
418*4882a593Smuzhiyun 		if (err == -EEXIST)
419*4882a593Smuzhiyun 			err = 0;
420*4882a593Smuzhiyun 	} else
421*4882a593Smuzhiyun 		schedule_work(&ht->run_work);
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun 	return err;
424*4882a593Smuzhiyun 
425*4882a593Smuzhiyun fail:
426*4882a593Smuzhiyun 	/* Do not fail the insert if someone else did a rehash. */
427*4882a593Smuzhiyun 	if (likely(rcu_dereference_raw(tbl->future_tbl)))
428*4882a593Smuzhiyun 		return 0;
429*4882a593Smuzhiyun 
430*4882a593Smuzhiyun 	/* Schedule async rehash to retry allocation in process context. */
431*4882a593Smuzhiyun 	if (err == -ENOMEM)
432*4882a593Smuzhiyun 		schedule_work(&ht->run_work);
433*4882a593Smuzhiyun 
434*4882a593Smuzhiyun 	return err;
435*4882a593Smuzhiyun }
436*4882a593Smuzhiyun 
rhashtable_insert_slow(struct rhashtable * ht,const void * key,struct rhash_head * obj,struct bucket_table * tbl)437*4882a593Smuzhiyun struct bucket_table *rhashtable_insert_slow(struct rhashtable *ht,
438*4882a593Smuzhiyun 					    const void *key,
439*4882a593Smuzhiyun 					    struct rhash_head *obj,
440*4882a593Smuzhiyun 					    struct bucket_table *tbl)
441*4882a593Smuzhiyun {
442*4882a593Smuzhiyun 	struct rhash_head *head;
443*4882a593Smuzhiyun 	unsigned int hash;
444*4882a593Smuzhiyun 	int err;
445*4882a593Smuzhiyun 
446*4882a593Smuzhiyun 	tbl = rhashtable_last_table(ht, tbl);
447*4882a593Smuzhiyun 	hash = head_hashfn(ht, tbl, obj);
448*4882a593Smuzhiyun 	spin_lock_nested(rht_bucket_lock(tbl, hash), SINGLE_DEPTH_NESTING);
449*4882a593Smuzhiyun 
450*4882a593Smuzhiyun 	err = -EEXIST;
451*4882a593Smuzhiyun 	if (key && rhashtable_lookup_fast(ht, key, ht->p))
452*4882a593Smuzhiyun 		goto exit;
453*4882a593Smuzhiyun 
454*4882a593Smuzhiyun 	err = -E2BIG;
455*4882a593Smuzhiyun 	if (unlikely(rht_grow_above_max(ht, tbl)))
456*4882a593Smuzhiyun 		goto exit;
457*4882a593Smuzhiyun 
458*4882a593Smuzhiyun 	err = -EAGAIN;
459*4882a593Smuzhiyun 	if (rhashtable_check_elasticity(ht, tbl, hash) ||
460*4882a593Smuzhiyun 	    rht_grow_above_100(ht, tbl))
461*4882a593Smuzhiyun 		goto exit;
462*4882a593Smuzhiyun 
463*4882a593Smuzhiyun 	err = 0;
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun 	head = rht_dereference_bucket(tbl->buckets[hash], tbl, hash);
466*4882a593Smuzhiyun 
467*4882a593Smuzhiyun 	RCU_INIT_POINTER(obj->next, head);
468*4882a593Smuzhiyun 
469*4882a593Smuzhiyun 	rcu_assign_pointer(tbl->buckets[hash], obj);
470*4882a593Smuzhiyun 
471*4882a593Smuzhiyun 	atomic_inc(&ht->nelems);
472*4882a593Smuzhiyun 
473*4882a593Smuzhiyun exit:
474*4882a593Smuzhiyun 	spin_unlock(rht_bucket_lock(tbl, hash));
475*4882a593Smuzhiyun 
476*4882a593Smuzhiyun 	if (err == 0)
477*4882a593Smuzhiyun 		return NULL;
478*4882a593Smuzhiyun 	else if (err == -EAGAIN)
479*4882a593Smuzhiyun 		return tbl;
480*4882a593Smuzhiyun 	else
481*4882a593Smuzhiyun 		return ERR_PTR(err);
482*4882a593Smuzhiyun }
483*4882a593Smuzhiyun 
484*4882a593Smuzhiyun /**
485*4882a593Smuzhiyun  * rhashtable_walk_init - Initialise an iterator
486*4882a593Smuzhiyun  * @ht:		Table to walk over
487*4882a593Smuzhiyun  * @iter:	Hash table Iterator
488*4882a593Smuzhiyun  *
489*4882a593Smuzhiyun  * This function prepares a hash table walk.
490*4882a593Smuzhiyun  *
491*4882a593Smuzhiyun  * Note that if you restart a walk after rhashtable_walk_stop you
492*4882a593Smuzhiyun  * may see the same object twice.  Also, you may miss objects if
493*4882a593Smuzhiyun  * there are removals in between rhashtable_walk_stop and the next
494*4882a593Smuzhiyun  * call to rhashtable_walk_start.
495*4882a593Smuzhiyun  *
496*4882a593Smuzhiyun  * For a completely stable walk you should construct your own data
497*4882a593Smuzhiyun  * structure outside the hash table.
498*4882a593Smuzhiyun  *
499*4882a593Smuzhiyun  * This function may sleep so you must not call it from interrupt
500*4882a593Smuzhiyun  * context or with spin locks held.
501*4882a593Smuzhiyun  *
502*4882a593Smuzhiyun  * You must call rhashtable_walk_exit if this function returns
503*4882a593Smuzhiyun  * successfully.
504*4882a593Smuzhiyun  */
rhashtable_walk_init(struct rhashtable * ht,struct rhashtable_iter * iter)505*4882a593Smuzhiyun int rhashtable_walk_init(struct rhashtable *ht, struct rhashtable_iter *iter)
506*4882a593Smuzhiyun {
507*4882a593Smuzhiyun 	iter->ht = ht;
508*4882a593Smuzhiyun 	iter->p = NULL;
509*4882a593Smuzhiyun 	iter->slot = 0;
510*4882a593Smuzhiyun 	iter->skip = 0;
511*4882a593Smuzhiyun 
512*4882a593Smuzhiyun 	iter->walker = kmalloc(sizeof(*iter->walker), GFP_KERNEL);
513*4882a593Smuzhiyun 	if (!iter->walker)
514*4882a593Smuzhiyun 		return -ENOMEM;
515*4882a593Smuzhiyun 
516*4882a593Smuzhiyun 	spin_lock(&ht->lock);
517*4882a593Smuzhiyun 	iter->walker->tbl =
518*4882a593Smuzhiyun 		rcu_dereference_protected(ht->tbl, lockdep_is_held(&ht->lock));
519*4882a593Smuzhiyun 	list_add(&iter->walker->list, &iter->walker->tbl->walkers);
520*4882a593Smuzhiyun 	spin_unlock(&ht->lock);
521*4882a593Smuzhiyun 
522*4882a593Smuzhiyun 	return 0;
523*4882a593Smuzhiyun }
524*4882a593Smuzhiyun 
525*4882a593Smuzhiyun /**
526*4882a593Smuzhiyun  * rhashtable_walk_exit - Free an iterator
527*4882a593Smuzhiyun  * @iter:	Hash table Iterator
528*4882a593Smuzhiyun  *
529*4882a593Smuzhiyun  * This function frees resources allocated by rhashtable_walk_init.
530*4882a593Smuzhiyun  */
rhashtable_walk_exit(struct rhashtable_iter * iter)531*4882a593Smuzhiyun void rhashtable_walk_exit(struct rhashtable_iter *iter)
532*4882a593Smuzhiyun {
533*4882a593Smuzhiyun 	spin_lock(&iter->ht->lock);
534*4882a593Smuzhiyun 	if (iter->walker->tbl)
535*4882a593Smuzhiyun 		list_del(&iter->walker->list);
536*4882a593Smuzhiyun 	spin_unlock(&iter->ht->lock);
537*4882a593Smuzhiyun 	kfree(iter->walker);
538*4882a593Smuzhiyun }
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun /**
541*4882a593Smuzhiyun  * rhashtable_walk_start - Start a hash table walk
542*4882a593Smuzhiyun  * @iter:	Hash table iterator
543*4882a593Smuzhiyun  *
544*4882a593Smuzhiyun  * Start a hash table walk.  Note that we take the RCU lock in all
545*4882a593Smuzhiyun  * cases including when we return an error.  So you must always call
546*4882a593Smuzhiyun  * rhashtable_walk_stop to clean up.
547*4882a593Smuzhiyun  *
548*4882a593Smuzhiyun  * Returns zero if successful.
549*4882a593Smuzhiyun  *
550*4882a593Smuzhiyun  * Returns -EAGAIN if resize event occured.  Note that the iterator
551*4882a593Smuzhiyun  * will rewind back to the beginning and you may use it immediately
552*4882a593Smuzhiyun  * by calling rhashtable_walk_next.
553*4882a593Smuzhiyun  */
rhashtable_walk_start(struct rhashtable_iter * iter)554*4882a593Smuzhiyun int rhashtable_walk_start(struct rhashtable_iter *iter)
555*4882a593Smuzhiyun 	__acquires(RCU)
556*4882a593Smuzhiyun {
557*4882a593Smuzhiyun 	struct rhashtable *ht = iter->ht;
558*4882a593Smuzhiyun 
559*4882a593Smuzhiyun 	rcu_read_lock();
560*4882a593Smuzhiyun 
561*4882a593Smuzhiyun 	spin_lock(&ht->lock);
562*4882a593Smuzhiyun 	if (iter->walker->tbl)
563*4882a593Smuzhiyun 		list_del(&iter->walker->list);
564*4882a593Smuzhiyun 	spin_unlock(&ht->lock);
565*4882a593Smuzhiyun 
566*4882a593Smuzhiyun 	if (!iter->walker->tbl) {
567*4882a593Smuzhiyun 		iter->walker->tbl = rht_dereference_rcu(ht->tbl, ht);
568*4882a593Smuzhiyun 		return -EAGAIN;
569*4882a593Smuzhiyun 	}
570*4882a593Smuzhiyun 
571*4882a593Smuzhiyun 	return 0;
572*4882a593Smuzhiyun }
573*4882a593Smuzhiyun 
574*4882a593Smuzhiyun /**
575*4882a593Smuzhiyun  * rhashtable_walk_next - Return the next object and advance the iterator
576*4882a593Smuzhiyun  * @iter:	Hash table iterator
577*4882a593Smuzhiyun  *
578*4882a593Smuzhiyun  * Note that you must call rhashtable_walk_stop when you are finished
579*4882a593Smuzhiyun  * with the walk.
580*4882a593Smuzhiyun  *
581*4882a593Smuzhiyun  * Returns the next object or NULL when the end of the table is reached.
582*4882a593Smuzhiyun  *
583*4882a593Smuzhiyun  * Returns -EAGAIN if resize event occured.  Note that the iterator
584*4882a593Smuzhiyun  * will rewind back to the beginning and you may continue to use it.
585*4882a593Smuzhiyun  */
rhashtable_walk_next(struct rhashtable_iter * iter)586*4882a593Smuzhiyun void *rhashtable_walk_next(struct rhashtable_iter *iter)
587*4882a593Smuzhiyun {
588*4882a593Smuzhiyun 	struct bucket_table *tbl = iter->walker->tbl;
589*4882a593Smuzhiyun 	struct rhashtable *ht = iter->ht;
590*4882a593Smuzhiyun 	struct rhash_head *p = iter->p;
591*4882a593Smuzhiyun 
592*4882a593Smuzhiyun 	if (p) {
593*4882a593Smuzhiyun 		p = rht_dereference_bucket_rcu(p->next, tbl, iter->slot);
594*4882a593Smuzhiyun 		goto next;
595*4882a593Smuzhiyun 	}
596*4882a593Smuzhiyun 
597*4882a593Smuzhiyun 	for (; iter->slot < tbl->size; iter->slot++) {
598*4882a593Smuzhiyun 		int skip = iter->skip;
599*4882a593Smuzhiyun 
600*4882a593Smuzhiyun 		rht_for_each_rcu(p, tbl, iter->slot) {
601*4882a593Smuzhiyun 			if (!skip)
602*4882a593Smuzhiyun 				break;
603*4882a593Smuzhiyun 			skip--;
604*4882a593Smuzhiyun 		}
605*4882a593Smuzhiyun 
606*4882a593Smuzhiyun next:
607*4882a593Smuzhiyun 		if (!rht_is_a_nulls(p)) {
608*4882a593Smuzhiyun 			iter->skip++;
609*4882a593Smuzhiyun 			iter->p = p;
610*4882a593Smuzhiyun 			return rht_obj(ht, p);
611*4882a593Smuzhiyun 		}
612*4882a593Smuzhiyun 
613*4882a593Smuzhiyun 		iter->skip = 0;
614*4882a593Smuzhiyun 	}
615*4882a593Smuzhiyun 
616*4882a593Smuzhiyun 	iter->p = NULL;
617*4882a593Smuzhiyun 
618*4882a593Smuzhiyun 	/* Ensure we see any new tables. */
619*4882a593Smuzhiyun 	smp_rmb();
620*4882a593Smuzhiyun 
621*4882a593Smuzhiyun 	iter->walker->tbl = rht_dereference_rcu(tbl->future_tbl, ht);
622*4882a593Smuzhiyun 	if (iter->walker->tbl) {
623*4882a593Smuzhiyun 		iter->slot = 0;
624*4882a593Smuzhiyun 		iter->skip = 0;
625*4882a593Smuzhiyun 		return ERR_PTR(-EAGAIN);
626*4882a593Smuzhiyun 	}
627*4882a593Smuzhiyun 
628*4882a593Smuzhiyun 	return NULL;
629*4882a593Smuzhiyun }
630*4882a593Smuzhiyun 
631*4882a593Smuzhiyun /**
632*4882a593Smuzhiyun  * rhashtable_walk_stop - Finish a hash table walk
633*4882a593Smuzhiyun  * @iter:	Hash table iterator
634*4882a593Smuzhiyun  *
635*4882a593Smuzhiyun  * Finish a hash table walk.
636*4882a593Smuzhiyun  */
rhashtable_walk_stop(struct rhashtable_iter * iter)637*4882a593Smuzhiyun void rhashtable_walk_stop(struct rhashtable_iter *iter)
638*4882a593Smuzhiyun 	__releases(RCU)
639*4882a593Smuzhiyun {
640*4882a593Smuzhiyun 	struct rhashtable *ht;
641*4882a593Smuzhiyun 	struct bucket_table *tbl = iter->walker->tbl;
642*4882a593Smuzhiyun 
643*4882a593Smuzhiyun 	if (!tbl)
644*4882a593Smuzhiyun 		goto out;
645*4882a593Smuzhiyun 
646*4882a593Smuzhiyun 	ht = iter->ht;
647*4882a593Smuzhiyun 
648*4882a593Smuzhiyun 	spin_lock(&ht->lock);
649*4882a593Smuzhiyun 	if (tbl->rehash < tbl->size)
650*4882a593Smuzhiyun 		list_add(&iter->walker->list, &tbl->walkers);
651*4882a593Smuzhiyun 	else
652*4882a593Smuzhiyun 		iter->walker->tbl = NULL;
653*4882a593Smuzhiyun 	spin_unlock(&ht->lock);
654*4882a593Smuzhiyun 
655*4882a593Smuzhiyun 	iter->p = NULL;
656*4882a593Smuzhiyun 
657*4882a593Smuzhiyun out:
658*4882a593Smuzhiyun 	rcu_read_unlock();
659*4882a593Smuzhiyun }
660*4882a593Smuzhiyun 
rounded_hashtable_size(const struct rhashtable_params * params)661*4882a593Smuzhiyun static size_t rounded_hashtable_size(const struct rhashtable_params *params)
662*4882a593Smuzhiyun {
663*4882a593Smuzhiyun 	return max(roundup_pow_of_two(params->nelem_hint * 4 / 3),
664*4882a593Smuzhiyun 		   (unsigned long)params->min_size);
665*4882a593Smuzhiyun }
666*4882a593Smuzhiyun 
rhashtable_jhash2(const void * key,u32 length,u32 seed)667*4882a593Smuzhiyun static u32 rhashtable_jhash2(const void *key, u32 length, u32 seed)
668*4882a593Smuzhiyun {
669*4882a593Smuzhiyun 	return jhash2(key, length, seed);
670*4882a593Smuzhiyun }
671*4882a593Smuzhiyun 
672*4882a593Smuzhiyun /**
673*4882a593Smuzhiyun  * rhashtable_init - initialize a new hash table
674*4882a593Smuzhiyun  * @ht:		hash table to be initialized
675*4882a593Smuzhiyun  * @params:	configuration parameters
676*4882a593Smuzhiyun  *
677*4882a593Smuzhiyun  * Initializes a new hash table based on the provided configuration
678*4882a593Smuzhiyun  * parameters. A table can be configured either with a variable or
679*4882a593Smuzhiyun  * fixed length key:
680*4882a593Smuzhiyun  *
681*4882a593Smuzhiyun  * Configuration Example 1: Fixed length keys
682*4882a593Smuzhiyun  * struct test_obj {
683*4882a593Smuzhiyun  *	int			key;
684*4882a593Smuzhiyun  *	void *			my_member;
685*4882a593Smuzhiyun  *	struct rhash_head	node;
686*4882a593Smuzhiyun  * };
687*4882a593Smuzhiyun  *
688*4882a593Smuzhiyun  * struct rhashtable_params params = {
689*4882a593Smuzhiyun  *	.head_offset = offsetof(struct test_obj, node),
690*4882a593Smuzhiyun  *	.key_offset = offsetof(struct test_obj, key),
691*4882a593Smuzhiyun  *	.key_len = sizeof(int),
692*4882a593Smuzhiyun  *	.hashfn = jhash,
693*4882a593Smuzhiyun  *	.nulls_base = (1U << RHT_BASE_SHIFT),
694*4882a593Smuzhiyun  * };
695*4882a593Smuzhiyun  *
696*4882a593Smuzhiyun  * Configuration Example 2: Variable length keys
697*4882a593Smuzhiyun  * struct test_obj {
698*4882a593Smuzhiyun  *	[...]
699*4882a593Smuzhiyun  *	struct rhash_head	node;
700*4882a593Smuzhiyun  * };
701*4882a593Smuzhiyun  *
702*4882a593Smuzhiyun  * u32 my_hash_fn(const void *data, u32 len, u32 seed)
703*4882a593Smuzhiyun  * {
704*4882a593Smuzhiyun  *	struct test_obj *obj = data;
705*4882a593Smuzhiyun  *
706*4882a593Smuzhiyun  *	return [... hash ...];
707*4882a593Smuzhiyun  * }
708*4882a593Smuzhiyun  *
709*4882a593Smuzhiyun  * struct rhashtable_params params = {
710*4882a593Smuzhiyun  *	.head_offset = offsetof(struct test_obj, node),
711*4882a593Smuzhiyun  *	.hashfn = jhash,
712*4882a593Smuzhiyun  *	.obj_hashfn = my_hash_fn,
713*4882a593Smuzhiyun  * };
714*4882a593Smuzhiyun  */
rhashtable_init(struct rhashtable * ht,const struct rhashtable_params * params)715*4882a593Smuzhiyun int rhashtable_init(struct rhashtable *ht,
716*4882a593Smuzhiyun 		    const struct rhashtable_params *params)
717*4882a593Smuzhiyun {
718*4882a593Smuzhiyun 	struct bucket_table *tbl;
719*4882a593Smuzhiyun 	size_t size;
720*4882a593Smuzhiyun 
721*4882a593Smuzhiyun 	size = HASH_DEFAULT_SIZE;
722*4882a593Smuzhiyun 
723*4882a593Smuzhiyun 	if ((!params->key_len && !params->obj_hashfn) ||
724*4882a593Smuzhiyun 	    (params->obj_hashfn && !params->obj_cmpfn))
725*4882a593Smuzhiyun 		return -EINVAL;
726*4882a593Smuzhiyun 
727*4882a593Smuzhiyun 	if (params->nulls_base && params->nulls_base < (1U << RHT_BASE_SHIFT))
728*4882a593Smuzhiyun 		return -EINVAL;
729*4882a593Smuzhiyun 
730*4882a593Smuzhiyun 	memset(ht, 0, sizeof(*ht));
731*4882a593Smuzhiyun 	mutex_init(&ht->mutex);
732*4882a593Smuzhiyun 	spin_lock_init(&ht->lock);
733*4882a593Smuzhiyun 	memcpy(&ht->p, params, sizeof(*params));
734*4882a593Smuzhiyun 
735*4882a593Smuzhiyun 	if (params->min_size)
736*4882a593Smuzhiyun 		ht->p.min_size = roundup_pow_of_two(params->min_size);
737*4882a593Smuzhiyun 
738*4882a593Smuzhiyun 	if (params->max_size)
739*4882a593Smuzhiyun 		ht->p.max_size = rounddown_pow_of_two(params->max_size);
740*4882a593Smuzhiyun 
741*4882a593Smuzhiyun 	if (params->insecure_max_entries)
742*4882a593Smuzhiyun 		ht->p.insecure_max_entries =
743*4882a593Smuzhiyun 			rounddown_pow_of_two(params->insecure_max_entries);
744*4882a593Smuzhiyun 	else
745*4882a593Smuzhiyun 		ht->p.insecure_max_entries = ht->p.max_size * 2;
746*4882a593Smuzhiyun 
747*4882a593Smuzhiyun 	ht->p.min_size = max(ht->p.min_size, HASH_MIN_SIZE);
748*4882a593Smuzhiyun 
749*4882a593Smuzhiyun 	if (params->nelem_hint)
750*4882a593Smuzhiyun 		size = rounded_hashtable_size(&ht->p);
751*4882a593Smuzhiyun 
752*4882a593Smuzhiyun 	/* The maximum (not average) chain length grows with the
753*4882a593Smuzhiyun 	 * size of the hash table, at a rate of (log N)/(log log N).
754*4882a593Smuzhiyun 	 * The value of 16 is selected so that even if the hash
755*4882a593Smuzhiyun 	 * table grew to 2^32 you would not expect the maximum
756*4882a593Smuzhiyun 	 * chain length to exceed it unless we are under attack
757*4882a593Smuzhiyun 	 * (or extremely unlucky).
758*4882a593Smuzhiyun 	 *
759*4882a593Smuzhiyun 	 * As this limit is only to detect attacks, we don't need
760*4882a593Smuzhiyun 	 * to set it to a lower value as you'd need the chain
761*4882a593Smuzhiyun 	 * length to vastly exceed 16 to have any real effect
762*4882a593Smuzhiyun 	 * on the system.
763*4882a593Smuzhiyun 	 */
764*4882a593Smuzhiyun 	if (!params->insecure_elasticity)
765*4882a593Smuzhiyun 		ht->elasticity = 16;
766*4882a593Smuzhiyun 
767*4882a593Smuzhiyun 	if (params->locks_mul)
768*4882a593Smuzhiyun 		ht->p.locks_mul = roundup_pow_of_two(params->locks_mul);
769*4882a593Smuzhiyun 	else
770*4882a593Smuzhiyun 		ht->p.locks_mul = BUCKET_LOCKS_PER_CPU;
771*4882a593Smuzhiyun 
772*4882a593Smuzhiyun 	ht->key_len = ht->p.key_len;
773*4882a593Smuzhiyun 	if (!params->hashfn) {
774*4882a593Smuzhiyun 		ht->p.hashfn = jhash;
775*4882a593Smuzhiyun 
776*4882a593Smuzhiyun 		if (!(ht->key_len & (sizeof(u32) - 1))) {
777*4882a593Smuzhiyun 			ht->key_len /= sizeof(u32);
778*4882a593Smuzhiyun 			ht->p.hashfn = rhashtable_jhash2;
779*4882a593Smuzhiyun 		}
780*4882a593Smuzhiyun 	}
781*4882a593Smuzhiyun 
782*4882a593Smuzhiyun 	tbl = bucket_table_alloc(ht, size, GFP_KERNEL);
783*4882a593Smuzhiyun 	if (tbl == NULL)
784*4882a593Smuzhiyun 		return -ENOMEM;
785*4882a593Smuzhiyun 
786*4882a593Smuzhiyun 	atomic_set(&ht->nelems, 0);
787*4882a593Smuzhiyun 
788*4882a593Smuzhiyun 	RCU_INIT_POINTER(ht->tbl, tbl);
789*4882a593Smuzhiyun 
790*4882a593Smuzhiyun 	INIT_WORK(&ht->run_work, rht_deferred_worker);
791*4882a593Smuzhiyun 
792*4882a593Smuzhiyun 	return 0;
793*4882a593Smuzhiyun }
794*4882a593Smuzhiyun 
795*4882a593Smuzhiyun /**
796*4882a593Smuzhiyun  * rhashtable_free_and_destroy - free elements and destroy hash table
797*4882a593Smuzhiyun  * @ht:		the hash table to destroy
798*4882a593Smuzhiyun  * @free_fn:	callback to release resources of element
799*4882a593Smuzhiyun  * @arg:	pointer passed to free_fn
800*4882a593Smuzhiyun  *
801*4882a593Smuzhiyun  * Stops an eventual async resize. If defined, invokes free_fn for each
802*4882a593Smuzhiyun  * element to releasal resources. Please note that RCU protected
803*4882a593Smuzhiyun  * readers may still be accessing the elements. Releasing of resources
804*4882a593Smuzhiyun  * must occur in a compatible manner. Then frees the bucket array.
805*4882a593Smuzhiyun  *
806*4882a593Smuzhiyun  * This function will eventually sleep to wait for an async resize
807*4882a593Smuzhiyun  * to complete. The caller is responsible that no further write operations
808*4882a593Smuzhiyun  * occurs in parallel.
809*4882a593Smuzhiyun  */
rhashtable_free_and_destroy(struct rhashtable * ht,void (* free_fn)(void * ptr,void * arg),void * arg)810*4882a593Smuzhiyun void rhashtable_free_and_destroy(struct rhashtable *ht,
811*4882a593Smuzhiyun 				 void (*free_fn)(void *ptr, void *arg),
812*4882a593Smuzhiyun 				 void *arg)
813*4882a593Smuzhiyun {
814*4882a593Smuzhiyun 	const struct bucket_table *tbl;
815*4882a593Smuzhiyun 	unsigned int i;
816*4882a593Smuzhiyun 
817*4882a593Smuzhiyun 	cancel_work_sync(&ht->run_work);
818*4882a593Smuzhiyun 
819*4882a593Smuzhiyun 	mutex_lock(&ht->mutex);
820*4882a593Smuzhiyun 	tbl = rht_dereference(ht->tbl, ht);
821*4882a593Smuzhiyun 	if (free_fn) {
822*4882a593Smuzhiyun 		for (i = 0; i < tbl->size; i++) {
823*4882a593Smuzhiyun 			struct rhash_head *pos, *next;
824*4882a593Smuzhiyun 
825*4882a593Smuzhiyun 			for (pos = rht_dereference(tbl->buckets[i], ht),
826*4882a593Smuzhiyun 			     next = !rht_is_a_nulls(pos) ?
827*4882a593Smuzhiyun 					rht_dereference(pos->next, ht) : NULL;
828*4882a593Smuzhiyun 			     !rht_is_a_nulls(pos);
829*4882a593Smuzhiyun 			     pos = next,
830*4882a593Smuzhiyun 			     next = !rht_is_a_nulls(pos) ?
831*4882a593Smuzhiyun 					rht_dereference(pos->next, ht) : NULL)
832*4882a593Smuzhiyun 				free_fn(rht_obj(ht, pos), arg);
833*4882a593Smuzhiyun 		}
834*4882a593Smuzhiyun 	}
835*4882a593Smuzhiyun 
836*4882a593Smuzhiyun 	bucket_table_free(tbl);
837*4882a593Smuzhiyun 	mutex_unlock(&ht->mutex);
838*4882a593Smuzhiyun }
839*4882a593Smuzhiyun 
rhashtable_destroy(struct rhashtable * ht)840*4882a593Smuzhiyun void rhashtable_destroy(struct rhashtable *ht)
841*4882a593Smuzhiyun {
842*4882a593Smuzhiyun 	return rhashtable_free_and_destroy(ht, NULL, NULL);
843*4882a593Smuzhiyun }
844*4882a593Smuzhiyun 
845