1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#include <linux/atomic.h>
18#include <linux/kernel.h>
19#include <linux/init.h>
20#include <linux/log2.h>
21#include <linux/sched.h>
22#include <linux/rculist.h>
23#include <linux/slab.h>
24#include <linux/vmalloc.h>
25#include <linux/mm.h>
26#include <linux/jhash.h>
27#include <linux/random.h>
28#include <linux/rhashtable.h>
29#include <linux/err.h>
30#include <linux/export.h>
31
32#define HASH_DEFAULT_SIZE 64UL
33#define HASH_MIN_SIZE 4U
34#define BUCKET_LOCKS_PER_CPU 32UL
35
36union nested_table {
37 union nested_table __rcu *table;
38 struct rhash_head __rcu *bucket;
39};
40
41static u32 head_hashfn(struct rhashtable *ht,
42 const struct bucket_table *tbl,
43 const struct rhash_head *he)
44{
45 return rht_head_hashfn(ht, tbl, he, ht->p);
46}
47
48#ifdef CONFIG_PROVE_LOCKING
49#define ASSERT_RHT_MUTEX(HT) BUG_ON(!lockdep_rht_mutex_is_held(HT))
50
51int lockdep_rht_mutex_is_held(struct rhashtable *ht)
52{
53 return (debug_locks) ? lockdep_is_held(&ht->mutex) : 1;
54}
55EXPORT_SYMBOL_GPL(lockdep_rht_mutex_is_held);
56
57int lockdep_rht_bucket_is_held(const struct bucket_table *tbl, u32 hash)
58{
59 spinlock_t *lock = rht_bucket_lock(tbl, hash);
60
61 return (debug_locks) ? lockdep_is_held(lock) : 1;
62}
63EXPORT_SYMBOL_GPL(lockdep_rht_bucket_is_held);
64#else
65#define ASSERT_RHT_MUTEX(HT)
66#endif
67
68static void nested_table_free(union nested_table *ntbl, unsigned int size)
69{
70 const unsigned int shift = PAGE_SHIFT - ilog2(sizeof(void *));
71 const unsigned int len = 1 << shift;
72 unsigned int i;
73
74 ntbl = rcu_dereference_raw(ntbl->table);
75 if (!ntbl)
76 return;
77
78 if (size > len) {
79 size >>= shift;
80 for (i = 0; i < len; i++)
81 nested_table_free(ntbl + i, size);
82 }
83
84 kfree(ntbl);
85}
86
87static void nested_bucket_table_free(const struct bucket_table *tbl)
88{
89 unsigned int size = tbl->size >> tbl->nest;
90 unsigned int len = 1 << tbl->nest;
91 union nested_table *ntbl;
92 unsigned int i;
93
94 ntbl = (union nested_table *)rcu_dereference_raw(tbl->buckets[0]);
95
96 for (i = 0; i < len; i++)
97 nested_table_free(ntbl + i, size);
98
99 kfree(ntbl);
100}
101
102static void bucket_table_free(const struct bucket_table *tbl)
103{
104 if (tbl->nest)
105 nested_bucket_table_free(tbl);
106
107 free_bucket_spinlocks(tbl->locks);
108 kvfree(tbl);
109}
110
111static void bucket_table_free_rcu(struct rcu_head *head)
112{
113 bucket_table_free(container_of(head, struct bucket_table, rcu));
114}
115
116static union nested_table *nested_table_alloc(struct rhashtable *ht,
117 union nested_table __rcu **prev,
118 unsigned int shifted,
119 unsigned int nhash)
120{
121 union nested_table *ntbl;
122 int i;
123
124 ntbl = rcu_dereference(*prev);
125 if (ntbl)
126 return ntbl;
127
128 ntbl = kzalloc(PAGE_SIZE, GFP_ATOMIC);
129
130 if (ntbl && shifted) {
131 for (i = 0; i < PAGE_SIZE / sizeof(ntbl[0].bucket); i++)
132 INIT_RHT_NULLS_HEAD(ntbl[i].bucket, ht,
133 (i << shifted) | nhash);
134 }
135
136 rcu_assign_pointer(*prev, ntbl);
137
138 return ntbl;
139}
140
141static struct bucket_table *nested_bucket_table_alloc(struct rhashtable *ht,
142 size_t nbuckets,
143 gfp_t gfp)
144{
145 const unsigned int shift = PAGE_SHIFT - ilog2(sizeof(void *));
146 struct bucket_table *tbl;
147 size_t size;
148
149 if (nbuckets < (1 << (shift + 1)))
150 return NULL;
151
152 size = sizeof(*tbl) + sizeof(tbl->buckets[0]);
153
154 tbl = kzalloc(size, gfp);
155 if (!tbl)
156 return NULL;
157
158 if (!nested_table_alloc(ht, (union nested_table __rcu **)tbl->buckets,
159 0, 0)) {
160 kfree(tbl);
161 return NULL;
162 }
163
164 tbl->nest = (ilog2(nbuckets) - 1) % shift + 1;
165
166 return tbl;
167}
168
169static struct bucket_table *bucket_table_alloc(struct rhashtable *ht,
170 size_t nbuckets,
171 gfp_t gfp)
172{
173 struct bucket_table *tbl = NULL;
174 size_t size, max_locks;
175 int i;
176
177 size = sizeof(*tbl) + nbuckets * sizeof(tbl->buckets[0]);
178 if (gfp != GFP_KERNEL)
179 tbl = kzalloc(size, gfp | __GFP_NOWARN | __GFP_NORETRY);
180 else
181 tbl = kvzalloc(size, gfp);
182
183 size = nbuckets;
184
185 if (tbl == NULL && gfp != GFP_KERNEL) {
186 tbl = nested_bucket_table_alloc(ht, nbuckets, gfp);
187 nbuckets = 0;
188 }
189 if (tbl == NULL)
190 return NULL;
191
192 tbl->size = size;
193
194 max_locks = size >> 1;
195 if (tbl->nest)
196 max_locks = min_t(size_t, max_locks, 1U << tbl->nest);
197
198 if (alloc_bucket_spinlocks(&tbl->locks, &tbl->locks_mask, max_locks,
199 ht->p.locks_mul, gfp) < 0) {
200 bucket_table_free(tbl);
201 return NULL;
202 }
203
204 INIT_LIST_HEAD(&tbl->walkers);
205
206 tbl->hash_rnd = get_random_u32();
207
208 for (i = 0; i < nbuckets; i++)
209 INIT_RHT_NULLS_HEAD(tbl->buckets[i], ht, i);
210
211 return tbl;
212}
213
214static struct bucket_table *rhashtable_last_table(struct rhashtable *ht,
215 struct bucket_table *tbl)
216{
217 struct bucket_table *new_tbl;
218
219 do {
220 new_tbl = tbl;
221 tbl = rht_dereference_rcu(tbl->future_tbl, ht);
222 } while (tbl);
223
224 return new_tbl;
225}
226
227static int rhashtable_rehash_one(struct rhashtable *ht, unsigned int old_hash)
228{
229 struct bucket_table *old_tbl = rht_dereference(ht->tbl, ht);
230 struct bucket_table *new_tbl = rhashtable_last_table(ht,
231 rht_dereference_rcu(old_tbl->future_tbl, ht));
232 struct rhash_head __rcu **pprev = rht_bucket_var(old_tbl, old_hash);
233 int err = -EAGAIN;
234 struct rhash_head *head, *next, *entry;
235 spinlock_t *new_bucket_lock;
236 unsigned int new_hash;
237
238 if (new_tbl->nest)
239 goto out;
240
241 err = -ENOENT;
242
243 rht_for_each(entry, old_tbl, old_hash) {
244 err = 0;
245 next = rht_dereference_bucket(entry->next, old_tbl, old_hash);
246
247 if (rht_is_a_nulls(next))
248 break;
249
250 pprev = &entry->next;
251 }
252
253 if (err)
254 goto out;
255
256 new_hash = head_hashfn(ht, new_tbl, entry);
257
258 new_bucket_lock = rht_bucket_lock(new_tbl, new_hash);
259
260 spin_lock_nested(new_bucket_lock, SINGLE_DEPTH_NESTING);
261 head = rht_dereference_bucket(new_tbl->buckets[new_hash],
262 new_tbl, new_hash);
263
264 RCU_INIT_POINTER(entry->next, head);
265
266 rcu_assign_pointer(new_tbl->buckets[new_hash], entry);
267 spin_unlock(new_bucket_lock);
268
269 rcu_assign_pointer(*pprev, next);
270
271out:
272 return err;
273}
274
275static int rhashtable_rehash_chain(struct rhashtable *ht,
276 unsigned int old_hash)
277{
278 struct bucket_table *old_tbl = rht_dereference(ht->tbl, ht);
279 spinlock_t *old_bucket_lock;
280 int err;
281
282 old_bucket_lock = rht_bucket_lock(old_tbl, old_hash);
283
284 spin_lock_bh(old_bucket_lock);
285 while (!(err = rhashtable_rehash_one(ht, old_hash)))
286 ;
287
288 if (err == -ENOENT) {
289 old_tbl->rehash++;
290 err = 0;
291 }
292 spin_unlock_bh(old_bucket_lock);
293
294 return err;
295}
296
297static int rhashtable_rehash_attach(struct rhashtable *ht,
298 struct bucket_table *old_tbl,
299 struct bucket_table *new_tbl)
300{
301
302 spin_lock_bh(old_tbl->locks);
303
304
305 if (rcu_access_pointer(old_tbl->future_tbl)) {
306 spin_unlock_bh(old_tbl->locks);
307 return -EEXIST;
308 }
309
310
311
312
313 rcu_assign_pointer(old_tbl->future_tbl, new_tbl);
314
315 spin_unlock_bh(old_tbl->locks);
316
317 return 0;
318}
319
320static int rhashtable_rehash_table(struct rhashtable *ht)
321{
322 struct bucket_table *old_tbl = rht_dereference(ht->tbl, ht);
323 struct bucket_table *new_tbl;
324 struct rhashtable_walker *walker;
325 unsigned int old_hash;
326 int err;
327
328 new_tbl = rht_dereference(old_tbl->future_tbl, ht);
329 if (!new_tbl)
330 return 0;
331
332 for (old_hash = 0; old_hash < old_tbl->size; old_hash++) {
333 err = rhashtable_rehash_chain(ht, old_hash);
334 if (err)
335 return err;
336 cond_resched();
337 }
338
339
340 rcu_assign_pointer(ht->tbl, new_tbl);
341
342 spin_lock(&ht->lock);
343 list_for_each_entry(walker, &old_tbl->walkers, list)
344 walker->tbl = NULL;
345 spin_unlock(&ht->lock);
346
347
348
349
350
351 call_rcu(&old_tbl->rcu, bucket_table_free_rcu);
352
353 return rht_dereference(new_tbl->future_tbl, ht) ? -EAGAIN : 0;
354}
355
356static int rhashtable_rehash_alloc(struct rhashtable *ht,
357 struct bucket_table *old_tbl,
358 unsigned int size)
359{
360 struct bucket_table *new_tbl;
361 int err;
362
363 ASSERT_RHT_MUTEX(ht);
364
365 new_tbl = bucket_table_alloc(ht, size, GFP_KERNEL);
366 if (new_tbl == NULL)
367 return -ENOMEM;
368
369 err = rhashtable_rehash_attach(ht, old_tbl, new_tbl);
370 if (err)
371 bucket_table_free(new_tbl);
372
373 return err;
374}
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392static int rhashtable_shrink(struct rhashtable *ht)
393{
394 struct bucket_table *old_tbl = rht_dereference(ht->tbl, ht);
395 unsigned int nelems = atomic_read(&ht->nelems);
396 unsigned int size = 0;
397
398 if (nelems)
399 size = roundup_pow_of_two(nelems * 3 / 2);
400 if (size < ht->p.min_size)
401 size = ht->p.min_size;
402
403 if (old_tbl->size <= size)
404 return 0;
405
406 if (rht_dereference(old_tbl->future_tbl, ht))
407 return -EEXIST;
408
409 return rhashtable_rehash_alloc(ht, old_tbl, size);
410}
411
412static void rht_deferred_worker(struct work_struct *work)
413{
414 struct rhashtable *ht;
415 struct bucket_table *tbl;
416 int err = 0;
417
418 ht = container_of(work, struct rhashtable, run_work);
419 mutex_lock(&ht->mutex);
420
421 tbl = rht_dereference(ht->tbl, ht);
422 tbl = rhashtable_last_table(ht, tbl);
423
424 if (rht_grow_above_75(ht, tbl))
425 err = rhashtable_rehash_alloc(ht, tbl, tbl->size * 2);
426 else if (ht->p.automatic_shrinking && rht_shrink_below_30(ht, tbl))
427 err = rhashtable_shrink(ht);
428 else if (tbl->nest)
429 err = rhashtable_rehash_alloc(ht, tbl, tbl->size);
430
431 if (!err)
432 err = rhashtable_rehash_table(ht);
433
434 mutex_unlock(&ht->mutex);
435
436 if (err)
437 schedule_work(&ht->run_work);
438}
439
440static int rhashtable_insert_rehash(struct rhashtable *ht,
441 struct bucket_table *tbl)
442{
443 struct bucket_table *old_tbl;
444 struct bucket_table *new_tbl;
445 unsigned int size;
446 int err;
447
448 old_tbl = rht_dereference_rcu(ht->tbl, ht);
449
450 size = tbl->size;
451
452 err = -EBUSY;
453
454 if (rht_grow_above_75(ht, tbl))
455 size *= 2;
456
457 else if (old_tbl != tbl)
458 goto fail;
459
460 err = -ENOMEM;
461
462 new_tbl = bucket_table_alloc(ht, size, GFP_ATOMIC);
463 if (new_tbl == NULL)
464 goto fail;
465
466 err = rhashtable_rehash_attach(ht, tbl, new_tbl);
467 if (err) {
468 bucket_table_free(new_tbl);
469 if (err == -EEXIST)
470 err = 0;
471 } else
472 schedule_work(&ht->run_work);
473
474 return err;
475
476fail:
477
478 if (likely(rcu_dereference_raw(tbl->future_tbl)))
479 return 0;
480
481
482 if (err == -ENOMEM)
483 schedule_work(&ht->run_work);
484
485 return err;
486}
487
488static void *rhashtable_lookup_one(struct rhashtable *ht,
489 struct bucket_table *tbl, unsigned int hash,
490 const void *key, struct rhash_head *obj)
491{
492 struct rhashtable_compare_arg arg = {
493 .ht = ht,
494 .key = key,
495 };
496 struct rhash_head __rcu **pprev;
497 struct rhash_head *head;
498 int elasticity;
499
500 elasticity = RHT_ELASTICITY;
501 pprev = rht_bucket_var(tbl, hash);
502 rht_for_each_continue(head, *pprev, tbl, hash) {
503 struct rhlist_head *list;
504 struct rhlist_head *plist;
505
506 elasticity--;
507 if (!key ||
508 (ht->p.obj_cmpfn ?
509 ht->p.obj_cmpfn(&arg, rht_obj(ht, head)) :
510 rhashtable_compare(&arg, rht_obj(ht, head)))) {
511 pprev = &head->next;
512 continue;
513 }
514
515 if (!ht->rhlist)
516 return rht_obj(ht, head);
517
518 list = container_of(obj, struct rhlist_head, rhead);
519 plist = container_of(head, struct rhlist_head, rhead);
520
521 RCU_INIT_POINTER(list->next, plist);
522 head = rht_dereference_bucket(head->next, tbl, hash);
523 RCU_INIT_POINTER(list->rhead.next, head);
524 rcu_assign_pointer(*pprev, obj);
525
526 return NULL;
527 }
528
529 if (elasticity <= 0)
530 return ERR_PTR(-EAGAIN);
531
532 return ERR_PTR(-ENOENT);
533}
534
535static struct bucket_table *rhashtable_insert_one(struct rhashtable *ht,
536 struct bucket_table *tbl,
537 unsigned int hash,
538 struct rhash_head *obj,
539 void *data)
540{
541 struct rhash_head __rcu **pprev;
542 struct bucket_table *new_tbl;
543 struct rhash_head *head;
544
545 if (!IS_ERR_OR_NULL(data))
546 return ERR_PTR(-EEXIST);
547
548 if (PTR_ERR(data) != -EAGAIN && PTR_ERR(data) != -ENOENT)
549 return ERR_CAST(data);
550
551 new_tbl = rcu_dereference(tbl->future_tbl);
552 if (new_tbl)
553 return new_tbl;
554
555 if (PTR_ERR(data) != -ENOENT)
556 return ERR_CAST(data);
557
558 if (unlikely(rht_grow_above_max(ht, tbl)))
559 return ERR_PTR(-E2BIG);
560
561 if (unlikely(rht_grow_above_100(ht, tbl)))
562 return ERR_PTR(-EAGAIN);
563
564 pprev = rht_bucket_insert(ht, tbl, hash);
565 if (!pprev)
566 return ERR_PTR(-ENOMEM);
567
568 head = rht_dereference_bucket(*pprev, tbl, hash);
569
570 RCU_INIT_POINTER(obj->next, head);
571 if (ht->rhlist) {
572 struct rhlist_head *list;
573
574 list = container_of(obj, struct rhlist_head, rhead);
575 RCU_INIT_POINTER(list->next, NULL);
576 }
577
578 rcu_assign_pointer(*pprev, obj);
579
580 atomic_inc(&ht->nelems);
581 if (rht_grow_above_75(ht, tbl))
582 schedule_work(&ht->run_work);
583
584 return NULL;
585}
586
587static void *rhashtable_try_insert(struct rhashtable *ht, const void *key,
588 struct rhash_head *obj)
589{
590 struct bucket_table *new_tbl;
591 struct bucket_table *tbl;
592 unsigned int hash;
593 spinlock_t *lock;
594 void *data;
595
596 tbl = rcu_dereference(ht->tbl);
597
598
599
600
601 for (;;) {
602 hash = rht_head_hashfn(ht, tbl, obj, ht->p);
603 lock = rht_bucket_lock(tbl, hash);
604 spin_lock_bh(lock);
605
606 if (tbl->rehash <= hash)
607 break;
608
609 spin_unlock_bh(lock);
610 tbl = rcu_dereference(tbl->future_tbl);
611 }
612
613 data = rhashtable_lookup_one(ht, tbl, hash, key, obj);
614 new_tbl = rhashtable_insert_one(ht, tbl, hash, obj, data);
615 if (PTR_ERR(new_tbl) != -EEXIST)
616 data = ERR_CAST(new_tbl);
617
618 while (!IS_ERR_OR_NULL(new_tbl)) {
619 tbl = new_tbl;
620 hash = rht_head_hashfn(ht, tbl, obj, ht->p);
621 spin_lock_nested(rht_bucket_lock(tbl, hash),
622 SINGLE_DEPTH_NESTING);
623
624 data = rhashtable_lookup_one(ht, tbl, hash, key, obj);
625 new_tbl = rhashtable_insert_one(ht, tbl, hash, obj, data);
626 if (PTR_ERR(new_tbl) != -EEXIST)
627 data = ERR_CAST(new_tbl);
628
629 spin_unlock(rht_bucket_lock(tbl, hash));
630 }
631
632 spin_unlock_bh(lock);
633
634 if (PTR_ERR(data) == -EAGAIN)
635 data = ERR_PTR(rhashtable_insert_rehash(ht, tbl) ?:
636 -EAGAIN);
637
638 return data;
639}
640
641void *rhashtable_insert_slow(struct rhashtable *ht, const void *key,
642 struct rhash_head *obj)
643{
644 void *data;
645
646 do {
647 rcu_read_lock();
648 data = rhashtable_try_insert(ht, key, obj);
649 rcu_read_unlock();
650 } while (PTR_ERR(data) == -EAGAIN);
651
652 return data;
653}
654EXPORT_SYMBOL_GPL(rhashtable_insert_slow);
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676void rhashtable_walk_enter(struct rhashtable *ht, struct rhashtable_iter *iter)
677{
678 iter->ht = ht;
679 iter->p = NULL;
680 iter->slot = 0;
681 iter->skip = 0;
682 iter->end_of_table = 0;
683
684 spin_lock(&ht->lock);
685 iter->walker.tbl =
686 rcu_dereference_protected(ht->tbl, lockdep_is_held(&ht->lock));
687 list_add(&iter->walker.list, &iter->walker.tbl->walkers);
688 spin_unlock(&ht->lock);
689}
690EXPORT_SYMBOL_GPL(rhashtable_walk_enter);
691
692
693
694
695
696
697
698void rhashtable_walk_exit(struct rhashtable_iter *iter)
699{
700 spin_lock(&iter->ht->lock);
701 if (iter->walker.tbl)
702 list_del(&iter->walker.list);
703 spin_unlock(&iter->ht->lock);
704}
705EXPORT_SYMBOL_GPL(rhashtable_walk_exit);
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725int rhashtable_walk_start_check(struct rhashtable_iter *iter)
726 __acquires(RCU)
727{
728 struct rhashtable *ht = iter->ht;
729
730 rcu_read_lock();
731
732 spin_lock(&ht->lock);
733 if (iter->walker.tbl)
734 list_del(&iter->walker.list);
735 spin_unlock(&ht->lock);
736
737 if (!iter->walker.tbl && !iter->end_of_table) {
738 iter->walker.tbl = rht_dereference_rcu(ht->tbl, ht);
739 return -EAGAIN;
740 }
741
742 return 0;
743}
744EXPORT_SYMBOL_GPL(rhashtable_walk_start_check);
745
746
747
748
749
750
751
752
753
754
755
756static void *__rhashtable_walk_find_next(struct rhashtable_iter *iter)
757{
758 struct bucket_table *tbl = iter->walker.tbl;
759 struct rhlist_head *list = iter->list;
760 struct rhashtable *ht = iter->ht;
761 struct rhash_head *p = iter->p;
762 bool rhlist = ht->rhlist;
763
764 if (!tbl)
765 return NULL;
766
767 for (; iter->slot < tbl->size; iter->slot++) {
768 int skip = iter->skip;
769
770 rht_for_each_rcu(p, tbl, iter->slot) {
771 if (rhlist) {
772 list = container_of(p, struct rhlist_head,
773 rhead);
774 do {
775 if (!skip)
776 goto next;
777 skip--;
778 list = rcu_dereference(list->next);
779 } while (list);
780
781 continue;
782 }
783 if (!skip)
784 break;
785 skip--;
786 }
787
788next:
789 if (!rht_is_a_nulls(p)) {
790 iter->skip++;
791 iter->p = p;
792 iter->list = list;
793 return rht_obj(ht, rhlist ? &list->rhead : p);
794 }
795
796 iter->skip = 0;
797 }
798
799 iter->p = NULL;
800
801
802 smp_rmb();
803
804 iter->walker.tbl = rht_dereference_rcu(tbl->future_tbl, ht);
805 if (iter->walker.tbl) {
806 iter->slot = 0;
807 iter->skip = 0;
808 return ERR_PTR(-EAGAIN);
809 } else {
810 iter->end_of_table = true;
811 }
812
813 return NULL;
814}
815
816
817
818
819
820
821
822
823
824
825
826
827
828void *rhashtable_walk_next(struct rhashtable_iter *iter)
829{
830 struct rhlist_head *list = iter->list;
831 struct rhashtable *ht = iter->ht;
832 struct rhash_head *p = iter->p;
833 bool rhlist = ht->rhlist;
834
835 if (p) {
836 if (!rhlist || !(list = rcu_dereference(list->next))) {
837 p = rcu_dereference(p->next);
838 list = container_of(p, struct rhlist_head, rhead);
839 }
840 if (!rht_is_a_nulls(p)) {
841 iter->skip++;
842 iter->p = p;
843 iter->list = list;
844 return rht_obj(ht, rhlist ? &list->rhead : p);
845 }
846
847
848
849
850 iter->skip = 0;
851 iter->slot++;
852 }
853
854 return __rhashtable_walk_find_next(iter);
855}
856EXPORT_SYMBOL_GPL(rhashtable_walk_next);
857
858
859
860
861
862
863
864
865
866
867void *rhashtable_walk_peek(struct rhashtable_iter *iter)
868{
869 struct rhlist_head *list = iter->list;
870 struct rhashtable *ht = iter->ht;
871 struct rhash_head *p = iter->p;
872
873 if (p)
874 return rht_obj(ht, ht->rhlist ? &list->rhead : p);
875
876
877
878 if (iter->skip) {
879
880
881
882
883
884
885 iter->skip--;
886 }
887
888 return __rhashtable_walk_find_next(iter);
889}
890EXPORT_SYMBOL_GPL(rhashtable_walk_peek);
891
892
893
894
895
896
897
898
899void rhashtable_walk_stop(struct rhashtable_iter *iter)
900 __releases(RCU)
901{
902 struct rhashtable *ht;
903 struct bucket_table *tbl = iter->walker.tbl;
904
905 if (!tbl)
906 goto out;
907
908 ht = iter->ht;
909
910 spin_lock(&ht->lock);
911 if (tbl->rehash < tbl->size)
912 list_add(&iter->walker.list, &tbl->walkers);
913 else
914 iter->walker.tbl = NULL;
915 spin_unlock(&ht->lock);
916
917 iter->p = NULL;
918
919out:
920 rcu_read_unlock();
921}
922EXPORT_SYMBOL_GPL(rhashtable_walk_stop);
923
924static size_t rounded_hashtable_size(const struct rhashtable_params *params)
925{
926 return max(roundup_pow_of_two(params->nelem_hint * 4 / 3),
927 (unsigned long)params->min_size);
928}
929
930static u32 rhashtable_jhash2(const void *key, u32 length, u32 seed)
931{
932 return jhash2(key, length, seed);
933}
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978int rhashtable_init(struct rhashtable *ht,
979 const struct rhashtable_params *params)
980{
981 struct bucket_table *tbl;
982 size_t size;
983
984 size = HASH_DEFAULT_SIZE;
985
986 if ((!params->key_len && !params->obj_hashfn) ||
987 (params->obj_hashfn && !params->obj_cmpfn))
988 return -EINVAL;
989
990 if (params->nulls_base && params->nulls_base < (1U << RHT_BASE_SHIFT))
991 return -EINVAL;
992
993 memset(ht, 0, sizeof(*ht));
994 mutex_init(&ht->mutex);
995 spin_lock_init(&ht->lock);
996 memcpy(&ht->p, params, sizeof(*params));
997
998 if (params->min_size)
999 ht->p.min_size = roundup_pow_of_two(params->min_size);
1000
1001
1002 ht->max_elems = 1u << 31;
1003
1004 if (params->max_size) {
1005 ht->p.max_size = rounddown_pow_of_two(params->max_size);
1006 if (ht->p.max_size < ht->max_elems / 2)
1007 ht->max_elems = ht->p.max_size * 2;
1008 }
1009
1010 ht->p.min_size = max_t(u16, ht->p.min_size, HASH_MIN_SIZE);
1011
1012 if (params->nelem_hint)
1013 size = rounded_hashtable_size(&ht->p);
1014
1015 if (params->locks_mul)
1016 ht->p.locks_mul = roundup_pow_of_two(params->locks_mul);
1017 else
1018 ht->p.locks_mul = BUCKET_LOCKS_PER_CPU;
1019
1020 ht->key_len = ht->p.key_len;
1021 if (!params->hashfn) {
1022 ht->p.hashfn = jhash;
1023
1024 if (!(ht->key_len & (sizeof(u32) - 1))) {
1025 ht->key_len /= sizeof(u32);
1026 ht->p.hashfn = rhashtable_jhash2;
1027 }
1028 }
1029
1030 tbl = bucket_table_alloc(ht, size, GFP_KERNEL);
1031 if (tbl == NULL)
1032 return -ENOMEM;
1033
1034 atomic_set(&ht->nelems, 0);
1035
1036 RCU_INIT_POINTER(ht->tbl, tbl);
1037
1038 INIT_WORK(&ht->run_work, rht_deferred_worker);
1039
1040 return 0;
1041}
1042EXPORT_SYMBOL_GPL(rhashtable_init);
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053int rhltable_init(struct rhltable *hlt, const struct rhashtable_params *params)
1054{
1055 int err;
1056
1057
1058 if (params->nulls_base)
1059 return -EINVAL;
1060
1061 err = rhashtable_init(&hlt->ht, params);
1062 hlt->ht.rhlist = true;
1063 return err;
1064}
1065EXPORT_SYMBOL_GPL(rhltable_init);
1066
1067static void rhashtable_free_one(struct rhashtable *ht, struct rhash_head *obj,
1068 void (*free_fn)(void *ptr, void *arg),
1069 void *arg)
1070{
1071 struct rhlist_head *list;
1072
1073 if (!ht->rhlist) {
1074 free_fn(rht_obj(ht, obj), arg);
1075 return;
1076 }
1077
1078 list = container_of(obj, struct rhlist_head, rhead);
1079 do {
1080 obj = &list->rhead;
1081 list = rht_dereference(list->next, ht);
1082 free_fn(rht_obj(ht, obj), arg);
1083 } while (list);
1084}
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101void rhashtable_free_and_destroy(struct rhashtable *ht,
1102 void (*free_fn)(void *ptr, void *arg),
1103 void *arg)
1104{
1105 struct bucket_table *tbl;
1106 unsigned int i;
1107
1108 cancel_work_sync(&ht->run_work);
1109
1110 mutex_lock(&ht->mutex);
1111 tbl = rht_dereference(ht->tbl, ht);
1112 if (free_fn) {
1113 for (i = 0; i < tbl->size; i++) {
1114 struct rhash_head *pos, *next;
1115
1116 cond_resched();
1117 for (pos = rht_dereference(*rht_bucket(tbl, i), ht),
1118 next = !rht_is_a_nulls(pos) ?
1119 rht_dereference(pos->next, ht) : NULL;
1120 !rht_is_a_nulls(pos);
1121 pos = next,
1122 next = !rht_is_a_nulls(pos) ?
1123 rht_dereference(pos->next, ht) : NULL)
1124 rhashtable_free_one(ht, pos, free_fn, arg);
1125 }
1126 }
1127
1128 bucket_table_free(tbl);
1129 mutex_unlock(&ht->mutex);
1130}
1131EXPORT_SYMBOL_GPL(rhashtable_free_and_destroy);
1132
1133void rhashtable_destroy(struct rhashtable *ht)
1134{
1135 return rhashtable_free_and_destroy(ht, NULL, NULL);
1136}
1137EXPORT_SYMBOL_GPL(rhashtable_destroy);
1138
1139struct rhash_head __rcu **rht_bucket_nested(const struct bucket_table *tbl,
1140 unsigned int hash)
1141{
1142 const unsigned int shift = PAGE_SHIFT - ilog2(sizeof(void *));
1143 static struct rhash_head __rcu *rhnull =
1144 (struct rhash_head __rcu *)NULLS_MARKER(0);
1145 unsigned int index = hash & ((1 << tbl->nest) - 1);
1146 unsigned int size = tbl->size >> tbl->nest;
1147 unsigned int subhash = hash;
1148 union nested_table *ntbl;
1149
1150 ntbl = (union nested_table *)rcu_dereference_raw(tbl->buckets[0]);
1151 ntbl = rht_dereference_bucket_rcu(ntbl[index].table, tbl, hash);
1152 subhash >>= tbl->nest;
1153
1154 while (ntbl && size > (1 << shift)) {
1155 index = subhash & ((1 << shift) - 1);
1156 ntbl = rht_dereference_bucket_rcu(ntbl[index].table,
1157 tbl, hash);
1158 size >>= shift;
1159 subhash >>= shift;
1160 }
1161
1162 if (!ntbl)
1163 return &rhnull;
1164
1165 return &ntbl[subhash].bucket;
1166
1167}
1168EXPORT_SYMBOL_GPL(rht_bucket_nested);
1169
1170struct rhash_head __rcu **rht_bucket_nested_insert(struct rhashtable *ht,
1171 struct bucket_table *tbl,
1172 unsigned int hash)
1173{
1174 const unsigned int shift = PAGE_SHIFT - ilog2(sizeof(void *));
1175 unsigned int index = hash & ((1 << tbl->nest) - 1);
1176 unsigned int size = tbl->size >> tbl->nest;
1177 union nested_table *ntbl;
1178 unsigned int shifted;
1179 unsigned int nhash;
1180
1181 ntbl = (union nested_table *)rcu_dereference_raw(tbl->buckets[0]);
1182 hash >>= tbl->nest;
1183 nhash = index;
1184 shifted = tbl->nest;
1185 ntbl = nested_table_alloc(ht, &ntbl[index].table,
1186 size <= (1 << shift) ? shifted : 0, nhash);
1187
1188 while (ntbl && size > (1 << shift)) {
1189 index = hash & ((1 << shift) - 1);
1190 size >>= shift;
1191 hash >>= shift;
1192 nhash |= index << shifted;
1193 shifted += shift;
1194 ntbl = nested_table_alloc(ht, &ntbl[index].table,
1195 size <= (1 << shift) ? shifted : 0,
1196 nhash);
1197 }
1198
1199 if (!ntbl)
1200 return NULL;
1201
1202 return &ntbl[hash].bucket;
1203
1204}
1205EXPORT_SYMBOL_GPL(rht_bucket_nested_insert);
1206