0001
0002
0003
0004
0005
0006
0007
0008 #ifndef _LINUX_RADIX_TREE_H
0009 #define _LINUX_RADIX_TREE_H
0010
0011 #include <linux/bitops.h>
0012 #include <linux/gfp_types.h>
0013 #include <linux/list.h>
0014 #include <linux/lockdep.h>
0015 #include <linux/math.h>
0016 #include <linux/percpu.h>
0017 #include <linux/preempt.h>
0018 #include <linux/rcupdate.h>
0019 #include <linux/spinlock.h>
0020 #include <linux/types.h>
0021 #include <linux/xarray.h>
0022 #include <linux/local_lock.h>
0023
0024
0025 #define radix_tree_root xarray
0026 #define radix_tree_node xa_node
0027
0028 struct radix_tree_preload {
0029 local_lock_t lock;
0030 unsigned nr;
0031
0032 struct radix_tree_node *nodes;
0033 };
0034 DECLARE_PER_CPU(struct radix_tree_preload, radix_tree_preloads);
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052 #define RADIX_TREE_ENTRY_MASK 3UL
0053 #define RADIX_TREE_INTERNAL_NODE 2UL
0054
0055 static inline bool radix_tree_is_internal_node(void *ptr)
0056 {
0057 return ((unsigned long)ptr & RADIX_TREE_ENTRY_MASK) ==
0058 RADIX_TREE_INTERNAL_NODE;
0059 }
0060
0061
0062
0063 #define RADIX_TREE_MAP_SHIFT XA_CHUNK_SHIFT
0064 #define RADIX_TREE_MAP_SIZE (1UL << RADIX_TREE_MAP_SHIFT)
0065 #define RADIX_TREE_MAP_MASK (RADIX_TREE_MAP_SIZE-1)
0066
0067 #define RADIX_TREE_MAX_TAGS XA_MAX_MARKS
0068 #define RADIX_TREE_TAG_LONGS XA_MARK_LONGS
0069
0070 #define RADIX_TREE_INDEX_BITS (8 * sizeof(unsigned long))
0071 #define RADIX_TREE_MAX_PATH (DIV_ROUND_UP(RADIX_TREE_INDEX_BITS, \
0072 RADIX_TREE_MAP_SHIFT))
0073
0074
0075 #define ROOT_IS_IDR ((__force gfp_t)4)
0076
0077 #define ROOT_TAG_SHIFT (__GFP_BITS_SHIFT)
0078
0079 #define RADIX_TREE_INIT(name, mask) XARRAY_INIT(name, mask)
0080
0081 #define RADIX_TREE(name, mask) \
0082 struct radix_tree_root name = RADIX_TREE_INIT(name, mask)
0083
0084 #define INIT_RADIX_TREE(root, mask) xa_init_flags(root, mask)
0085
0086 static inline bool radix_tree_empty(const struct radix_tree_root *root)
0087 {
0088 return root->xa_head == NULL;
0089 }
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106 struct radix_tree_iter {
0107 unsigned long index;
0108 unsigned long next_index;
0109 unsigned long tags;
0110 struct radix_tree_node *node;
0111 };
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177 static inline void *radix_tree_deref_slot(void __rcu **slot)
0178 {
0179 return rcu_dereference(*slot);
0180 }
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191 static inline void *radix_tree_deref_slot_protected(void __rcu **slot,
0192 spinlock_t *treelock)
0193 {
0194 return rcu_dereference_protected(*slot, lockdep_is_held(treelock));
0195 }
0196
0197
0198
0199
0200
0201
0202
0203
0204 static inline int radix_tree_deref_retry(void *arg)
0205 {
0206 return unlikely(radix_tree_is_internal_node(arg));
0207 }
0208
0209
0210
0211
0212
0213
0214 static inline int radix_tree_exception(void *arg)
0215 {
0216 return unlikely((unsigned long)arg & RADIX_TREE_ENTRY_MASK);
0217 }
0218
0219 int radix_tree_insert(struct radix_tree_root *, unsigned long index,
0220 void *);
0221 void *__radix_tree_lookup(const struct radix_tree_root *, unsigned long index,
0222 struct radix_tree_node **nodep, void __rcu ***slotp);
0223 void *radix_tree_lookup(const struct radix_tree_root *, unsigned long);
0224 void __rcu **radix_tree_lookup_slot(const struct radix_tree_root *,
0225 unsigned long index);
0226 void __radix_tree_replace(struct radix_tree_root *, struct radix_tree_node *,
0227 void __rcu **slot, void *entry);
0228 void radix_tree_iter_replace(struct radix_tree_root *,
0229 const struct radix_tree_iter *, void __rcu **slot, void *entry);
0230 void radix_tree_replace_slot(struct radix_tree_root *,
0231 void __rcu **slot, void *entry);
0232 void radix_tree_iter_delete(struct radix_tree_root *,
0233 struct radix_tree_iter *iter, void __rcu **slot);
0234 void *radix_tree_delete_item(struct radix_tree_root *, unsigned long, void *);
0235 void *radix_tree_delete(struct radix_tree_root *, unsigned long);
0236 unsigned int radix_tree_gang_lookup(const struct radix_tree_root *,
0237 void **results, unsigned long first_index,
0238 unsigned int max_items);
0239 int radix_tree_preload(gfp_t gfp_mask);
0240 int radix_tree_maybe_preload(gfp_t gfp_mask);
0241 void radix_tree_init(void);
0242 void *radix_tree_tag_set(struct radix_tree_root *,
0243 unsigned long index, unsigned int tag);
0244 void *radix_tree_tag_clear(struct radix_tree_root *,
0245 unsigned long index, unsigned int tag);
0246 int radix_tree_tag_get(const struct radix_tree_root *,
0247 unsigned long index, unsigned int tag);
0248 void radix_tree_iter_tag_clear(struct radix_tree_root *,
0249 const struct radix_tree_iter *iter, unsigned int tag);
0250 unsigned int radix_tree_gang_lookup_tag(const struct radix_tree_root *,
0251 void **results, unsigned long first_index,
0252 unsigned int max_items, unsigned int tag);
0253 unsigned int radix_tree_gang_lookup_tag_slot(const struct radix_tree_root *,
0254 void __rcu ***results, unsigned long first_index,
0255 unsigned int max_items, unsigned int tag);
0256 int radix_tree_tagged(const struct radix_tree_root *, unsigned int tag);
0257
0258 static inline void radix_tree_preload_end(void)
0259 {
0260 local_unlock(&radix_tree_preloads.lock);
0261 }
0262
0263 void __rcu **idr_get_free(struct radix_tree_root *root,
0264 struct radix_tree_iter *iter, gfp_t gfp,
0265 unsigned long max);
0266
0267 enum {
0268 RADIX_TREE_ITER_TAG_MASK = 0x0f,
0269 RADIX_TREE_ITER_TAGGED = 0x10,
0270 RADIX_TREE_ITER_CONTIG = 0x20,
0271 };
0272
0273
0274
0275
0276
0277
0278
0279
0280 static __always_inline void __rcu **
0281 radix_tree_iter_init(struct radix_tree_iter *iter, unsigned long start)
0282 {
0283
0284
0285
0286
0287
0288
0289
0290
0291 iter->index = 0;
0292 iter->next_index = start;
0293 return NULL;
0294 }
0295
0296
0297
0298
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308
0309 void __rcu **radix_tree_next_chunk(const struct radix_tree_root *,
0310 struct radix_tree_iter *iter, unsigned flags);
0311
0312
0313
0314
0315
0316
0317
0318
0319
0320
0321
0322 static inline void __rcu **
0323 radix_tree_iter_lookup(const struct radix_tree_root *root,
0324 struct radix_tree_iter *iter, unsigned long index)
0325 {
0326 radix_tree_iter_init(iter, index);
0327 return radix_tree_next_chunk(root, iter, RADIX_TREE_ITER_CONTIG);
0328 }
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339 static inline __must_check
0340 void __rcu **radix_tree_iter_retry(struct radix_tree_iter *iter)
0341 {
0342 iter->next_index = iter->index;
0343 iter->tags = 0;
0344 return NULL;
0345 }
0346
0347 static inline unsigned long
0348 __radix_tree_iter_add(struct radix_tree_iter *iter, unsigned long slots)
0349 {
0350 return iter->index + slots;
0351 }
0352
0353
0354
0355
0356
0357
0358
0359
0360
0361
0362
0363 void __rcu **__must_check radix_tree_iter_resume(void __rcu **slot,
0364 struct radix_tree_iter *iter);
0365
0366
0367
0368
0369
0370
0371
0372 static __always_inline long
0373 radix_tree_chunk_size(struct radix_tree_iter *iter)
0374 {
0375 return iter->next_index - iter->index;
0376 }
0377
0378
0379
0380
0381
0382
0383
0384
0385
0386
0387
0388
0389
0390
0391
0392
0393
0394
0395
0396
0397 static __always_inline void __rcu **radix_tree_next_slot(void __rcu **slot,
0398 struct radix_tree_iter *iter, unsigned flags)
0399 {
0400 if (flags & RADIX_TREE_ITER_TAGGED) {
0401 iter->tags >>= 1;
0402 if (unlikely(!iter->tags))
0403 return NULL;
0404 if (likely(iter->tags & 1ul)) {
0405 iter->index = __radix_tree_iter_add(iter, 1);
0406 slot++;
0407 goto found;
0408 }
0409 if (!(flags & RADIX_TREE_ITER_CONTIG)) {
0410 unsigned offset = __ffs(iter->tags);
0411
0412 iter->tags >>= offset++;
0413 iter->index = __radix_tree_iter_add(iter, offset);
0414 slot += offset;
0415 goto found;
0416 }
0417 } else {
0418 long count = radix_tree_chunk_size(iter);
0419
0420 while (--count > 0) {
0421 slot++;
0422 iter->index = __radix_tree_iter_add(iter, 1);
0423
0424 if (likely(*slot))
0425 goto found;
0426 if (flags & RADIX_TREE_ITER_CONTIG) {
0427
0428 iter->next_index = 0;
0429 break;
0430 }
0431 }
0432 }
0433 return NULL;
0434
0435 found:
0436 return slot;
0437 }
0438
0439
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449 #define radix_tree_for_each_slot(slot, root, iter, start) \
0450 for (slot = radix_tree_iter_init(iter, start) ; \
0451 slot || (slot = radix_tree_next_chunk(root, iter, 0)) ; \
0452 slot = radix_tree_next_slot(slot, iter, 0))
0453
0454
0455
0456
0457
0458
0459
0460
0461
0462
0463
0464
0465 #define radix_tree_for_each_tagged(slot, root, iter, start, tag) \
0466 for (slot = radix_tree_iter_init(iter, start) ; \
0467 slot || (slot = radix_tree_next_chunk(root, iter, \
0468 RADIX_TREE_ITER_TAGGED | tag)) ; \
0469 slot = radix_tree_next_slot(slot, iter, \
0470 RADIX_TREE_ITER_TAGGED | tag))
0471
0472 #endif