1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22#include <linux/errno.h>
23#include <linux/init.h>
24#include <linux/kernel.h>
25#include <linux/module.h>
26#include <linux/radix-tree.h>
27#include <linux/percpu.h>
28#include <linux/slab.h>
29#include <linux/notifier.h>
30#include <linux/cpu.h>
31#include <linux/string.h>
32#include <linux/bitops.h>
33#include <linux/rcupdate.h>
34
35
36#ifdef __KERNEL__
37#define RADIX_TREE_MAP_SHIFT (CONFIG_BASE_SMALL ? 4 : 6)
38#else
39#define RADIX_TREE_MAP_SHIFT 3
40#endif
41
42#define RADIX_TREE_MAP_SIZE (1UL << RADIX_TREE_MAP_SHIFT)
43#define RADIX_TREE_MAP_MASK (RADIX_TREE_MAP_SIZE-1)
44
45#define RADIX_TREE_TAG_LONGS \
46 ((RADIX_TREE_MAP_SIZE + BITS_PER_LONG - 1) / BITS_PER_LONG)
47
48struct radix_tree_node {
49 unsigned int height;
50 unsigned int count;
51 struct rcu_head rcu_head;
52 void __rcu *slots[RADIX_TREE_MAP_SIZE];
53 unsigned long tags[RADIX_TREE_MAX_TAGS][RADIX_TREE_TAG_LONGS];
54};
55
56struct radix_tree_path {
57 struct radix_tree_node *node;
58 int offset;
59};
60
61#define RADIX_TREE_INDEX_BITS (8 * sizeof(unsigned long))
62#define RADIX_TREE_MAX_PATH (DIV_ROUND_UP(RADIX_TREE_INDEX_BITS, \
63 RADIX_TREE_MAP_SHIFT))
64
65
66
67
68
69static unsigned long height_to_maxindex[RADIX_TREE_MAX_PATH + 1] __read_mostly;
70
71
72
73
74static struct kmem_cache *radix_tree_node_cachep;
75
76
77
78
79struct radix_tree_preload {
80 int nr;
81 struct radix_tree_node *nodes[RADIX_TREE_MAX_PATH];
82};
83static DEFINE_PER_CPU(struct radix_tree_preload, radix_tree_preloads) = { 0, };
84
85static inline void *ptr_to_indirect(void *ptr)
86{
87 return (void *)((unsigned long)ptr | RADIX_TREE_INDIRECT_PTR);
88}
89
90static inline void *indirect_to_ptr(void *ptr)
91{
92 return (void *)((unsigned long)ptr & ~RADIX_TREE_INDIRECT_PTR);
93}
94
95static inline gfp_t root_gfp_mask(struct radix_tree_root *root)
96{
97 return root->gfp_mask & __GFP_BITS_MASK;
98}
99
100static inline void tag_set(struct radix_tree_node *node, unsigned int tag,
101 int offset)
102{
103 __set_bit(offset, node->tags[tag]);
104}
105
106static inline void tag_clear(struct radix_tree_node *node, unsigned int tag,
107 int offset)
108{
109 __clear_bit(offset, node->tags[tag]);
110}
111
112static inline int tag_get(struct radix_tree_node *node, unsigned int tag,
113 int offset)
114{
115 return test_bit(offset, node->tags[tag]);
116}
117
118static inline void root_tag_set(struct radix_tree_root *root, unsigned int tag)
119{
120 root->gfp_mask |= (__force gfp_t)(1 << (tag + __GFP_BITS_SHIFT));
121}
122
123static inline void root_tag_clear(struct radix_tree_root *root, unsigned int tag)
124{
125 root->gfp_mask &= (__force gfp_t)~(1 << (tag + __GFP_BITS_SHIFT));
126}
127
128static inline void root_tag_clear_all(struct radix_tree_root *root)
129{
130 root->gfp_mask &= __GFP_BITS_MASK;
131}
132
133static inline int root_tag_get(struct radix_tree_root *root, unsigned int tag)
134{
135 return (__force unsigned)root->gfp_mask & (1 << (tag + __GFP_BITS_SHIFT));
136}
137
138
139
140
141
142static inline int any_tag_set(struct radix_tree_node *node, unsigned int tag)
143{
144 int idx;
145 for (idx = 0; idx < RADIX_TREE_TAG_LONGS; idx++) {
146 if (node->tags[tag][idx])
147 return 1;
148 }
149 return 0;
150}
151
152
153
154
155static struct radix_tree_node *
156radix_tree_node_alloc(struct radix_tree_root *root)
157{
158 struct radix_tree_node *ret = NULL;
159 gfp_t gfp_mask = root_gfp_mask(root);
160
161 if (!(gfp_mask & __GFP_WAIT)) {
162 struct radix_tree_preload *rtp;
163
164
165
166
167
168
169 rtp = &__get_cpu_var(radix_tree_preloads);
170 if (rtp->nr) {
171 ret = rtp->nodes[rtp->nr - 1];
172 rtp->nodes[rtp->nr - 1] = NULL;
173 rtp->nr--;
174 }
175 }
176 if (ret == NULL)
177 ret = kmem_cache_alloc(radix_tree_node_cachep, gfp_mask);
178
179 BUG_ON(radix_tree_is_indirect_ptr(ret));
180 return ret;
181}
182
183static void radix_tree_node_rcu_free(struct rcu_head *head)
184{
185 struct radix_tree_node *node =
186 container_of(head, struct radix_tree_node, rcu_head);
187 int i;
188
189
190
191
192
193
194 for (i = 0; i < RADIX_TREE_MAX_TAGS; i++)
195 tag_clear(node, i, 0);
196
197 node->slots[0] = NULL;
198 node->count = 0;
199
200 kmem_cache_free(radix_tree_node_cachep, node);
201}
202
203static inline void
204radix_tree_node_free(struct radix_tree_node *node)
205{
206 call_rcu(&node->rcu_head, radix_tree_node_rcu_free);
207}
208
209
210
211
212
213
214
215
216
217
218int radix_tree_preload(gfp_t gfp_mask)
219{
220 struct radix_tree_preload *rtp;
221 struct radix_tree_node *node;
222 int ret = -ENOMEM;
223
224 preempt_disable();
225 rtp = &__get_cpu_var(radix_tree_preloads);
226 while (rtp->nr < ARRAY_SIZE(rtp->nodes)) {
227 preempt_enable();
228 node = kmem_cache_alloc(radix_tree_node_cachep, gfp_mask);
229 if (node == NULL)
230 goto out;
231 preempt_disable();
232 rtp = &__get_cpu_var(radix_tree_preloads);
233 if (rtp->nr < ARRAY_SIZE(rtp->nodes))
234 rtp->nodes[rtp->nr++] = node;
235 else
236 kmem_cache_free(radix_tree_node_cachep, node);
237 }
238 ret = 0;
239out:
240 return ret;
241}
242EXPORT_SYMBOL(radix_tree_preload);
243
244
245
246
247
248static inline unsigned long radix_tree_maxindex(unsigned int height)
249{
250 return height_to_maxindex[height];
251}
252
253
254
255
256static int radix_tree_extend(struct radix_tree_root *root, unsigned long index)
257{
258 struct radix_tree_node *node;
259 unsigned int height;
260 int tag;
261
262
263 height = root->height + 1;
264 while (index > radix_tree_maxindex(height))
265 height++;
266
267 if (root->rnode == NULL) {
268 root->height = height;
269 goto out;
270 }
271
272 do {
273 unsigned int newheight;
274 if (!(node = radix_tree_node_alloc(root)))
275 return -ENOMEM;
276
277
278 node->slots[0] = indirect_to_ptr(root->rnode);
279
280
281 for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) {
282 if (root_tag_get(root, tag))
283 tag_set(node, tag, 0);
284 }
285
286 newheight = root->height+1;
287 node->height = newheight;
288 node->count = 1;
289 node = ptr_to_indirect(node);
290 rcu_assign_pointer(root->rnode, node);
291 root->height = newheight;
292 } while (height > root->height);
293out:
294 return 0;
295}
296
297
298
299
300
301
302
303
304
305int radix_tree_insert(struct radix_tree_root *root,
306 unsigned long index, void *item)
307{
308 struct radix_tree_node *node = NULL, *slot;
309 unsigned int height, shift;
310 int offset;
311 int error;
312
313 BUG_ON(radix_tree_is_indirect_ptr(item));
314
315
316 if (index > radix_tree_maxindex(root->height)) {
317 error = radix_tree_extend(root, index);
318 if (error)
319 return error;
320 }
321
322 slot = indirect_to_ptr(root->rnode);
323
324 height = root->height;
325 shift = (height-1) * RADIX_TREE_MAP_SHIFT;
326
327 offset = 0;
328 while (height > 0) {
329 if (slot == NULL) {
330
331 if (!(slot = radix_tree_node_alloc(root)))
332 return -ENOMEM;
333 slot->height = height;
334 if (node) {
335 rcu_assign_pointer(node->slots[offset], slot);
336 node->count++;
337 } else
338 rcu_assign_pointer(root->rnode, ptr_to_indirect(slot));
339 }
340
341
342 offset = (index >> shift) & RADIX_TREE_MAP_MASK;
343 node = slot;
344 slot = node->slots[offset];
345 shift -= RADIX_TREE_MAP_SHIFT;
346 height--;
347 }
348
349 if (slot != NULL)
350 return -EEXIST;
351
352 if (node) {
353 node->count++;
354 rcu_assign_pointer(node->slots[offset], item);
355 BUG_ON(tag_get(node, 0, offset));
356 BUG_ON(tag_get(node, 1, offset));
357 } else {
358 rcu_assign_pointer(root->rnode, item);
359 BUG_ON(root_tag_get(root, 0));
360 BUG_ON(root_tag_get(root, 1));
361 }
362
363 return 0;
364}
365EXPORT_SYMBOL(radix_tree_insert);
366
367
368
369
370
371static void *radix_tree_lookup_element(struct radix_tree_root *root,
372 unsigned long index, int is_slot)
373{
374 unsigned int height, shift;
375 struct radix_tree_node *node, **slot;
376
377 node = rcu_dereference_raw(root->rnode);
378 if (node == NULL)
379 return NULL;
380
381 if (!radix_tree_is_indirect_ptr(node)) {
382 if (index > 0)
383 return NULL;
384 return is_slot ? (void *)&root->rnode : node;
385 }
386 node = indirect_to_ptr(node);
387
388 height = node->height;
389 if (index > radix_tree_maxindex(height))
390 return NULL;
391
392 shift = (height-1) * RADIX_TREE_MAP_SHIFT;
393
394 do {
395 slot = (struct radix_tree_node **)
396 (node->slots + ((index>>shift) & RADIX_TREE_MAP_MASK));
397 node = rcu_dereference_raw(*slot);
398 if (node == NULL)
399 return NULL;
400
401 shift -= RADIX_TREE_MAP_SHIFT;
402 height--;
403 } while (height > 0);
404
405 return is_slot ? (void *)slot : indirect_to_ptr(node);
406}
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421void **radix_tree_lookup_slot(struct radix_tree_root *root, unsigned long index)
422{
423 return (void **)radix_tree_lookup_element(root, index, 1);
424}
425EXPORT_SYMBOL(radix_tree_lookup_slot);
426
427
428
429
430
431
432
433
434
435
436
437
438
439void *radix_tree_lookup(struct radix_tree_root *root, unsigned long index)
440{
441 return radix_tree_lookup_element(root, index, 0);
442}
443EXPORT_SYMBOL(radix_tree_lookup);
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458void *radix_tree_tag_set(struct radix_tree_root *root,
459 unsigned long index, unsigned int tag)
460{
461 unsigned int height, shift;
462 struct radix_tree_node *slot;
463
464 height = root->height;
465 BUG_ON(index > radix_tree_maxindex(height));
466
467 slot = indirect_to_ptr(root->rnode);
468 shift = (height - 1) * RADIX_TREE_MAP_SHIFT;
469
470 while (height > 0) {
471 int offset;
472
473 offset = (index >> shift) & RADIX_TREE_MAP_MASK;
474 if (!tag_get(slot, tag, offset))
475 tag_set(slot, tag, offset);
476 slot = slot->slots[offset];
477 BUG_ON(slot == NULL);
478 shift -= RADIX_TREE_MAP_SHIFT;
479 height--;
480 }
481
482
483 if (slot && !root_tag_get(root, tag))
484 root_tag_set(root, tag);
485
486 return slot;
487}
488EXPORT_SYMBOL(radix_tree_tag_set);
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504void *radix_tree_tag_clear(struct radix_tree_root *root,
505 unsigned long index, unsigned int tag)
506{
507
508
509
510
511 struct radix_tree_path path[RADIX_TREE_MAX_PATH + 1], *pathp = path;
512 struct radix_tree_node *slot = NULL;
513 unsigned int height, shift;
514
515 height = root->height;
516 if (index > radix_tree_maxindex(height))
517 goto out;
518
519 shift = (height - 1) * RADIX_TREE_MAP_SHIFT;
520 pathp->node = NULL;
521 slot = indirect_to_ptr(root->rnode);
522
523 while (height > 0) {
524 int offset;
525
526 if (slot == NULL)
527 goto out;
528
529 offset = (index >> shift) & RADIX_TREE_MAP_MASK;
530 pathp[1].offset = offset;
531 pathp[1].node = slot;
532 slot = slot->slots[offset];
533 pathp++;
534 shift -= RADIX_TREE_MAP_SHIFT;
535 height--;
536 }
537
538 if (slot == NULL)
539 goto out;
540
541 while (pathp->node) {
542 if (!tag_get(pathp->node, tag, pathp->offset))
543 goto out;
544 tag_clear(pathp->node, tag, pathp->offset);
545 if (any_tag_set(pathp->node, tag))
546 goto out;
547 pathp--;
548 }
549
550
551 if (root_tag_get(root, tag))
552 root_tag_clear(root, tag);
553
554out:
555 return slot;
556}
557EXPORT_SYMBOL(radix_tree_tag_clear);
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574int radix_tree_tag_get(struct radix_tree_root *root,
575 unsigned long index, unsigned int tag)
576{
577 unsigned int height, shift;
578 struct radix_tree_node *node;
579
580
581 if (!root_tag_get(root, tag))
582 return 0;
583
584 node = rcu_dereference_raw(root->rnode);
585 if (node == NULL)
586 return 0;
587
588 if (!radix_tree_is_indirect_ptr(node))
589 return (index == 0);
590 node = indirect_to_ptr(node);
591
592 height = node->height;
593 if (index > radix_tree_maxindex(height))
594 return 0;
595
596 shift = (height - 1) * RADIX_TREE_MAP_SHIFT;
597
598 for ( ; ; ) {
599 int offset;
600
601 if (node == NULL)
602 return 0;
603
604 offset = (index >> shift) & RADIX_TREE_MAP_MASK;
605 if (!tag_get(node, tag, offset))
606 return 0;
607 if (height == 1)
608 return 1;
609 node = rcu_dereference_raw(node->slots[offset]);
610 shift -= RADIX_TREE_MAP_SHIFT;
611 height--;
612 }
613}
614EXPORT_SYMBOL(radix_tree_tag_get);
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643unsigned long radix_tree_range_tag_if_tagged(struct radix_tree_root *root,
644 unsigned long *first_indexp, unsigned long last_index,
645 unsigned long nr_to_tag,
646 unsigned int iftag, unsigned int settag)
647{
648 unsigned int height = root->height;
649 struct radix_tree_path path[height];
650 struct radix_tree_path *pathp = path;
651 struct radix_tree_node *slot;
652 unsigned int shift;
653 unsigned long tagged = 0;
654 unsigned long index = *first_indexp;
655
656 last_index = min(last_index, radix_tree_maxindex(height));
657 if (index > last_index)
658 return 0;
659 if (!nr_to_tag)
660 return 0;
661 if (!root_tag_get(root, iftag)) {
662 *first_indexp = last_index + 1;
663 return 0;
664 }
665 if (height == 0) {
666 *first_indexp = last_index + 1;
667 root_tag_set(root, settag);
668 return 1;
669 }
670
671 shift = (height - 1) * RADIX_TREE_MAP_SHIFT;
672 slot = indirect_to_ptr(root->rnode);
673
674
675
676
677
678
679 path[height - 1].node = NULL;
680
681 for (;;) {
682 int offset;
683
684 offset = (index >> shift) & RADIX_TREE_MAP_MASK;
685 if (!slot->slots[offset])
686 goto next;
687 if (!tag_get(slot, iftag, offset))
688 goto next;
689 if (height > 1) {
690
691 height--;
692 shift -= RADIX_TREE_MAP_SHIFT;
693 path[height - 1].node = slot;
694 path[height - 1].offset = offset;
695 slot = slot->slots[offset];
696 continue;
697 }
698
699
700 tagged++;
701 tag_set(slot, settag, offset);
702
703
704 pathp = &path[0];
705 while (pathp->node) {
706
707 if (tag_get(pathp->node, settag, pathp->offset))
708 break;
709 tag_set(pathp->node, settag, pathp->offset);
710 pathp++;
711 }
712
713next:
714
715 index = ((index >> shift) + 1) << shift;
716
717 if (index > last_index || !index)
718 break;
719 if (tagged >= nr_to_tag)
720 break;
721 while (((index >> shift) & RADIX_TREE_MAP_MASK) == 0) {
722
723
724
725
726
727 slot = path[height - 1].node;
728 height++;
729 shift += RADIX_TREE_MAP_SHIFT;
730 }
731 }
732
733
734
735
736 if (tagged > 0)
737 root_tag_set(root, settag);
738 *first_indexp = index;
739
740 return tagged;
741}
742EXPORT_SYMBOL(radix_tree_range_tag_if_tagged);
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765unsigned long radix_tree_next_hole(struct radix_tree_root *root,
766 unsigned long index, unsigned long max_scan)
767{
768 unsigned long i;
769
770 for (i = 0; i < max_scan; i++) {
771 if (!radix_tree_lookup(root, index))
772 break;
773 index++;
774 if (index == 0)
775 break;
776 }
777
778 return index;
779}
780EXPORT_SYMBOL(radix_tree_next_hole);
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802unsigned long radix_tree_prev_hole(struct radix_tree_root *root,
803 unsigned long index, unsigned long max_scan)
804{
805 unsigned long i;
806
807 for (i = 0; i < max_scan; i++) {
808 if (!radix_tree_lookup(root, index))
809 break;
810 index--;
811 if (index == ULONG_MAX)
812 break;
813 }
814
815 return index;
816}
817EXPORT_SYMBOL(radix_tree_prev_hole);
818
819static unsigned int
820__lookup(struct radix_tree_node *slot, void ***results, unsigned long *indices,
821 unsigned long index, unsigned int max_items, unsigned long *next_index)
822{
823 unsigned int nr_found = 0;
824 unsigned int shift, height;
825 unsigned long i;
826
827 height = slot->height;
828 if (height == 0)
829 goto out;
830 shift = (height-1) * RADIX_TREE_MAP_SHIFT;
831
832 for ( ; height > 1; height--) {
833 i = (index >> shift) & RADIX_TREE_MAP_MASK;
834 for (;;) {
835 if (slot->slots[i] != NULL)
836 break;
837 index &= ~((1UL << shift) - 1);
838 index += 1UL << shift;
839 if (index == 0)
840 goto out;
841 i++;
842 if (i == RADIX_TREE_MAP_SIZE)
843 goto out;
844 }
845
846 shift -= RADIX_TREE_MAP_SHIFT;
847 slot = rcu_dereference_raw(slot->slots[i]);
848 if (slot == NULL)
849 goto out;
850 }
851
852
853 for (i = index & RADIX_TREE_MAP_MASK; i < RADIX_TREE_MAP_SIZE; i++) {
854 if (slot->slots[i]) {
855 results[nr_found] = &(slot->slots[i]);
856 if (indices)
857 indices[nr_found] = index;
858 if (++nr_found == max_items) {
859 index++;
860 goto out;
861 }
862 }
863 index++;
864 }
865out:
866 *next_index = index;
867 return nr_found;
868}
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889unsigned int
890radix_tree_gang_lookup(struct radix_tree_root *root, void **results,
891 unsigned long first_index, unsigned int max_items)
892{
893 unsigned long max_index;
894 struct radix_tree_node *node;
895 unsigned long cur_index = first_index;
896 unsigned int ret;
897
898 node = rcu_dereference_raw(root->rnode);
899 if (!node)
900 return 0;
901
902 if (!radix_tree_is_indirect_ptr(node)) {
903 if (first_index > 0)
904 return 0;
905 results[0] = node;
906 return 1;
907 }
908 node = indirect_to_ptr(node);
909
910 max_index = radix_tree_maxindex(node->height);
911
912 ret = 0;
913 while (ret < max_items) {
914 unsigned int nr_found, slots_found, i;
915 unsigned long next_index;
916
917 if (cur_index > max_index)
918 break;
919 slots_found = __lookup(node, (void ***)results + ret, NULL,
920 cur_index, max_items - ret, &next_index);
921 nr_found = 0;
922 for (i = 0; i < slots_found; i++) {
923 struct radix_tree_node *slot;
924 slot = *(((void ***)results)[ret + i]);
925 if (!slot)
926 continue;
927 results[ret + nr_found] =
928 indirect_to_ptr(rcu_dereference_raw(slot));
929 nr_found++;
930 }
931 ret += nr_found;
932 if (next_index == 0)
933 break;
934 cur_index = next_index;
935 }
936
937 return ret;
938}
939EXPORT_SYMBOL(radix_tree_gang_lookup);
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959unsigned int
960radix_tree_gang_lookup_slot(struct radix_tree_root *root,
961 void ***results, unsigned long *indices,
962 unsigned long first_index, unsigned int max_items)
963{
964 unsigned long max_index;
965 struct radix_tree_node *node;
966 unsigned long cur_index = first_index;
967 unsigned int ret;
968
969 node = rcu_dereference_raw(root->rnode);
970 if (!node)
971 return 0;
972
973 if (!radix_tree_is_indirect_ptr(node)) {
974 if (first_index > 0)
975 return 0;
976 results[0] = (void **)&root->rnode;
977 if (indices)
978 indices[0] = 0;
979 return 1;
980 }
981 node = indirect_to_ptr(node);
982
983 max_index = radix_tree_maxindex(node->height);
984
985 ret = 0;
986 while (ret < max_items) {
987 unsigned int slots_found;
988 unsigned long next_index;
989
990 if (cur_index > max_index)
991 break;
992 slots_found = __lookup(node, results + ret,
993 indices ? indices + ret : NULL,
994 cur_index, max_items - ret, &next_index);
995 ret += slots_found;
996 if (next_index == 0)
997 break;
998 cur_index = next_index;
999 }
1000
1001 return ret;
1002}
1003EXPORT_SYMBOL(radix_tree_gang_lookup_slot);
1004
1005
1006
1007
1008
1009static unsigned int
1010__lookup_tag(struct radix_tree_node *slot, void ***results, unsigned long index,
1011 unsigned int max_items, unsigned long *next_index, unsigned int tag)
1012{
1013 unsigned int nr_found = 0;
1014 unsigned int shift, height;
1015
1016 height = slot->height;
1017 if (height == 0)
1018 goto out;
1019 shift = (height-1) * RADIX_TREE_MAP_SHIFT;
1020
1021 while (height > 0) {
1022 unsigned long i = (index >> shift) & RADIX_TREE_MAP_MASK ;
1023
1024 for (;;) {
1025 if (tag_get(slot, tag, i))
1026 break;
1027 index &= ~((1UL << shift) - 1);
1028 index += 1UL << shift;
1029 if (index == 0)
1030 goto out;
1031 i++;
1032 if (i == RADIX_TREE_MAP_SIZE)
1033 goto out;
1034 }
1035 height--;
1036 if (height == 0) {
1037 unsigned long j = index & RADIX_TREE_MAP_MASK;
1038
1039 for ( ; j < RADIX_TREE_MAP_SIZE; j++) {
1040 index++;
1041 if (!tag_get(slot, tag, j))
1042 continue;
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053 if (slot->slots[j]) {
1054 results[nr_found++] = &(slot->slots[j]);
1055 if (nr_found == max_items)
1056 goto out;
1057 }
1058 }
1059 }
1060 shift -= RADIX_TREE_MAP_SHIFT;
1061 slot = rcu_dereference_raw(slot->slots[i]);
1062 if (slot == NULL)
1063 break;
1064 }
1065out:
1066 *next_index = index;
1067 return nr_found;
1068}
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083unsigned int
1084radix_tree_gang_lookup_tag(struct radix_tree_root *root, void **results,
1085 unsigned long first_index, unsigned int max_items,
1086 unsigned int tag)
1087{
1088 struct radix_tree_node *node;
1089 unsigned long max_index;
1090 unsigned long cur_index = first_index;
1091 unsigned int ret;
1092
1093
1094 if (!root_tag_get(root, tag))
1095 return 0;
1096
1097 node = rcu_dereference_raw(root->rnode);
1098 if (!node)
1099 return 0;
1100
1101 if (!radix_tree_is_indirect_ptr(node)) {
1102 if (first_index > 0)
1103 return 0;
1104 results[0] = node;
1105 return 1;
1106 }
1107 node = indirect_to_ptr(node);
1108
1109 max_index = radix_tree_maxindex(node->height);
1110
1111 ret = 0;
1112 while (ret < max_items) {
1113 unsigned int nr_found, slots_found, i;
1114 unsigned long next_index;
1115
1116 if (cur_index > max_index)
1117 break;
1118 slots_found = __lookup_tag(node, (void ***)results + ret,
1119 cur_index, max_items - ret, &next_index, tag);
1120 nr_found = 0;
1121 for (i = 0; i < slots_found; i++) {
1122 struct radix_tree_node *slot;
1123 slot = *(((void ***)results)[ret + i]);
1124 if (!slot)
1125 continue;
1126 results[ret + nr_found] =
1127 indirect_to_ptr(rcu_dereference_raw(slot));
1128 nr_found++;
1129 }
1130 ret += nr_found;
1131 if (next_index == 0)
1132 break;
1133 cur_index = next_index;
1134 }
1135
1136 return ret;
1137}
1138EXPORT_SYMBOL(radix_tree_gang_lookup_tag);
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153unsigned int
1154radix_tree_gang_lookup_tag_slot(struct radix_tree_root *root, void ***results,
1155 unsigned long first_index, unsigned int max_items,
1156 unsigned int tag)
1157{
1158 struct radix_tree_node *node;
1159 unsigned long max_index;
1160 unsigned long cur_index = first_index;
1161 unsigned int ret;
1162
1163
1164 if (!root_tag_get(root, tag))
1165 return 0;
1166
1167 node = rcu_dereference_raw(root->rnode);
1168 if (!node)
1169 return 0;
1170
1171 if (!radix_tree_is_indirect_ptr(node)) {
1172 if (first_index > 0)
1173 return 0;
1174 results[0] = (void **)&root->rnode;
1175 return 1;
1176 }
1177 node = indirect_to_ptr(node);
1178
1179 max_index = radix_tree_maxindex(node->height);
1180
1181 ret = 0;
1182 while (ret < max_items) {
1183 unsigned int slots_found;
1184 unsigned long next_index;
1185
1186 if (cur_index > max_index)
1187 break;
1188 slots_found = __lookup_tag(node, results + ret,
1189 cur_index, max_items - ret, &next_index, tag);
1190 ret += slots_found;
1191 if (next_index == 0)
1192 break;
1193 cur_index = next_index;
1194 }
1195
1196 return ret;
1197}
1198EXPORT_SYMBOL(radix_tree_gang_lookup_tag_slot);
1199
1200#if defined(CONFIG_SHMEM) && defined(CONFIG_SWAP)
1201#include <linux/sched.h>
1202
1203
1204
1205
1206static unsigned long __locate(struct radix_tree_node *slot, void *item,
1207 unsigned long index, unsigned long *found_index)
1208{
1209 unsigned int shift, height;
1210 unsigned long i;
1211
1212 height = slot->height;
1213 shift = (height-1) * RADIX_TREE_MAP_SHIFT;
1214
1215 for ( ; height > 1; height--) {
1216 i = (index >> shift) & RADIX_TREE_MAP_MASK;
1217 for (;;) {
1218 if (slot->slots[i] != NULL)
1219 break;
1220 index &= ~((1UL << shift) - 1);
1221 index += 1UL << shift;
1222 if (index == 0)
1223 goto out;
1224 i++;
1225 if (i == RADIX_TREE_MAP_SIZE)
1226 goto out;
1227 }
1228
1229 shift -= RADIX_TREE_MAP_SHIFT;
1230 slot = rcu_dereference_raw(slot->slots[i]);
1231 if (slot == NULL)
1232 goto out;
1233 }
1234
1235
1236 for (i = 0; i < RADIX_TREE_MAP_SIZE; i++) {
1237 if (slot->slots[i] == item) {
1238 *found_index = index + i;
1239 index = 0;
1240 goto out;
1241 }
1242 }
1243 index += RADIX_TREE_MAP_SIZE;
1244out:
1245 return index;
1246}
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257unsigned long radix_tree_locate_item(struct radix_tree_root *root, void *item)
1258{
1259 struct radix_tree_node *node;
1260 unsigned long max_index;
1261 unsigned long cur_index = 0;
1262 unsigned long found_index = -1;
1263
1264 do {
1265 rcu_read_lock();
1266 node = rcu_dereference_raw(root->rnode);
1267 if (!radix_tree_is_indirect_ptr(node)) {
1268 rcu_read_unlock();
1269 if (node == item)
1270 found_index = 0;
1271 break;
1272 }
1273
1274 node = indirect_to_ptr(node);
1275 max_index = radix_tree_maxindex(node->height);
1276 if (cur_index > max_index)
1277 break;
1278
1279 cur_index = __locate(node, item, cur_index, &found_index);
1280 rcu_read_unlock();
1281 cond_resched();
1282 } while (cur_index != 0 && cur_index <= max_index);
1283
1284 return found_index;
1285}
1286#else
1287unsigned long radix_tree_locate_item(struct radix_tree_root *root, void *item)
1288{
1289 return -1;
1290}
1291#endif
1292
1293
1294
1295
1296
1297static inline void radix_tree_shrink(struct radix_tree_root *root)
1298{
1299
1300 while (root->height > 0) {
1301 struct radix_tree_node *to_free = root->rnode;
1302 void *newptr;
1303
1304 BUG_ON(!radix_tree_is_indirect_ptr(to_free));
1305 to_free = indirect_to_ptr(to_free);
1306
1307
1308
1309
1310
1311 if (to_free->count != 1)
1312 break;
1313 if (!to_free->slots[0])
1314 break;
1315
1316
1317
1318
1319
1320
1321
1322
1323 newptr = to_free->slots[0];
1324 if (root->height > 1)
1325 newptr = ptr_to_indirect(newptr);
1326 root->rnode = newptr;
1327 root->height--;
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347 if (root->height == 0)
1348 *((unsigned long *)&to_free->slots[0]) |=
1349 RADIX_TREE_INDIRECT_PTR;
1350
1351 radix_tree_node_free(to_free);
1352 }
1353}
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364void *radix_tree_delete(struct radix_tree_root *root, unsigned long index)
1365{
1366
1367
1368
1369
1370 struct radix_tree_path path[RADIX_TREE_MAX_PATH + 1], *pathp = path;
1371 struct radix_tree_node *slot = NULL;
1372 struct radix_tree_node *to_free;
1373 unsigned int height, shift;
1374 int tag;
1375 int offset;
1376
1377 height = root->height;
1378 if (index > radix_tree_maxindex(height))
1379 goto out;
1380
1381 slot = root->rnode;
1382 if (height == 0) {
1383 root_tag_clear_all(root);
1384 root->rnode = NULL;
1385 goto out;
1386 }
1387 slot = indirect_to_ptr(slot);
1388
1389 shift = (height - 1) * RADIX_TREE_MAP_SHIFT;
1390 pathp->node = NULL;
1391
1392 do {
1393 if (slot == NULL)
1394 goto out;
1395
1396 pathp++;
1397 offset = (index >> shift) & RADIX_TREE_MAP_MASK;
1398 pathp->offset = offset;
1399 pathp->node = slot;
1400 slot = slot->slots[offset];
1401 shift -= RADIX_TREE_MAP_SHIFT;
1402 height--;
1403 } while (height > 0);
1404
1405 if (slot == NULL)
1406 goto out;
1407
1408
1409
1410
1411 for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) {
1412 if (tag_get(pathp->node, tag, pathp->offset))
1413 radix_tree_tag_clear(root, index, tag);
1414 }
1415
1416 to_free = NULL;
1417
1418 while (pathp->node) {
1419 pathp->node->slots[pathp->offset] = NULL;
1420 pathp->node->count--;
1421
1422
1423
1424
1425 if (to_free)
1426 radix_tree_node_free(to_free);
1427
1428 if (pathp->node->count) {
1429 if (pathp->node == indirect_to_ptr(root->rnode))
1430 radix_tree_shrink(root);
1431 goto out;
1432 }
1433
1434
1435 to_free = pathp->node;
1436 pathp--;
1437
1438 }
1439 root_tag_clear_all(root);
1440 root->height = 0;
1441 root->rnode = NULL;
1442 if (to_free)
1443 radix_tree_node_free(to_free);
1444
1445out:
1446 return slot;
1447}
1448EXPORT_SYMBOL(radix_tree_delete);
1449
1450
1451
1452
1453
1454
1455int radix_tree_tagged(struct radix_tree_root *root, unsigned int tag)
1456{
1457 return root_tag_get(root, tag);
1458}
1459EXPORT_SYMBOL(radix_tree_tagged);
1460
1461static void
1462radix_tree_node_ctor(void *node)
1463{
1464 memset(node, 0, sizeof(struct radix_tree_node));
1465}
1466
1467static __init unsigned long __maxindex(unsigned int height)
1468{
1469 unsigned int width = height * RADIX_TREE_MAP_SHIFT;
1470 int shift = RADIX_TREE_INDEX_BITS - width;
1471
1472 if (shift < 0)
1473 return ~0UL;
1474 if (shift >= BITS_PER_LONG)
1475 return 0UL;
1476 return ~0UL >> shift;
1477}
1478
1479static __init void radix_tree_init_maxindex(void)
1480{
1481 unsigned int i;
1482
1483 for (i = 0; i < ARRAY_SIZE(height_to_maxindex); i++)
1484 height_to_maxindex[i] = __maxindex(i);
1485}
1486
1487static int radix_tree_callback(struct notifier_block *nfb,
1488 unsigned long action,
1489 void *hcpu)
1490{
1491 int cpu = (long)hcpu;
1492 struct radix_tree_preload *rtp;
1493
1494
1495 if (action == CPU_DEAD || action == CPU_DEAD_FROZEN) {
1496 rtp = &per_cpu(radix_tree_preloads, cpu);
1497 while (rtp->nr) {
1498 kmem_cache_free(radix_tree_node_cachep,
1499 rtp->nodes[rtp->nr-1]);
1500 rtp->nodes[rtp->nr-1] = NULL;
1501 rtp->nr--;
1502 }
1503 }
1504 return NOTIFY_OK;
1505}
1506
1507void __init radix_tree_init(void)
1508{
1509 radix_tree_node_cachep = kmem_cache_create("radix_tree_node",
1510 sizeof(struct radix_tree_node), 0,
1511 SLAB_PANIC | SLAB_RECLAIM_ACCOUNT,
1512 radix_tree_node_ctor);
1513 radix_tree_init_maxindex();
1514 hotcpu_notifier(radix_tree_callback, 0);
1515}
1516