@@ -60,6 +60,33 @@ static inline int radix_tree_is_indirect_ptr(void *ptr)
60
60
61
61
#define RADIX_TREE_MAX_TAGS 3
62
62
63
+ #ifdef __KERNEL__
64
+ #define RADIX_TREE_MAP_SHIFT (CONFIG_BASE_SMALL ? 4 : 6)
65
+ #else
66
+ #define RADIX_TREE_MAP_SHIFT 3 /* For more stressful testing */
67
+ #endif
68
+
69
+ #define RADIX_TREE_MAP_SIZE (1UL << RADIX_TREE_MAP_SHIFT)
70
+ #define RADIX_TREE_MAP_MASK (RADIX_TREE_MAP_SIZE-1)
71
+
72
+ #define RADIX_TREE_TAG_LONGS \
73
+ ((RADIX_TREE_MAP_SIZE + BITS_PER_LONG - 1) / BITS_PER_LONG)
74
+
75
+ struct radix_tree_node {
76
+ unsigned int height ; /* Height from the bottom */
77
+ unsigned int count ;
78
+ union {
79
+ struct radix_tree_node * parent ; /* Used when ascending tree */
80
+ struct rcu_head rcu_head ; /* Used when freeing node */
81
+ };
82
+ void __rcu * slots [RADIX_TREE_MAP_SIZE ];
83
+ unsigned long tags [RADIX_TREE_MAX_TAGS ][RADIX_TREE_TAG_LONGS ];
84
+ };
85
+
86
+ #define RADIX_TREE_INDEX_BITS (8 /* CHAR_BIT */ * sizeof (unsigned long ))
87
+ #define RADIX_TREE_MAX_PATH (DIV_ROUND_UP(RADIX_TREE_INDEX_BITS, \
88
+ RADIX_TREE_MAP_SHIFT))
89
+
63
90
/* root tags are stored in gfp_mask, shifted by __GFP_BITS_SHIFT */
64
91
struct radix_tree_root {
65
92
unsigned int height ;
@@ -101,6 +128,7 @@ do { \
101
128
* concurrently with other readers.
102
129
*
103
130
* The notable exceptions to this rule are the following functions:
131
+ * __radix_tree_lookup
104
132
* radix_tree_lookup
105
133
* radix_tree_lookup_slot
106
134
* radix_tree_tag_get
@@ -216,9 +244,15 @@ static inline void radix_tree_replace_slot(void **pslot, void *item)
216
244
rcu_assign_pointer (* pslot , item );
217
245
}
218
246
247
+ int __radix_tree_create (struct radix_tree_root * root , unsigned long index ,
248
+ struct radix_tree_node * * nodep , void * * * slotp );
219
249
int radix_tree_insert (struct radix_tree_root * , unsigned long , void * );
250
+ void * __radix_tree_lookup (struct radix_tree_root * root , unsigned long index ,
251
+ struct radix_tree_node * * nodep , void * * * slotp );
220
252
void * radix_tree_lookup (struct radix_tree_root * , unsigned long );
221
253
void * * radix_tree_lookup_slot (struct radix_tree_root * , unsigned long );
254
+ bool __radix_tree_delete_node (struct radix_tree_root * root , unsigned long index ,
255
+ struct radix_tree_node * node );
222
256
void * radix_tree_delete_item (struct radix_tree_root * , unsigned long , void * );
223
257
void * radix_tree_delete (struct radix_tree_root * , unsigned long );
224
258
unsigned int
0 commit comments