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