Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'idr-4.11' of git://git.infradead.org/users/willy/linux-dax

Pull IDR rewrite from Matthew Wilcox:
"The most significant part of the following is the patch to rewrite the
IDR & IDA to be clients of the radix tree. But there's much more,
including an enhancement of the IDA to be significantly more space
efficient, an IDR & IDA test suite, some improvements to the IDR API
(and driver changes to take advantage of those improvements), several
improvements to the radix tree test suite and RCU annotations.

The IDR & IDA rewrite had a good spin in linux-next and Andrew's tree
for most of the last cycle. Coupled with the IDR test suite, I feel
pretty confident that any remaining bugs are quite hard to hit. 0-day
did a great job of watching my git tree and pointing out problems; as
it hit them, I added new test-cases to be sure not to be caught the
same way twice"

Willy goes on to expand a bit on the IDR rewrite rationale:
"The radix tree and the IDR use very similar data structures.

Merging the two codebases lets us share the memory allocation pools,
and results in a net deletion of 500 lines of code. It also opens up
the possibility of exposing more of the features of the radix tree to
users of the IDR (and I have some interesting patches along those
lines waiting for 4.12)

It also shrinks the size of the 'struct idr' from 40 bytes to 24 which
will shrink a fair few data structures that embed an IDR"

* 'idr-4.11' of git://git.infradead.org/users/willy/linux-dax: (32 commits)
radix tree test suite: Add config option for map shift
idr: Add missing __rcu annotations
radix-tree: Fix __rcu annotations
radix-tree: Add rcu_dereference and rcu_assign_pointer calls
radix tree test suite: Run iteration tests for longer
radix tree test suite: Fix split/join memory leaks
radix tree test suite: Fix leaks in regression2.c
radix tree test suite: Fix leaky tests
radix tree test suite: Enable address sanitizer
radix_tree_iter_resume: Fix out of bounds error
radix-tree: Store a pointer to the root in each node
radix-tree: Chain preallocated nodes through ->parent
radix tree test suite: Dial down verbosity with -v
radix tree test suite: Introduce kmalloc_verbose
idr: Return the deleted entry from idr_remove
radix tree test suite: Build separate binaries for some tests
ida: Use exceptional entries for small IDAs
ida: Move ida_bitmap to a percpu variable
Reimplement IDR and IDA using the radix tree
radix-tree: Add radix_tree_iter_delete
...

+1752 -2126
+2 -3
drivers/atm/nicstar.c
··· 1980 1980 card->lbfqc = ns_stat_lfbqc_get(stat); 1981 1981 1982 1982 id = le32_to_cpu(rsqe->buffer_handle); 1983 - skb = idr_find(&card->idr, id); 1983 + skb = idr_remove(&card->idr, id); 1984 1984 if (!skb) { 1985 1985 RXPRINTK(KERN_ERR 1986 - "nicstar%d: idr_find() failed!\n", card->index); 1986 + "nicstar%d: skb not found!\n", card->index); 1987 1987 return; 1988 1988 } 1989 - idr_remove(&card->idr, id); 1990 1989 dma_sync_single_for_cpu(&card->pcidev->dev, 1991 1990 NS_PRV_DMA(skb), 1992 1991 (NS_PRV_BUFTYPE(skb) == BUF_SM
+2 -4
drivers/block/drbd/drbd_main.c
··· 2915 2915 idr_remove(&connection->peer_devices, vnr); 2916 2916 out_idr_remove_from_resource: 2917 2917 for_each_connection(connection, resource) { 2918 - peer_device = idr_find(&connection->peer_devices, vnr); 2919 - if (peer_device) { 2920 - idr_remove(&connection->peer_devices, vnr); 2918 + peer_device = idr_remove(&connection->peer_devices, vnr); 2919 + if (peer_device) 2921 2920 kref_put(&connection->kref, drbd_destroy_connection); 2922 - } 2923 2921 } 2924 2922 for_each_peer_device_safe(peer_device, tmp_peer_device, device) { 2925 2923 list_del(&peer_device->peer_devices);
+1 -2
drivers/firewire/core-cdev.c
··· 1307 1307 */ 1308 1308 if (r->todo == ISO_RES_REALLOC && !success && 1309 1309 !client->in_shutdown && 1310 - idr_find(&client->resource_idr, r->resource.handle)) { 1311 - idr_remove(&client->resource_idr, r->resource.handle); 1310 + idr_remove(&client->resource_idr, r->resource.handle)) { 1312 1311 client_put(client); 1313 1312 free = true; 1314 1313 }
+2 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
··· 70 70 struct amdgpu_bo_list *list; 71 71 72 72 mutex_lock(&fpriv->bo_list_lock); 73 - list = idr_find(&fpriv->bo_list_handles, id); 73 + list = idr_remove(&fpriv->bo_list_handles, id); 74 74 if (list) { 75 + /* Another user may have a reference to this list still */ 75 76 mutex_lock(&list->lock); 76 - idr_remove(&fpriv->bo_list_handles, id); 77 77 mutex_unlock(&list->lock); 78 78 amdgpu_bo_list_free(list); 79 79 }
+3 -7
drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
··· 135 135 struct amdgpu_ctx *ctx; 136 136 137 137 mutex_lock(&mgr->lock); 138 - ctx = idr_find(&mgr->ctx_handles, id); 139 - if (ctx) { 140 - idr_remove(&mgr->ctx_handles, id); 138 + ctx = idr_remove(&mgr->ctx_handles, id); 139 + if (ctx) 141 140 kref_put(&ctx->refcount, amdgpu_ctx_do_release); 142 - mutex_unlock(&mgr->lock); 143 - return 0; 144 - } 145 141 mutex_unlock(&mgr->lock); 146 - return -EINVAL; 142 + return ctx ? 0 : -EINVAL; 147 143 } 148 144 149 145 static int amdgpu_ctx_query(struct amdgpu_device *adev,
+1 -3
drivers/net/wireless/marvell/mwifiex/txrx.c
··· 346 346 return; 347 347 348 348 spin_lock_irqsave(&priv->ack_status_lock, flags); 349 - ack_skb = idr_find(&priv->ack_status_frames, tx_status->tx_token_id); 350 - if (ack_skb) 351 - idr_remove(&priv->ack_status_frames, tx_status->tx_token_id); 349 + ack_skb = idr_remove(&priv->ack_status_frames, tx_status->tx_token_id); 352 350 spin_unlock_irqrestore(&priv->ack_status_lock, flags); 353 351 354 352 if (ack_skb) {
+1 -3
drivers/target/target_core_user.c
··· 642 642 WARN_ON(tcmu_hdr_get_op(entry->hdr.len_op) != TCMU_OP_CMD); 643 643 644 644 spin_lock(&udev->commands_lock); 645 - cmd = idr_find(&udev->commands, entry->hdr.cmd_id); 646 - if (cmd) 647 - idr_remove(&udev->commands, cmd->cmd_id); 645 + cmd = idr_remove(&udev->commands, entry->hdr.cmd_id); 648 646 spin_unlock(&udev->commands_lock); 649 647 650 648 if (!cmd) {
+68 -82
include/linux/idr.h
··· 12 12 #ifndef __IDR_H__ 13 13 #define __IDR_H__ 14 14 15 - #include <linux/types.h> 16 - #include <linux/bitops.h> 17 - #include <linux/init.h> 18 - #include <linux/rcupdate.h> 19 - 20 - /* 21 - * Using 6 bits at each layer allows us to allocate 7 layers out of each page. 22 - * 8 bits only gave us 3 layers out of every pair of pages, which is less 23 - * efficient except for trees with a largest element between 192-255 inclusive. 24 - */ 25 - #define IDR_BITS 6 26 - #define IDR_SIZE (1 << IDR_BITS) 27 - #define IDR_MASK ((1 << IDR_BITS)-1) 28 - 29 - struct idr_layer { 30 - int prefix; /* the ID prefix of this idr_layer */ 31 - int layer; /* distance from leaf */ 32 - struct idr_layer __rcu *ary[1<<IDR_BITS]; 33 - int count; /* When zero, we can release it */ 34 - union { 35 - /* A zero bit means "space here" */ 36 - DECLARE_BITMAP(bitmap, IDR_SIZE); 37 - struct rcu_head rcu_head; 38 - }; 39 - }; 15 + #include <linux/radix-tree.h> 16 + #include <linux/gfp.h> 17 + #include <linux/percpu.h> 40 18 41 19 struct idr { 42 - struct idr_layer __rcu *hint; /* the last layer allocated from */ 43 - struct idr_layer __rcu *top; 44 - int layers; /* only valid w/o concurrent changes */ 45 - int cur; /* current pos for cyclic allocation */ 46 - spinlock_t lock; 47 - int id_free_cnt; 48 - struct idr_layer *id_free; 20 + struct radix_tree_root idr_rt; 21 + unsigned int idr_next; 49 22 }; 50 23 51 - #define IDR_INIT(name) \ 24 + /* 25 + * The IDR API does not expose the tagging functionality of the radix tree 26 + * to users. Use tag 0 to track whether a node has free space below it. 27 + */ 28 + #define IDR_FREE 0 29 + 30 + /* Set the IDR flag and the IDR_FREE tag */ 31 + #define IDR_RT_MARKER ((__force gfp_t)(3 << __GFP_BITS_SHIFT)) 32 + 33 + #define IDR_INIT \ 52 34 { \ 53 - .lock = __SPIN_LOCK_UNLOCKED(name.lock), \ 35 + .idr_rt = RADIX_TREE_INIT(IDR_RT_MARKER) \ 54 36 } 55 - #define DEFINE_IDR(name) struct idr name = IDR_INIT(name) 37 + #define DEFINE_IDR(name) struct idr name = IDR_INIT 56 38 57 39 /** 58 40 * idr_get_cursor - Return the current position of the cyclic allocator ··· 44 62 * idr_alloc_cyclic() if it is free (otherwise the search will start from 45 63 * this position). 46 64 */ 47 - static inline unsigned int idr_get_cursor(struct idr *idr) 65 + static inline unsigned int idr_get_cursor(const struct idr *idr) 48 66 { 49 - return READ_ONCE(idr->cur); 67 + return READ_ONCE(idr->idr_next); 50 68 } 51 69 52 70 /** ··· 59 77 */ 60 78 static inline void idr_set_cursor(struct idr *idr, unsigned int val) 61 79 { 62 - WRITE_ONCE(idr->cur, val); 80 + WRITE_ONCE(idr->idr_next, val); 63 81 } 64 82 65 83 /** ··· 79 97 * period). 80 98 */ 81 99 82 - /* 83 - * This is what we export. 84 - */ 85 - 86 - void *idr_find_slowpath(struct idr *idp, int id); 87 100 void idr_preload(gfp_t gfp_mask); 88 - int idr_alloc(struct idr *idp, void *ptr, int start, int end, gfp_t gfp_mask); 89 - int idr_alloc_cyclic(struct idr *idr, void *ptr, int start, int end, gfp_t gfp_mask); 90 - int idr_for_each(struct idr *idp, 101 + int idr_alloc(struct idr *, void *entry, int start, int end, gfp_t); 102 + int idr_alloc_cyclic(struct idr *, void *entry, int start, int end, gfp_t); 103 + int idr_for_each(const struct idr *, 91 104 int (*fn)(int id, void *p, void *data), void *data); 92 - void *idr_get_next(struct idr *idp, int *nextid); 93 - void *idr_replace(struct idr *idp, void *ptr, int id); 94 - void idr_remove(struct idr *idp, int id); 95 - void idr_destroy(struct idr *idp); 96 - void idr_init(struct idr *idp); 97 - bool idr_is_empty(struct idr *idp); 105 + void *idr_get_next(struct idr *, int *nextid); 106 + void *idr_replace(struct idr *, void *, int id); 107 + void idr_destroy(struct idr *); 108 + 109 + static inline void *idr_remove(struct idr *idr, int id) 110 + { 111 + return radix_tree_delete_item(&idr->idr_rt, id, NULL); 112 + } 113 + 114 + static inline void idr_init(struct idr *idr) 115 + { 116 + INIT_RADIX_TREE(&idr->idr_rt, IDR_RT_MARKER); 117 + idr->idr_next = 0; 118 + } 119 + 120 + static inline bool idr_is_empty(const struct idr *idr) 121 + { 122 + return radix_tree_empty(&idr->idr_rt) && 123 + radix_tree_tagged(&idr->idr_rt, IDR_FREE); 124 + } 98 125 99 126 /** 100 127 * idr_preload_end - end preload section started with idr_preload() ··· 128 137 * This function can be called under rcu_read_lock(), given that the leaf 129 138 * pointers lifetimes are correctly managed. 130 139 */ 131 - static inline void *idr_find(struct idr *idr, int id) 140 + static inline void *idr_find(const struct idr *idr, int id) 132 141 { 133 - struct idr_layer *hint = rcu_dereference_raw(idr->hint); 134 - 135 - if (hint && (id & ~IDR_MASK) == hint->prefix) 136 - return rcu_dereference_raw(hint->ary[id & IDR_MASK]); 137 - 138 - return idr_find_slowpath(idr, id); 142 + return radix_tree_lookup(&idr->idr_rt, id); 139 143 } 140 144 141 145 /** 142 146 * idr_for_each_entry - iterate over an idr's elements of a given type 143 - * @idp: idr handle 147 + * @idr: idr handle 144 148 * @entry: the type * to use as cursor 145 149 * @id: id entry's key 146 150 * ··· 143 157 * after normal terminatinon @entry is left with the value NULL. This 144 158 * is convenient for a "not found" value. 145 159 */ 146 - #define idr_for_each_entry(idp, entry, id) \ 147 - for (id = 0; ((entry) = idr_get_next(idp, &(id))) != NULL; ++id) 160 + #define idr_for_each_entry(idr, entry, id) \ 161 + for (id = 0; ((entry) = idr_get_next(idr, &(id))) != NULL; ++id) 148 162 149 163 /** 150 - * idr_for_each_entry - continue iteration over an idr's elements of a given type 151 - * @idp: idr handle 164 + * idr_for_each_entry_continue - continue iteration over an idr's elements of a given type 165 + * @idr: idr handle 152 166 * @entry: the type * to use as cursor 153 167 * @id: id entry's key 154 168 * 155 169 * Continue to iterate over list of given type, continuing after 156 170 * the current position. 157 171 */ 158 - #define idr_for_each_entry_continue(idp, entry, id) \ 159 - for ((entry) = idr_get_next((idp), &(id)); \ 172 + #define idr_for_each_entry_continue(idr, entry, id) \ 173 + for ((entry) = idr_get_next((idr), &(id)); \ 160 174 entry; \ 161 - ++id, (entry) = idr_get_next((idp), &(id))) 175 + ++id, (entry) = idr_get_next((idr), &(id))) 162 176 163 177 /* 164 178 * IDA - IDR based id allocator, use when translation from id to 165 179 * pointer isn't necessary. 166 - * 167 - * IDA_BITMAP_LONGS is calculated to be one less to accommodate 168 - * ida_bitmap->nr_busy so that the whole struct fits in 128 bytes. 169 180 */ 170 181 #define IDA_CHUNK_SIZE 128 /* 128 bytes per chunk */ 171 - #define IDA_BITMAP_LONGS (IDA_CHUNK_SIZE / sizeof(long) - 1) 182 + #define IDA_BITMAP_LONGS (IDA_CHUNK_SIZE / sizeof(long)) 172 183 #define IDA_BITMAP_BITS (IDA_BITMAP_LONGS * sizeof(long) * 8) 173 184 174 185 struct ida_bitmap { 175 - long nr_busy; 176 186 unsigned long bitmap[IDA_BITMAP_LONGS]; 177 187 }; 178 188 189 + DECLARE_PER_CPU(struct ida_bitmap *, ida_bitmap); 190 + 179 191 struct ida { 180 - struct idr idr; 181 - struct ida_bitmap *free_bitmap; 192 + struct radix_tree_root ida_rt; 182 193 }; 183 194 184 - #define IDA_INIT(name) { .idr = IDR_INIT((name).idr), .free_bitmap = NULL, } 185 - #define DEFINE_IDA(name) struct ida name = IDA_INIT(name) 195 + #define IDA_INIT { \ 196 + .ida_rt = RADIX_TREE_INIT(IDR_RT_MARKER | GFP_NOWAIT), \ 197 + } 198 + #define DEFINE_IDA(name) struct ida name = IDA_INIT 186 199 187 200 int ida_pre_get(struct ida *ida, gfp_t gfp_mask); 188 201 int ida_get_new_above(struct ida *ida, int starting_id, int *p_id); 189 202 void ida_remove(struct ida *ida, int id); 190 203 void ida_destroy(struct ida *ida); 191 - void ida_init(struct ida *ida); 192 204 193 205 int ida_simple_get(struct ida *ida, unsigned int start, unsigned int end, 194 206 gfp_t gfp_mask); 195 207 void ida_simple_remove(struct ida *ida, unsigned int id); 208 + 209 + static inline void ida_init(struct ida *ida) 210 + { 211 + INIT_RADIX_TREE(&ida->ida_rt, IDR_RT_MARKER | GFP_NOWAIT); 212 + } 196 213 197 214 /** 198 215 * ida_get_new - allocate new ID ··· 209 220 return ida_get_new_above(ida, 0, p_id); 210 221 } 211 222 212 - static inline bool ida_is_empty(struct ida *ida) 223 + static inline bool ida_is_empty(const struct ida *ida) 213 224 { 214 - return idr_is_empty(&ida->idr); 225 + return radix_tree_empty(&ida->ida_rt); 215 226 } 216 - 217 - void __init idr_init_cache(void); 218 - 219 227 #endif /* __IDR_H__ */
+111 -66
include/linux/radix-tree.h
··· 22 22 #define _LINUX_RADIX_TREE_H 23 23 24 24 #include <linux/bitops.h> 25 - #include <linux/preempt.h> 26 - #include <linux/types.h> 27 25 #include <linux/bug.h> 28 26 #include <linux/kernel.h> 27 + #include <linux/list.h> 28 + #include <linux/preempt.h> 29 29 #include <linux/rcupdate.h> 30 + #include <linux/spinlock.h> 31 + #include <linux/types.h> 30 32 31 33 /* 32 34 * The bottom two bits of the slot determine how the remaining bits in the ··· 96 94 unsigned char count; /* Total entry count */ 97 95 unsigned char exceptional; /* Exceptional entry count */ 98 96 struct radix_tree_node *parent; /* Used when ascending tree */ 99 - void *private_data; /* For tree user */ 97 + struct radix_tree_root *root; /* The tree we belong to */ 100 98 union { 101 99 struct list_head private_list; /* For tree user */ 102 100 struct rcu_head rcu_head; /* Used when freeing node */ ··· 105 103 unsigned long tags[RADIX_TREE_MAX_TAGS][RADIX_TREE_TAG_LONGS]; 106 104 }; 107 105 108 - /* root tags are stored in gfp_mask, shifted by __GFP_BITS_SHIFT */ 106 + /* The top bits of gfp_mask are used to store the root tags and the IDR flag */ 107 + #define ROOT_IS_IDR ((__force gfp_t)(1 << __GFP_BITS_SHIFT)) 108 + #define ROOT_TAG_SHIFT (__GFP_BITS_SHIFT + 1) 109 + 109 110 struct radix_tree_root { 110 111 gfp_t gfp_mask; 111 112 struct radix_tree_node __rcu *rnode; ··· 128 123 (root)->rnode = NULL; \ 129 124 } while (0) 130 125 131 - static inline bool radix_tree_empty(struct radix_tree_root *root) 126 + static inline bool radix_tree_empty(const struct radix_tree_root *root) 132 127 { 133 128 return root->rnode == NULL; 134 129 } ··· 221 216 */ 222 217 223 218 /** 224 - * radix_tree_deref_slot - dereference a slot 225 - * @pslot: pointer to slot, returned by radix_tree_lookup_slot 226 - * Returns: item that was stored in that slot with any direct pointer flag 227 - * removed. 219 + * radix_tree_deref_slot - dereference a slot 220 + * @slot: slot pointer, returned by radix_tree_lookup_slot 228 221 * 229 222 * For use with radix_tree_lookup_slot(). Caller must hold tree at least read 230 223 * locked across slot lookup and dereference. Not required if write lock is ··· 230 227 * 231 228 * radix_tree_deref_retry must be used to confirm validity of the pointer if 232 229 * only the read lock is held. 230 + * 231 + * Return: entry stored in that slot. 233 232 */ 234 - static inline void *radix_tree_deref_slot(void **pslot) 233 + static inline void *radix_tree_deref_slot(void __rcu **slot) 235 234 { 236 - return rcu_dereference(*pslot); 235 + return rcu_dereference(*slot); 237 236 } 238 237 239 238 /** 240 - * radix_tree_deref_slot_protected - dereference a slot without RCU lock but with tree lock held 241 - * @pslot: pointer to slot, returned by radix_tree_lookup_slot 242 - * Returns: item that was stored in that slot with any direct pointer flag 243 - * removed. 239 + * radix_tree_deref_slot_protected - dereference a slot with tree lock held 240 + * @slot: slot pointer, returned by radix_tree_lookup_slot 244 241 * 245 - * Similar to radix_tree_deref_slot but only used during migration when a pages 246 - * mapping is being moved. The caller does not hold the RCU read lock but it 247 - * must hold the tree lock to prevent parallel updates. 242 + * Similar to radix_tree_deref_slot. The caller does not hold the RCU read 243 + * lock but it must hold the tree lock to prevent parallel updates. 244 + * 245 + * Return: entry stored in that slot. 248 246 */ 249 - static inline void *radix_tree_deref_slot_protected(void **pslot, 247 + static inline void *radix_tree_deref_slot_protected(void __rcu **slot, 250 248 spinlock_t *treelock) 251 249 { 252 - return rcu_dereference_protected(*pslot, lockdep_is_held(treelock)); 250 + return rcu_dereference_protected(*slot, lockdep_is_held(treelock)); 253 251 } 254 252 255 253 /** ··· 286 282 return unlikely((unsigned long)arg & RADIX_TREE_ENTRY_MASK); 287 283 } 288 284 289 - int __radix_tree_create(struct radix_tree_root *root, unsigned long index, 285 + int __radix_tree_create(struct radix_tree_root *, unsigned long index, 290 286 unsigned order, struct radix_tree_node **nodep, 291 - void ***slotp); 287 + void __rcu ***slotp); 292 288 int __radix_tree_insert(struct radix_tree_root *, unsigned long index, 293 289 unsigned order, void *); 294 290 static inline int radix_tree_insert(struct radix_tree_root *root, ··· 296 292 { 297 293 return __radix_tree_insert(root, index, 0, entry); 298 294 } 299 - void *__radix_tree_lookup(struct radix_tree_root *root, unsigned long index, 300 - struct radix_tree_node **nodep, void ***slotp); 301 - void *radix_tree_lookup(struct radix_tree_root *, unsigned long); 302 - void **radix_tree_lookup_slot(struct radix_tree_root *, unsigned long); 295 + void *__radix_tree_lookup(const struct radix_tree_root *, unsigned long index, 296 + struct radix_tree_node **nodep, void __rcu ***slotp); 297 + void *radix_tree_lookup(const struct radix_tree_root *, unsigned long); 298 + void __rcu **radix_tree_lookup_slot(const struct radix_tree_root *, 299 + unsigned long index); 303 300 typedef void (*radix_tree_update_node_t)(struct radix_tree_node *, void *); 304 - void __radix_tree_replace(struct radix_tree_root *root, 305 - struct radix_tree_node *node, 306 - void **slot, void *item, 301 + void __radix_tree_replace(struct radix_tree_root *, struct radix_tree_node *, 302 + void __rcu **slot, void *entry, 307 303 radix_tree_update_node_t update_node, void *private); 308 304 void radix_tree_iter_replace(struct radix_tree_root *, 309 - const struct radix_tree_iter *, void **slot, void *item); 310 - void radix_tree_replace_slot(struct radix_tree_root *root, 311 - void **slot, void *item); 312 - void __radix_tree_delete_node(struct radix_tree_root *root, 313 - struct radix_tree_node *node, 305 + const struct radix_tree_iter *, void __rcu **slot, void *entry); 306 + void radix_tree_replace_slot(struct radix_tree_root *, 307 + void __rcu **slot, void *entry); 308 + void __radix_tree_delete_node(struct radix_tree_root *, 309 + struct radix_tree_node *, 314 310 radix_tree_update_node_t update_node, 315 311 void *private); 312 + void radix_tree_iter_delete(struct radix_tree_root *, 313 + struct radix_tree_iter *iter, void __rcu **slot); 316 314 void *radix_tree_delete_item(struct radix_tree_root *, unsigned long, void *); 317 315 void *radix_tree_delete(struct radix_tree_root *, unsigned long); 318 - void radix_tree_clear_tags(struct radix_tree_root *root, 319 - struct radix_tree_node *node, 320 - void **slot); 321 - unsigned int radix_tree_gang_lookup(struct radix_tree_root *root, 316 + void radix_tree_clear_tags(struct radix_tree_root *, struct radix_tree_node *, 317 + void __rcu **slot); 318 + unsigned int radix_tree_gang_lookup(const struct radix_tree_root *, 322 319 void **results, unsigned long first_index, 323 320 unsigned int max_items); 324 - unsigned int radix_tree_gang_lookup_slot(struct radix_tree_root *root, 325 - void ***results, unsigned long *indices, 321 + unsigned int radix_tree_gang_lookup_slot(const struct radix_tree_root *, 322 + void __rcu ***results, unsigned long *indices, 326 323 unsigned long first_index, unsigned int max_items); 327 324 int radix_tree_preload(gfp_t gfp_mask); 328 325 int radix_tree_maybe_preload(gfp_t gfp_mask); 329 326 int radix_tree_maybe_preload_order(gfp_t gfp_mask, int order); 330 327 void radix_tree_init(void); 331 - void *radix_tree_tag_set(struct radix_tree_root *root, 328 + void *radix_tree_tag_set(struct radix_tree_root *, 332 329 unsigned long index, unsigned int tag); 333 - void *radix_tree_tag_clear(struct radix_tree_root *root, 330 + void *radix_tree_tag_clear(struct radix_tree_root *, 334 331 unsigned long index, unsigned int tag); 335 - int radix_tree_tag_get(struct radix_tree_root *root, 332 + int radix_tree_tag_get(const struct radix_tree_root *, 336 333 unsigned long index, unsigned int tag); 337 - void radix_tree_iter_tag_set(struct radix_tree_root *root, 334 + void radix_tree_iter_tag_set(struct radix_tree_root *, 338 335 const struct radix_tree_iter *iter, unsigned int tag); 339 - unsigned int 340 - radix_tree_gang_lookup_tag(struct radix_tree_root *root, void **results, 341 - unsigned long first_index, unsigned int max_items, 342 - unsigned int tag); 343 - unsigned int 344 - radix_tree_gang_lookup_tag_slot(struct radix_tree_root *root, void ***results, 345 - unsigned long first_index, unsigned int max_items, 346 - unsigned int tag); 347 - int radix_tree_tagged(struct radix_tree_root *root, unsigned int tag); 336 + void radix_tree_iter_tag_clear(struct radix_tree_root *, 337 + const struct radix_tree_iter *iter, unsigned int tag); 338 + unsigned int radix_tree_gang_lookup_tag(const struct radix_tree_root *, 339 + void **results, unsigned long first_index, 340 + unsigned int max_items, unsigned int tag); 341 + unsigned int radix_tree_gang_lookup_tag_slot(const struct radix_tree_root *, 342 + void __rcu ***results, unsigned long first_index, 343 + unsigned int max_items, unsigned int tag); 344 + int radix_tree_tagged(const struct radix_tree_root *, unsigned int tag); 348 345 349 346 static inline void radix_tree_preload_end(void) 350 347 { ··· 357 352 unsigned new_order); 358 353 int radix_tree_join(struct radix_tree_root *, unsigned long index, 359 354 unsigned new_order, void *); 355 + void __rcu **idr_get_free(struct radix_tree_root *, struct radix_tree_iter *, 356 + gfp_t, int end); 360 357 361 - #define RADIX_TREE_ITER_TAG_MASK 0x00FF /* tag index in lower byte */ 362 - #define RADIX_TREE_ITER_TAGGED 0x0100 /* lookup tagged slots */ 363 - #define RADIX_TREE_ITER_CONTIG 0x0200 /* stop at first hole */ 358 + enum { 359 + RADIX_TREE_ITER_TAG_MASK = 0x0f, /* tag index in lower nybble */ 360 + RADIX_TREE_ITER_TAGGED = 0x10, /* lookup tagged slots */ 361 + RADIX_TREE_ITER_CONTIG = 0x20, /* stop at first hole */ 362 + }; 364 363 365 364 /** 366 365 * radix_tree_iter_init - initialize radix tree iterator ··· 373 364 * @start: iteration starting index 374 365 * Returns: NULL 375 366 */ 376 - static __always_inline void ** 367 + static __always_inline void __rcu ** 377 368 radix_tree_iter_init(struct radix_tree_iter *iter, unsigned long start) 378 369 { 379 370 /* ··· 402 393 * Also it fills @iter with data about chunk: position in the tree (index), 403 394 * its end (next_index), and constructs a bit mask for tagged iterating (tags). 404 395 */ 405 - void **radix_tree_next_chunk(struct radix_tree_root *root, 396 + void __rcu **radix_tree_next_chunk(const struct radix_tree_root *, 406 397 struct radix_tree_iter *iter, unsigned flags); 398 + 399 + /** 400 + * radix_tree_iter_lookup - look up an index in the radix tree 401 + * @root: radix tree root 402 + * @iter: iterator state 403 + * @index: key to look up 404 + * 405 + * If @index is present in the radix tree, this function returns the slot 406 + * containing it and updates @iter to describe the entry. If @index is not 407 + * present, it returns NULL. 408 + */ 409 + static inline void __rcu ** 410 + radix_tree_iter_lookup(const struct radix_tree_root *root, 411 + struct radix_tree_iter *iter, unsigned long index) 412 + { 413 + radix_tree_iter_init(iter, index); 414 + return radix_tree_next_chunk(root, iter, RADIX_TREE_ITER_CONTIG); 415 + } 416 + 417 + /** 418 + * radix_tree_iter_find - find a present entry 419 + * @root: radix tree root 420 + * @iter: iterator state 421 + * @index: start location 422 + * 423 + * This function returns the slot containing the entry with the lowest index 424 + * which is at least @index. If @index is larger than any present entry, this 425 + * function returns NULL. The @iter is updated to describe the entry found. 426 + */ 427 + static inline void __rcu ** 428 + radix_tree_iter_find(const struct radix_tree_root *root, 429 + struct radix_tree_iter *iter, unsigned long index) 430 + { 431 + radix_tree_iter_init(iter, index); 432 + return radix_tree_next_chunk(root, iter, 0); 433 + } 407 434 408 435 /** 409 436 * radix_tree_iter_retry - retry this chunk of the iteration ··· 451 406 * and continue the iteration. 452 407 */ 453 408 static inline __must_check 454 - void **radix_tree_iter_retry(struct radix_tree_iter *iter) 409 + void __rcu **radix_tree_iter_retry(struct radix_tree_iter *iter) 455 410 { 456 411 iter->next_index = iter->index; 457 412 iter->tags = 0; ··· 474 429 * have been invalidated by an insertion or deletion. Call this function 475 430 * before releasing the lock to continue the iteration from the next index. 476 431 */ 477 - void **__must_check radix_tree_iter_resume(void **slot, 432 + void __rcu **__must_check radix_tree_iter_resume(void __rcu **slot, 478 433 struct radix_tree_iter *iter); 479 434 480 435 /** ··· 490 445 } 491 446 492 447 #ifdef CONFIG_RADIX_TREE_MULTIORDER 493 - void ** __radix_tree_next_slot(void **slot, struct radix_tree_iter *iter, 494 - unsigned flags); 448 + void __rcu **__radix_tree_next_slot(void __rcu **slot, 449 + struct radix_tree_iter *iter, unsigned flags); 495 450 #else 496 451 /* Can't happen without sibling entries, but the compiler can't tell that */ 497 - static inline void ** __radix_tree_next_slot(void **slot, 452 + static inline void __rcu **__radix_tree_next_slot(void __rcu **slot, 498 453 struct radix_tree_iter *iter, unsigned flags) 499 454 { 500 455 return slot; ··· 520 475 * b) we are doing non-tagged iteration, and iter->index and iter->next_index 521 476 * have been set up so that radix_tree_chunk_size() returns 1 or 0. 522 477 */ 523 - static __always_inline void ** 524 - radix_tree_next_slot(void **slot, struct radix_tree_iter *iter, unsigned flags) 478 + static __always_inline void __rcu **radix_tree_next_slot(void __rcu **slot, 479 + struct radix_tree_iter *iter, unsigned flags) 525 480 { 526 481 if (flags & RADIX_TREE_ITER_TAGGED) { 527 482 iter->tags >>= 1; ··· 559 514 return NULL; 560 515 561 516 found: 562 - if (unlikely(radix_tree_is_internal_node(*slot))) 517 + if (unlikely(radix_tree_is_internal_node(rcu_dereference_raw(*slot)))) 563 518 return __radix_tree_next_slot(slot, iter, flags); 564 519 return slot; 565 520 }
+1 -2
init/main.c
··· 554 554 if (WARN(!irqs_disabled(), 555 555 "Interrupts were enabled *very* early, fixing it\n")) 556 556 local_irq_disable(); 557 - idr_init_cache(); 557 + radix_tree_init(); 558 558 559 559 /* 560 560 * Allow workqueue creation and work item queueing/cancelling ··· 569 569 trace_init(); 570 570 571 571 context_tracking_init(); 572 - radix_tree_init(); 573 572 /* init some links before init_ISA_irqs() */ 574 573 early_irq_init(); 575 574 init_IRQ();
+3
lib/Makefile
··· 25 25 earlycpio.o seq_buf.o siphash.o \ 26 26 nmi_backtrace.o nodemask.o win_minmax.o 27 27 28 + CFLAGS_radix-tree.o += -DCONFIG_SPARSE_RCU_POINTER 29 + CFLAGS_idr.o += -DCONFIG_SPARSE_RCU_POINTER 30 + 28 31 lib-$(CONFIG_MMU) += ioremap.o 29 32 lib-$(CONFIG_SMP) += cpumask.o 30 33 lib-$(CONFIG_DMA_NOOP_OPS) += dma-noop.o
+332 -1006
lib/idr.c
··· 1 - /* 2 - * 2002-10-18 written by Jim Houston jim.houston@ccur.com 3 - * Copyright (C) 2002 by Concurrent Computer Corporation 4 - * Distributed under the GNU GPL license version 2. 5 - * 6 - * Modified by George Anzinger to reuse immediately and to use 7 - * find bit instructions. Also removed _irq on spinlocks. 8 - * 9 - * Modified by Nadia Derbey to make it RCU safe. 10 - * 11 - * Small id to pointer translation service. 12 - * 13 - * It uses a radix tree like structure as a sparse array indexed 14 - * by the id to obtain the pointer. The bitmap makes allocating 15 - * a new id quick. 16 - * 17 - * You call it to allocate an id (an int) an associate with that id a 18 - * pointer or what ever, we treat it as a (void *). You can pass this 19 - * id to a user for him to pass back at a later time. You then pass 20 - * that id to this code and it returns your pointer. 21 - */ 22 - 23 - #ifndef TEST // to test in user space... 24 - #include <linux/slab.h> 25 - #include <linux/init.h> 1 + #include <linux/bitmap.h> 26 2 #include <linux/export.h> 27 - #endif 28 - #include <linux/err.h> 29 - #include <linux/string.h> 30 3 #include <linux/idr.h> 4 + #include <linux/slab.h> 31 5 #include <linux/spinlock.h> 32 - #include <linux/percpu.h> 33 6 34 - #define MAX_IDR_SHIFT (sizeof(int) * 8 - 1) 35 - #define MAX_IDR_BIT (1U << MAX_IDR_SHIFT) 36 - 37 - /* Leave the possibility of an incomplete final layer */ 38 - #define MAX_IDR_LEVEL ((MAX_IDR_SHIFT + IDR_BITS - 1) / IDR_BITS) 39 - 40 - /* Number of id_layer structs to leave in free list */ 41 - #define MAX_IDR_FREE (MAX_IDR_LEVEL * 2) 42 - 43 - static struct kmem_cache *idr_layer_cache; 44 - static DEFINE_PER_CPU(struct idr_layer *, idr_preload_head); 45 - static DEFINE_PER_CPU(int, idr_preload_cnt); 7 + DEFINE_PER_CPU(struct ida_bitmap *, ida_bitmap); 46 8 static DEFINE_SPINLOCK(simple_ida_lock); 47 9 48 - /* the maximum ID which can be allocated given idr->layers */ 49 - static int idr_max(int layers) 50 - { 51 - int bits = min_t(int, layers * IDR_BITS, MAX_IDR_SHIFT); 52 - 53 - return (1 << bits) - 1; 54 - } 55 - 56 - /* 57 - * Prefix mask for an idr_layer at @layer. For layer 0, the prefix mask is 58 - * all bits except for the lower IDR_BITS. For layer 1, 2 * IDR_BITS, and 59 - * so on. 60 - */ 61 - static int idr_layer_prefix_mask(int layer) 62 - { 63 - return ~idr_max(layer + 1); 64 - } 65 - 66 - static struct idr_layer *get_from_free_list(struct idr *idp) 67 - { 68 - struct idr_layer *p; 69 - unsigned long flags; 70 - 71 - spin_lock_irqsave(&idp->lock, flags); 72 - if ((p = idp->id_free)) { 73 - idp->id_free = p->ary[0]; 74 - idp->id_free_cnt--; 75 - p->ary[0] = NULL; 76 - } 77 - spin_unlock_irqrestore(&idp->lock, flags); 78 - return(p); 79 - } 80 - 81 10 /** 82 - * idr_layer_alloc - allocate a new idr_layer 83 - * @gfp_mask: allocation mask 84 - * @layer_idr: optional idr to allocate from 85 - * 86 - * If @layer_idr is %NULL, directly allocate one using @gfp_mask or fetch 87 - * one from the per-cpu preload buffer. If @layer_idr is not %NULL, fetch 88 - * an idr_layer from @idr->id_free. 89 - * 90 - * @layer_idr is to maintain backward compatibility with the old alloc 91 - * interface - idr_pre_get() and idr_get_new*() - and will be removed 92 - * together with per-pool preload buffer. 93 - */ 94 - static struct idr_layer *idr_layer_alloc(gfp_t gfp_mask, struct idr *layer_idr) 95 - { 96 - struct idr_layer *new; 97 - 98 - /* this is the old path, bypass to get_from_free_list() */ 99 - if (layer_idr) 100 - return get_from_free_list(layer_idr); 101 - 102 - /* 103 - * Try to allocate directly from kmem_cache. We want to try this 104 - * before preload buffer; otherwise, non-preloading idr_alloc() 105 - * users will end up taking advantage of preloading ones. As the 106 - * following is allowed to fail for preloaded cases, suppress 107 - * warning this time. 108 - */ 109 - new = kmem_cache_zalloc(idr_layer_cache, gfp_mask | __GFP_NOWARN); 110 - if (new) 111 - return new; 112 - 113 - /* 114 - * Try to fetch one from the per-cpu preload buffer if in process 115 - * context. See idr_preload() for details. 116 - */ 117 - if (!in_interrupt()) { 118 - preempt_disable(); 119 - new = __this_cpu_read(idr_preload_head); 120 - if (new) { 121 - __this_cpu_write(idr_preload_head, new->ary[0]); 122 - __this_cpu_dec(idr_preload_cnt); 123 - new->ary[0] = NULL; 124 - } 125 - preempt_enable(); 126 - if (new) 127 - return new; 128 - } 129 - 130 - /* 131 - * Both failed. Try kmem_cache again w/o adding __GFP_NOWARN so 132 - * that memory allocation failure warning is printed as intended. 133 - */ 134 - return kmem_cache_zalloc(idr_layer_cache, gfp_mask); 135 - } 136 - 137 - static void idr_layer_rcu_free(struct rcu_head *head) 138 - { 139 - struct idr_layer *layer; 140 - 141 - layer = container_of(head, struct idr_layer, rcu_head); 142 - kmem_cache_free(idr_layer_cache, layer); 143 - } 144 - 145 - static inline void free_layer(struct idr *idr, struct idr_layer *p) 146 - { 147 - if (idr->hint == p) 148 - RCU_INIT_POINTER(idr->hint, NULL); 149 - call_rcu(&p->rcu_head, idr_layer_rcu_free); 150 - } 151 - 152 - /* only called when idp->lock is held */ 153 - static void __move_to_free_list(struct idr *idp, struct idr_layer *p) 154 - { 155 - p->ary[0] = idp->id_free; 156 - idp->id_free = p; 157 - idp->id_free_cnt++; 158 - } 159 - 160 - static void move_to_free_list(struct idr *idp, struct idr_layer *p) 161 - { 162 - unsigned long flags; 163 - 164 - /* 165 - * Depends on the return element being zeroed. 166 - */ 167 - spin_lock_irqsave(&idp->lock, flags); 168 - __move_to_free_list(idp, p); 169 - spin_unlock_irqrestore(&idp->lock, flags); 170 - } 171 - 172 - static void idr_mark_full(struct idr_layer **pa, int id) 173 - { 174 - struct idr_layer *p = pa[0]; 175 - int l = 0; 176 - 177 - __set_bit(id & IDR_MASK, p->bitmap); 178 - /* 179 - * If this layer is full mark the bit in the layer above to 180 - * show that this part of the radix tree is full. This may 181 - * complete the layer above and require walking up the radix 182 - * tree. 183 - */ 184 - while (bitmap_full(p->bitmap, IDR_SIZE)) { 185 - if (!(p = pa[++l])) 186 - break; 187 - id = id >> IDR_BITS; 188 - __set_bit((id & IDR_MASK), p->bitmap); 189 - } 190 - } 191 - 192 - static int __idr_pre_get(struct idr *idp, gfp_t gfp_mask) 193 - { 194 - while (idp->id_free_cnt < MAX_IDR_FREE) { 195 - struct idr_layer *new; 196 - new = kmem_cache_zalloc(idr_layer_cache, gfp_mask); 197 - if (new == NULL) 198 - return (0); 199 - move_to_free_list(idp, new); 200 - } 201 - return 1; 202 - } 203 - 204 - /** 205 - * sub_alloc - try to allocate an id without growing the tree depth 206 - * @idp: idr handle 207 - * @starting_id: id to start search at 208 - * @pa: idr_layer[MAX_IDR_LEVEL] used as backtrack buffer 209 - * @gfp_mask: allocation mask for idr_layer_alloc() 210 - * @layer_idr: optional idr passed to idr_layer_alloc() 211 - * 212 - * Allocate an id in range [@starting_id, INT_MAX] from @idp without 213 - * growing its depth. Returns 214 - * 215 - * the allocated id >= 0 if successful, 216 - * -EAGAIN if the tree needs to grow for allocation to succeed, 217 - * -ENOSPC if the id space is exhausted, 218 - * -ENOMEM if more idr_layers need to be allocated. 219 - */ 220 - static int sub_alloc(struct idr *idp, int *starting_id, struct idr_layer **pa, 221 - gfp_t gfp_mask, struct idr *layer_idr) 222 - { 223 - int n, m, sh; 224 - struct idr_layer *p, *new; 225 - int l, id, oid; 226 - 227 - id = *starting_id; 228 - restart: 229 - p = idp->top; 230 - l = idp->layers; 231 - pa[l--] = NULL; 232 - while (1) { 233 - /* 234 - * We run around this while until we reach the leaf node... 235 - */ 236 - n = (id >> (IDR_BITS*l)) & IDR_MASK; 237 - m = find_next_zero_bit(p->bitmap, IDR_SIZE, n); 238 - if (m == IDR_SIZE) { 239 - /* no space available go back to previous layer. */ 240 - l++; 241 - oid = id; 242 - id = (id | ((1 << (IDR_BITS * l)) - 1)) + 1; 243 - 244 - /* if already at the top layer, we need to grow */ 245 - if (id > idr_max(idp->layers)) { 246 - *starting_id = id; 247 - return -EAGAIN; 248 - } 249 - p = pa[l]; 250 - BUG_ON(!p); 251 - 252 - /* If we need to go up one layer, continue the 253 - * loop; otherwise, restart from the top. 254 - */ 255 - sh = IDR_BITS * (l + 1); 256 - if (oid >> sh == id >> sh) 257 - continue; 258 - else 259 - goto restart; 260 - } 261 - if (m != n) { 262 - sh = IDR_BITS*l; 263 - id = ((id >> sh) ^ n ^ m) << sh; 264 - } 265 - if ((id >= MAX_IDR_BIT) || (id < 0)) 266 - return -ENOSPC; 267 - if (l == 0) 268 - break; 269 - /* 270 - * Create the layer below if it is missing. 271 - */ 272 - if (!p->ary[m]) { 273 - new = idr_layer_alloc(gfp_mask, layer_idr); 274 - if (!new) 275 - return -ENOMEM; 276 - new->layer = l-1; 277 - new->prefix = id & idr_layer_prefix_mask(new->layer); 278 - rcu_assign_pointer(p->ary[m], new); 279 - p->count++; 280 - } 281 - pa[l--] = p; 282 - p = p->ary[m]; 283 - } 284 - 285 - pa[l] = p; 286 - return id; 287 - } 288 - 289 - static int idr_get_empty_slot(struct idr *idp, int starting_id, 290 - struct idr_layer **pa, gfp_t gfp_mask, 291 - struct idr *layer_idr) 292 - { 293 - struct idr_layer *p, *new; 294 - int layers, v, id; 295 - unsigned long flags; 296 - 297 - id = starting_id; 298 - build_up: 299 - p = idp->top; 300 - layers = idp->layers; 301 - if (unlikely(!p)) { 302 - if (!(p = idr_layer_alloc(gfp_mask, layer_idr))) 303 - return -ENOMEM; 304 - p->layer = 0; 305 - layers = 1; 306 - } 307 - /* 308 - * Add a new layer to the top of the tree if the requested 309 - * id is larger than the currently allocated space. 310 - */ 311 - while (id > idr_max(layers)) { 312 - layers++; 313 - if (!p->count) { 314 - /* special case: if the tree is currently empty, 315 - * then we grow the tree by moving the top node 316 - * upwards. 317 - */ 318 - p->layer++; 319 - WARN_ON_ONCE(p->prefix); 320 - continue; 321 - } 322 - if (!(new = idr_layer_alloc(gfp_mask, layer_idr))) { 323 - /* 324 - * The allocation failed. If we built part of 325 - * the structure tear it down. 326 - */ 327 - spin_lock_irqsave(&idp->lock, flags); 328 - for (new = p; p && p != idp->top; new = p) { 329 - p = p->ary[0]; 330 - new->ary[0] = NULL; 331 - new->count = 0; 332 - bitmap_clear(new->bitmap, 0, IDR_SIZE); 333 - __move_to_free_list(idp, new); 334 - } 335 - spin_unlock_irqrestore(&idp->lock, flags); 336 - return -ENOMEM; 337 - } 338 - new->ary[0] = p; 339 - new->count = 1; 340 - new->layer = layers-1; 341 - new->prefix = id & idr_layer_prefix_mask(new->layer); 342 - if (bitmap_full(p->bitmap, IDR_SIZE)) 343 - __set_bit(0, new->bitmap); 344 - p = new; 345 - } 346 - rcu_assign_pointer(idp->top, p); 347 - idp->layers = layers; 348 - v = sub_alloc(idp, &id, pa, gfp_mask, layer_idr); 349 - if (v == -EAGAIN) 350 - goto build_up; 351 - return(v); 352 - } 353 - 354 - /* 355 - * @id and @pa are from a successful allocation from idr_get_empty_slot(). 356 - * Install the user pointer @ptr and mark the slot full. 357 - */ 358 - static void idr_fill_slot(struct idr *idr, void *ptr, int id, 359 - struct idr_layer **pa) 360 - { 361 - /* update hint used for lookup, cleared from free_layer() */ 362 - rcu_assign_pointer(idr->hint, pa[0]); 363 - 364 - rcu_assign_pointer(pa[0]->ary[id & IDR_MASK], (struct idr_layer *)ptr); 365 - pa[0]->count++; 366 - idr_mark_full(pa, id); 367 - } 368 - 369 - 370 - /** 371 - * idr_preload - preload for idr_alloc() 372 - * @gfp_mask: allocation mask to use for preloading 373 - * 374 - * Preload per-cpu layer buffer for idr_alloc(). Can only be used from 375 - * process context and each idr_preload() invocation should be matched with 376 - * idr_preload_end(). Note that preemption is disabled while preloaded. 377 - * 378 - * The first idr_alloc() in the preloaded section can be treated as if it 379 - * were invoked with @gfp_mask used for preloading. This allows using more 380 - * permissive allocation masks for idrs protected by spinlocks. 381 - * 382 - * For example, if idr_alloc() below fails, the failure can be treated as 383 - * if idr_alloc() were called with GFP_KERNEL rather than GFP_NOWAIT. 384 - * 385 - * idr_preload(GFP_KERNEL); 386 - * spin_lock(lock); 387 - * 388 - * id = idr_alloc(idr, ptr, start, end, GFP_NOWAIT); 389 - * 390 - * spin_unlock(lock); 391 - * idr_preload_end(); 392 - * if (id < 0) 393 - * error; 394 - */ 395 - void idr_preload(gfp_t gfp_mask) 396 - { 397 - /* 398 - * Consuming preload buffer from non-process context breaks preload 399 - * allocation guarantee. Disallow usage from those contexts. 400 - */ 401 - WARN_ON_ONCE(in_interrupt()); 402 - might_sleep_if(gfpflags_allow_blocking(gfp_mask)); 403 - 404 - preempt_disable(); 405 - 406 - /* 407 - * idr_alloc() is likely to succeed w/o full idr_layer buffer and 408 - * return value from idr_alloc() needs to be checked for failure 409 - * anyway. Silently give up if allocation fails. The caller can 410 - * treat failures from idr_alloc() as if idr_alloc() were called 411 - * with @gfp_mask which should be enough. 412 - */ 413 - while (__this_cpu_read(idr_preload_cnt) < MAX_IDR_FREE) { 414 - struct idr_layer *new; 415 - 416 - preempt_enable(); 417 - new = kmem_cache_zalloc(idr_layer_cache, gfp_mask); 418 - preempt_disable(); 419 - if (!new) 420 - break; 421 - 422 - /* link the new one to per-cpu preload list */ 423 - new->ary[0] = __this_cpu_read(idr_preload_head); 424 - __this_cpu_write(idr_preload_head, new); 425 - __this_cpu_inc(idr_preload_cnt); 426 - } 427 - } 428 - EXPORT_SYMBOL(idr_preload); 429 - 430 - /** 431 - * idr_alloc - allocate new idr entry 432 - * @idr: the (initialized) idr 11 + * idr_alloc - allocate an id 12 + * @idr: idr handle 433 13 * @ptr: pointer to be associated with the new id 434 14 * @start: the minimum id (inclusive) 435 - * @end: the maximum id (exclusive, <= 0 for max) 436 - * @gfp_mask: memory allocation flags 15 + * @end: the maximum id (exclusive) 16 + * @gfp: memory allocation flags 437 17 * 438 - * Allocate an id in [start, end) and associate it with @ptr. If no ID is 439 - * available in the specified range, returns -ENOSPC. On memory allocation 440 - * failure, returns -ENOMEM. 18 + * Allocates an unused ID in the range [start, end). Returns -ENOSPC 19 + * if there are no unused IDs in that range. 441 20 * 442 21 * Note that @end is treated as max when <= 0. This is to always allow 443 22 * using @start + N as @end as long as N is inside integer range. 444 23 * 445 - * The user is responsible for exclusively synchronizing all operations 446 - * which may modify @idr. However, read-only accesses such as idr_find() 447 - * or iteration can be performed under RCU read lock provided the user 448 - * destroys @ptr in RCU-safe way after removal from idr. 24 + * Simultaneous modifications to the @idr are not allowed and should be 25 + * prevented by the user, usually with a lock. idr_alloc() may be called 26 + * concurrently with read-only accesses to the @idr, such as idr_find() and 27 + * idr_for_each_entry(). 449 28 */ 450 - int idr_alloc(struct idr *idr, void *ptr, int start, int end, gfp_t gfp_mask) 29 + int idr_alloc(struct idr *idr, void *ptr, int start, int end, gfp_t gfp) 451 30 { 452 - int max = end > 0 ? end - 1 : INT_MAX; /* inclusive upper limit */ 453 - struct idr_layer *pa[MAX_IDR_LEVEL + 1]; 454 - int id; 31 + void __rcu **slot; 32 + struct radix_tree_iter iter; 455 33 456 - might_sleep_if(gfpflags_allow_blocking(gfp_mask)); 457 - 458 - /* sanity checks */ 459 34 if (WARN_ON_ONCE(start < 0)) 460 35 return -EINVAL; 461 - if (unlikely(max < start)) 462 - return -ENOSPC; 36 + if (WARN_ON_ONCE(radix_tree_is_internal_node(ptr))) 37 + return -EINVAL; 463 38 464 - /* allocate id */ 465 - id = idr_get_empty_slot(idr, start, pa, gfp_mask, NULL); 466 - if (unlikely(id < 0)) 467 - return id; 468 - if (unlikely(id > max)) 469 - return -ENOSPC; 39 + radix_tree_iter_init(&iter, start); 40 + slot = idr_get_free(&idr->idr_rt, &iter, gfp, end); 41 + if (IS_ERR(slot)) 42 + return PTR_ERR(slot); 470 43 471 - idr_fill_slot(idr, ptr, id, pa); 472 - return id; 44 + radix_tree_iter_replace(&idr->idr_rt, &iter, slot, ptr); 45 + radix_tree_iter_tag_clear(&idr->idr_rt, &iter, IDR_FREE); 46 + return iter.index; 473 47 } 474 48 EXPORT_SYMBOL_GPL(idr_alloc); 475 49 476 50 /** 477 51 * idr_alloc_cyclic - allocate new idr entry in a cyclical fashion 478 - * @idr: the (initialized) idr 52 + * @idr: idr handle 479 53 * @ptr: pointer to be associated with the new id 480 54 * @start: the minimum id (inclusive) 481 - * @end: the maximum id (exclusive, <= 0 for max) 482 - * @gfp_mask: memory allocation flags 55 + * @end: the maximum id (exclusive) 56 + * @gfp: memory allocation flags 483 57 * 484 - * Essentially the same as idr_alloc, but prefers to allocate progressively 485 - * higher ids if it can. If the "cur" counter wraps, then it will start again 486 - * at the "start" end of the range and allocate one that has already been used. 58 + * Allocates an ID larger than the last ID allocated if one is available. 59 + * If not, it will attempt to allocate the smallest ID that is larger or 60 + * equal to @start. 487 61 */ 488 - int idr_alloc_cyclic(struct idr *idr, void *ptr, int start, int end, 489 - gfp_t gfp_mask) 62 + int idr_alloc_cyclic(struct idr *idr, void *ptr, int start, int end, gfp_t gfp) 490 63 { 491 - int id; 64 + int id, curr = idr->idr_next; 492 65 493 - id = idr_alloc(idr, ptr, max(start, idr->cur), end, gfp_mask); 494 - if (id == -ENOSPC) 495 - id = idr_alloc(idr, ptr, start, end, gfp_mask); 66 + if (curr < start) 67 + curr = start; 496 68 497 - if (likely(id >= 0)) 498 - idr->cur = id + 1; 69 + id = idr_alloc(idr, ptr, curr, end, gfp); 70 + if ((id == -ENOSPC) && (curr > start)) 71 + id = idr_alloc(idr, ptr, start, curr, gfp); 72 + 73 + if (id >= 0) 74 + idr->idr_next = id + 1U; 75 + 499 76 return id; 500 77 } 501 78 EXPORT_SYMBOL(idr_alloc_cyclic); 502 79 503 - static void idr_remove_warning(int id) 504 - { 505 - WARN(1, "idr_remove called for id=%d which is not allocated.\n", id); 506 - } 507 - 508 - static void sub_remove(struct idr *idp, int shift, int id) 509 - { 510 - struct idr_layer *p = idp->top; 511 - struct idr_layer **pa[MAX_IDR_LEVEL + 1]; 512 - struct idr_layer ***paa = &pa[0]; 513 - struct idr_layer *to_free; 514 - int n; 515 - 516 - *paa = NULL; 517 - *++paa = &idp->top; 518 - 519 - while ((shift > 0) && p) { 520 - n = (id >> shift) & IDR_MASK; 521 - __clear_bit(n, p->bitmap); 522 - *++paa = &p->ary[n]; 523 - p = p->ary[n]; 524 - shift -= IDR_BITS; 525 - } 526 - n = id & IDR_MASK; 527 - if (likely(p != NULL && test_bit(n, p->bitmap))) { 528 - __clear_bit(n, p->bitmap); 529 - RCU_INIT_POINTER(p->ary[n], NULL); 530 - to_free = NULL; 531 - while(*paa && ! --((**paa)->count)){ 532 - if (to_free) 533 - free_layer(idp, to_free); 534 - to_free = **paa; 535 - **paa-- = NULL; 536 - } 537 - if (!*paa) 538 - idp->layers = 0; 539 - if (to_free) 540 - free_layer(idp, to_free); 541 - } else 542 - idr_remove_warning(id); 543 - } 544 - 545 - /** 546 - * idr_remove - remove the given id and free its slot 547 - * @idp: idr handle 548 - * @id: unique key 549 - */ 550 - void idr_remove(struct idr *idp, int id) 551 - { 552 - struct idr_layer *p; 553 - struct idr_layer *to_free; 554 - 555 - if (id < 0) 556 - return; 557 - 558 - if (id > idr_max(idp->layers)) { 559 - idr_remove_warning(id); 560 - return; 561 - } 562 - 563 - sub_remove(idp, (idp->layers - 1) * IDR_BITS, id); 564 - if (idp->top && idp->top->count == 1 && (idp->layers > 1) && 565 - idp->top->ary[0]) { 566 - /* 567 - * Single child at leftmost slot: we can shrink the tree. 568 - * This level is not needed anymore since when layers are 569 - * inserted, they are inserted at the top of the existing 570 - * tree. 571 - */ 572 - to_free = idp->top; 573 - p = idp->top->ary[0]; 574 - rcu_assign_pointer(idp->top, p); 575 - --idp->layers; 576 - to_free->count = 0; 577 - bitmap_clear(to_free->bitmap, 0, IDR_SIZE); 578 - free_layer(idp, to_free); 579 - } 580 - } 581 - EXPORT_SYMBOL(idr_remove); 582 - 583 - static void __idr_remove_all(struct idr *idp) 584 - { 585 - int n, id, max; 586 - int bt_mask; 587 - struct idr_layer *p; 588 - struct idr_layer *pa[MAX_IDR_LEVEL + 1]; 589 - struct idr_layer **paa = &pa[0]; 590 - 591 - n = idp->layers * IDR_BITS; 592 - *paa = idp->top; 593 - RCU_INIT_POINTER(idp->top, NULL); 594 - max = idr_max(idp->layers); 595 - 596 - id = 0; 597 - while (id >= 0 && id <= max) { 598 - p = *paa; 599 - while (n > IDR_BITS && p) { 600 - n -= IDR_BITS; 601 - p = p->ary[(id >> n) & IDR_MASK]; 602 - *++paa = p; 603 - } 604 - 605 - bt_mask = id; 606 - id += 1 << n; 607 - /* Get the highest bit that the above add changed from 0->1. */ 608 - while (n < fls(id ^ bt_mask)) { 609 - if (*paa) 610 - free_layer(idp, *paa); 611 - n += IDR_BITS; 612 - --paa; 613 - } 614 - } 615 - idp->layers = 0; 616 - } 617 - 618 - /** 619 - * idr_destroy - release all cached layers within an idr tree 620 - * @idp: idr handle 621 - * 622 - * Free all id mappings and all idp_layers. After this function, @idp is 623 - * completely unused and can be freed / recycled. The caller is 624 - * responsible for ensuring that no one else accesses @idp during or after 625 - * idr_destroy(). 626 - * 627 - * A typical clean-up sequence for objects stored in an idr tree will use 628 - * idr_for_each() to free all objects, if necessary, then idr_destroy() to 629 - * free up the id mappings and cached idr_layers. 630 - */ 631 - void idr_destroy(struct idr *idp) 632 - { 633 - __idr_remove_all(idp); 634 - 635 - while (idp->id_free_cnt) { 636 - struct idr_layer *p = get_from_free_list(idp); 637 - kmem_cache_free(idr_layer_cache, p); 638 - } 639 - } 640 - EXPORT_SYMBOL(idr_destroy); 641 - 642 - void *idr_find_slowpath(struct idr *idp, int id) 643 - { 644 - int n; 645 - struct idr_layer *p; 646 - 647 - if (id < 0) 648 - return NULL; 649 - 650 - p = rcu_dereference_raw(idp->top); 651 - if (!p) 652 - return NULL; 653 - n = (p->layer+1) * IDR_BITS; 654 - 655 - if (id > idr_max(p->layer + 1)) 656 - return NULL; 657 - BUG_ON(n == 0); 658 - 659 - while (n > 0 && p) { 660 - n -= IDR_BITS; 661 - BUG_ON(n != p->layer*IDR_BITS); 662 - p = rcu_dereference_raw(p->ary[(id >> n) & IDR_MASK]); 663 - } 664 - return((void *)p); 665 - } 666 - EXPORT_SYMBOL(idr_find_slowpath); 667 - 668 80 /** 669 81 * idr_for_each - iterate through all stored pointers 670 - * @idp: idr handle 82 + * @idr: idr handle 671 83 * @fn: function to be called for each pointer 672 - * @data: data passed back to callback function 84 + * @data: data passed to callback function 673 85 * 674 - * Iterate over the pointers registered with the given idr. The 675 - * callback function will be called for each pointer currently 676 - * registered, passing the id, the pointer and the data pointer passed 677 - * to this function. It is not safe to modify the idr tree while in 678 - * the callback, so functions such as idr_get_new and idr_remove are 679 - * not allowed. 86 + * The callback function will be called for each entry in @idr, passing 87 + * the id, the pointer and the data pointer passed to this function. 680 88 * 681 - * We check the return of @fn each time. If it returns anything other 682 - * than %0, we break out and return that value. 89 + * If @fn returns anything other than %0, the iteration stops and that 90 + * value is returned from this function. 683 91 * 684 - * The caller must serialize idr_for_each() vs idr_get_new() and idr_remove(). 92 + * idr_for_each() can be called concurrently with idr_alloc() and 93 + * idr_remove() if protected by RCU. Newly added entries may not be 94 + * seen and deleted entries may be seen, but adding and removing entries 95 + * will not cause other entries to be skipped, nor spurious ones to be seen. 685 96 */ 686 - int idr_for_each(struct idr *idp, 687 - int (*fn)(int id, void *p, void *data), void *data) 97 + int idr_for_each(const struct idr *idr, 98 + int (*fn)(int id, void *p, void *data), void *data) 688 99 { 689 - int n, id, max, error = 0; 690 - struct idr_layer *p; 691 - struct idr_layer *pa[MAX_IDR_LEVEL + 1]; 692 - struct idr_layer **paa = &pa[0]; 100 + struct radix_tree_iter iter; 101 + void __rcu **slot; 693 102 694 - n = idp->layers * IDR_BITS; 695 - *paa = rcu_dereference_raw(idp->top); 696 - max = idr_max(idp->layers); 697 - 698 - id = 0; 699 - while (id >= 0 && id <= max) { 700 - p = *paa; 701 - while (n > 0 && p) { 702 - n -= IDR_BITS; 703 - p = rcu_dereference_raw(p->ary[(id >> n) & IDR_MASK]); 704 - *++paa = p; 705 - } 706 - 707 - if (p) { 708 - error = fn(id, (void *)p, data); 709 - if (error) 710 - break; 711 - } 712 - 713 - id += 1 << n; 714 - while (n < fls(id)) { 715 - n += IDR_BITS; 716 - --paa; 717 - } 718 - } 719 - 720 - return error; 721 - } 722 - EXPORT_SYMBOL(idr_for_each); 723 - 724 - /** 725 - * idr_get_next - lookup next object of id to given id. 726 - * @idp: idr handle 727 - * @nextidp: pointer to lookup key 728 - * 729 - * Returns pointer to registered object with id, which is next number to 730 - * given id. After being looked up, *@nextidp will be updated for the next 731 - * iteration. 732 - * 733 - * This function can be called under rcu_read_lock(), given that the leaf 734 - * pointers lifetimes are correctly managed. 735 - */ 736 - void *idr_get_next(struct idr *idp, int *nextidp) 737 - { 738 - struct idr_layer *p, *pa[MAX_IDR_LEVEL + 1]; 739 - struct idr_layer **paa = &pa[0]; 740 - int id = *nextidp; 741 - int n, max; 742 - 743 - /* find first ent */ 744 - p = *paa = rcu_dereference_raw(idp->top); 745 - if (!p) 746 - return NULL; 747 - n = (p->layer + 1) * IDR_BITS; 748 - max = idr_max(p->layer + 1); 749 - 750 - while (id >= 0 && id <= max) { 751 - p = *paa; 752 - while (n > 0 && p) { 753 - n -= IDR_BITS; 754 - p = rcu_dereference_raw(p->ary[(id >> n) & IDR_MASK]); 755 - *++paa = p; 756 - } 757 - 758 - if (p) { 759 - *nextidp = id; 760 - return p; 761 - } 762 - 763 - /* 764 - * Proceed to the next layer at the current level. Unlike 765 - * idr_for_each(), @id isn't guaranteed to be aligned to 766 - * layer boundary at this point and adding 1 << n may 767 - * incorrectly skip IDs. Make sure we jump to the 768 - * beginning of the next layer using round_up(). 769 - */ 770 - id = round_up(id + 1, 1 << n); 771 - while (n < fls(id)) { 772 - n += IDR_BITS; 773 - --paa; 774 - } 775 - } 776 - return NULL; 777 - } 778 - EXPORT_SYMBOL(idr_get_next); 779 - 780 - 781 - /** 782 - * idr_replace - replace pointer for given id 783 - * @idp: idr handle 784 - * @ptr: pointer you want associated with the id 785 - * @id: lookup key 786 - * 787 - * Replace the pointer registered with an id and return the old value. 788 - * A %-ENOENT return indicates that @id was not found. 789 - * A %-EINVAL return indicates that @id was not within valid constraints. 790 - * 791 - * The caller must serialize with writers. 792 - */ 793 - void *idr_replace(struct idr *idp, void *ptr, int id) 794 - { 795 - int n; 796 - struct idr_layer *p, *old_p; 797 - 798 - if (id < 0) 799 - return ERR_PTR(-EINVAL); 800 - 801 - p = idp->top; 802 - if (!p) 803 - return ERR_PTR(-ENOENT); 804 - 805 - if (id > idr_max(p->layer + 1)) 806 - return ERR_PTR(-ENOENT); 807 - 808 - n = p->layer * IDR_BITS; 809 - while ((n > 0) && p) { 810 - p = p->ary[(id >> n) & IDR_MASK]; 811 - n -= IDR_BITS; 812 - } 813 - 814 - n = id & IDR_MASK; 815 - if (unlikely(p == NULL || !test_bit(n, p->bitmap))) 816 - return ERR_PTR(-ENOENT); 817 - 818 - old_p = p->ary[n]; 819 - rcu_assign_pointer(p->ary[n], ptr); 820 - 821 - return old_p; 822 - } 823 - EXPORT_SYMBOL(idr_replace); 824 - 825 - void __init idr_init_cache(void) 826 - { 827 - idr_layer_cache = kmem_cache_create("idr_layer_cache", 828 - sizeof(struct idr_layer), 0, SLAB_PANIC, NULL); 829 - } 830 - 831 - /** 832 - * idr_init - initialize idr handle 833 - * @idp: idr handle 834 - * 835 - * This function is use to set up the handle (@idp) that you will pass 836 - * to the rest of the functions. 837 - */ 838 - void idr_init(struct idr *idp) 839 - { 840 - memset(idp, 0, sizeof(struct idr)); 841 - spin_lock_init(&idp->lock); 842 - } 843 - EXPORT_SYMBOL(idr_init); 844 - 845 - static int idr_has_entry(int id, void *p, void *data) 846 - { 847 - return 1; 848 - } 849 - 850 - bool idr_is_empty(struct idr *idp) 851 - { 852 - return !idr_for_each(idp, idr_has_entry, NULL); 853 - } 854 - EXPORT_SYMBOL(idr_is_empty); 855 - 856 - /** 857 - * DOC: IDA description 858 - * IDA - IDR based ID allocator 859 - * 860 - * This is id allocator without id -> pointer translation. Memory 861 - * usage is much lower than full blown idr because each id only 862 - * occupies a bit. ida uses a custom leaf node which contains 863 - * IDA_BITMAP_BITS slots. 864 - * 865 - * 2007-04-25 written by Tejun Heo <htejun@gmail.com> 866 - */ 867 - 868 - static void free_bitmap(struct ida *ida, struct ida_bitmap *bitmap) 869 - { 870 - unsigned long flags; 871 - 872 - if (!ida->free_bitmap) { 873 - spin_lock_irqsave(&ida->idr.lock, flags); 874 - if (!ida->free_bitmap) { 875 - ida->free_bitmap = bitmap; 876 - bitmap = NULL; 877 - } 878 - spin_unlock_irqrestore(&ida->idr.lock, flags); 879 - } 880 - 881 - kfree(bitmap); 882 - } 883 - 884 - /** 885 - * ida_pre_get - reserve resources for ida allocation 886 - * @ida: ida handle 887 - * @gfp_mask: memory allocation flag 888 - * 889 - * This function should be called prior to locking and calling the 890 - * following function. It preallocates enough memory to satisfy the 891 - * worst possible allocation. 892 - * 893 - * If the system is REALLY out of memory this function returns %0, 894 - * otherwise %1. 895 - */ 896 - int ida_pre_get(struct ida *ida, gfp_t gfp_mask) 897 - { 898 - /* allocate idr_layers */ 899 - if (!__idr_pre_get(&ida->idr, gfp_mask)) 900 - return 0; 901 - 902 - /* allocate free_bitmap */ 903 - if (!ida->free_bitmap) { 904 - struct ida_bitmap *bitmap; 905 - 906 - bitmap = kmalloc(sizeof(struct ida_bitmap), gfp_mask); 907 - if (!bitmap) 908 - return 0; 909 - 910 - free_bitmap(ida, bitmap); 911 - } 912 - 913 - return 1; 914 - } 915 - EXPORT_SYMBOL(ida_pre_get); 916 - 917 - /** 918 - * ida_get_new_above - allocate new ID above or equal to a start id 919 - * @ida: ida handle 920 - * @starting_id: id to start search at 921 - * @p_id: pointer to the allocated handle 922 - * 923 - * Allocate new ID above or equal to @starting_id. It should be called 924 - * with any required locks. 925 - * 926 - * If memory is required, it will return %-EAGAIN, you should unlock 927 - * and go back to the ida_pre_get() call. If the ida is full, it will 928 - * return %-ENOSPC. 929 - * 930 - * Note that callers must ensure that concurrent access to @ida is not possible. 931 - * See ida_simple_get() for a varaint which takes care of locking. 932 - * 933 - * @p_id returns a value in the range @starting_id ... %0x7fffffff. 934 - */ 935 - int ida_get_new_above(struct ida *ida, int starting_id, int *p_id) 936 - { 937 - struct idr_layer *pa[MAX_IDR_LEVEL + 1]; 938 - struct ida_bitmap *bitmap; 939 - unsigned long flags; 940 - int idr_id = starting_id / IDA_BITMAP_BITS; 941 - int offset = starting_id % IDA_BITMAP_BITS; 942 - int t, id; 943 - 944 - restart: 945 - /* get vacant slot */ 946 - t = idr_get_empty_slot(&ida->idr, idr_id, pa, 0, &ida->idr); 947 - if (t < 0) 948 - return t == -ENOMEM ? -EAGAIN : t; 949 - 950 - if (t * IDA_BITMAP_BITS >= MAX_IDR_BIT) 951 - return -ENOSPC; 952 - 953 - if (t != idr_id) 954 - offset = 0; 955 - idr_id = t; 956 - 957 - /* if bitmap isn't there, create a new one */ 958 - bitmap = (void *)pa[0]->ary[idr_id & IDR_MASK]; 959 - if (!bitmap) { 960 - spin_lock_irqsave(&ida->idr.lock, flags); 961 - bitmap = ida->free_bitmap; 962 - ida->free_bitmap = NULL; 963 - spin_unlock_irqrestore(&ida->idr.lock, flags); 964 - 965 - if (!bitmap) 966 - return -EAGAIN; 967 - 968 - memset(bitmap, 0, sizeof(struct ida_bitmap)); 969 - rcu_assign_pointer(pa[0]->ary[idr_id & IDR_MASK], 970 - (void *)bitmap); 971 - pa[0]->count++; 972 - } 973 - 974 - /* lookup for empty slot */ 975 - t = find_next_zero_bit(bitmap->bitmap, IDA_BITMAP_BITS, offset); 976 - if (t == IDA_BITMAP_BITS) { 977 - /* no empty slot after offset, continue to the next chunk */ 978 - idr_id++; 979 - offset = 0; 980 - goto restart; 981 - } 982 - 983 - id = idr_id * IDA_BITMAP_BITS + t; 984 - if (id >= MAX_IDR_BIT) 985 - return -ENOSPC; 986 - 987 - __set_bit(t, bitmap->bitmap); 988 - if (++bitmap->nr_busy == IDA_BITMAP_BITS) 989 - idr_mark_full(pa, idr_id); 990 - 991 - *p_id = id; 992 - 993 - /* Each leaf node can handle nearly a thousand slots and the 994 - * whole idea of ida is to have small memory foot print. 995 - * Throw away extra resources one by one after each successful 996 - * allocation. 997 - */ 998 - if (ida->idr.id_free_cnt || ida->free_bitmap) { 999 - struct idr_layer *p = get_from_free_list(&ida->idr); 1000 - if (p) 1001 - kmem_cache_free(idr_layer_cache, p); 103 + radix_tree_for_each_slot(slot, &idr->idr_rt, &iter, 0) { 104 + int ret = fn(iter.index, rcu_dereference_raw(*slot), data); 105 + if (ret) 106 + return ret; 1002 107 } 1003 108 1004 109 return 0; 1005 110 } 111 + EXPORT_SYMBOL(idr_for_each); 112 + 113 + /** 114 + * idr_get_next - Find next populated entry 115 + * @idr: idr handle 116 + * @nextid: Pointer to lowest possible ID to return 117 + * 118 + * Returns the next populated entry in the tree with an ID greater than 119 + * or equal to the value pointed to by @nextid. On exit, @nextid is updated 120 + * to the ID of the found value. To use in a loop, the value pointed to by 121 + * nextid must be incremented by the user. 122 + */ 123 + void *idr_get_next(struct idr *idr, int *nextid) 124 + { 125 + struct radix_tree_iter iter; 126 + void __rcu **slot; 127 + 128 + slot = radix_tree_iter_find(&idr->idr_rt, &iter, *nextid); 129 + if (!slot) 130 + return NULL; 131 + 132 + *nextid = iter.index; 133 + return rcu_dereference_raw(*slot); 134 + } 135 + EXPORT_SYMBOL(idr_get_next); 136 + 137 + /** 138 + * idr_replace - replace pointer for given id 139 + * @idr: idr handle 140 + * @ptr: New pointer to associate with the ID 141 + * @id: Lookup key 142 + * 143 + * Replace the pointer registered with an ID and return the old value. 144 + * This function can be called under the RCU read lock concurrently with 145 + * idr_alloc() and idr_remove() (as long as the ID being removed is not 146 + * the one being replaced!). 147 + * 148 + * Returns: 0 on success. %-ENOENT indicates that @id was not found. 149 + * %-EINVAL indicates that @id or @ptr were not valid. 150 + */ 151 + void *idr_replace(struct idr *idr, void *ptr, int id) 152 + { 153 + struct radix_tree_node *node; 154 + void __rcu **slot = NULL; 155 + void *entry; 156 + 157 + if (WARN_ON_ONCE(id < 0)) 158 + return ERR_PTR(-EINVAL); 159 + if (WARN_ON_ONCE(radix_tree_is_internal_node(ptr))) 160 + return ERR_PTR(-EINVAL); 161 + 162 + entry = __radix_tree_lookup(&idr->idr_rt, id, &node, &slot); 163 + if (!slot || radix_tree_tag_get(&idr->idr_rt, id, IDR_FREE)) 164 + return ERR_PTR(-ENOENT); 165 + 166 + __radix_tree_replace(&idr->idr_rt, node, slot, ptr, NULL, NULL); 167 + 168 + return entry; 169 + } 170 + EXPORT_SYMBOL(idr_replace); 171 + 172 + /** 173 + * DOC: IDA description 174 + * 175 + * The IDA is an ID allocator which does not provide the ability to 176 + * associate an ID with a pointer. As such, it only needs to store one 177 + * bit per ID, and so is more space efficient than an IDR. To use an IDA, 178 + * define it using DEFINE_IDA() (or embed a &struct ida in a data structure, 179 + * then initialise it using ida_init()). To allocate a new ID, call 180 + * ida_simple_get(). To free an ID, call ida_simple_remove(). 181 + * 182 + * If you have more complex locking requirements, use a loop around 183 + * ida_pre_get() and ida_get_new() to allocate a new ID. Then use 184 + * ida_remove() to free an ID. You must make sure that ida_get_new() and 185 + * ida_remove() cannot be called at the same time as each other for the 186 + * same IDA. 187 + * 188 + * You can also use ida_get_new_above() if you need an ID to be allocated 189 + * above a particular number. ida_destroy() can be used to dispose of an 190 + * IDA without needing to free the individual IDs in it. You can use 191 + * ida_is_empty() to find out whether the IDA has any IDs currently allocated. 192 + * 193 + * IDs are currently limited to the range [0-INT_MAX]. If this is an awkward 194 + * limitation, it should be quite straightforward to raise the maximum. 195 + */ 196 + 197 + /* 198 + * Developer's notes: 199 + * 200 + * The IDA uses the functionality provided by the IDR & radix tree to store 201 + * bitmaps in each entry. The IDR_FREE tag means there is at least one bit 202 + * free, unlike the IDR where it means at least one entry is free. 203 + * 204 + * I considered telling the radix tree that each slot is an order-10 node 205 + * and storing the bit numbers in the radix tree, but the radix tree can't 206 + * allow a single multiorder entry at index 0, which would significantly 207 + * increase memory consumption for the IDA. So instead we divide the index 208 + * by the number of bits in the leaf bitmap before doing a radix tree lookup. 209 + * 210 + * As an optimisation, if there are only a few low bits set in any given 211 + * leaf, instead of allocating a 128-byte bitmap, we use the 'exceptional 212 + * entry' functionality of the radix tree to store BITS_PER_LONG - 2 bits 213 + * directly in the entry. By being really tricksy, we could store 214 + * BITS_PER_LONG - 1 bits, but there're diminishing returns after optimising 215 + * for 0-3 allocated IDs. 216 + * 217 + * We allow the radix tree 'exceptional' count to get out of date. Nothing 218 + * in the IDA nor the radix tree code checks it. If it becomes important 219 + * to maintain an accurate exceptional count, switch the rcu_assign_pointer() 220 + * calls to radix_tree_iter_replace() which will correct the exceptional 221 + * count. 222 + * 223 + * The IDA always requires a lock to alloc/free. If we add a 'test_bit' 224 + * equivalent, it will still need locking. Going to RCU lookup would require 225 + * using RCU to free bitmaps, and that's not trivial without embedding an 226 + * RCU head in the bitmap, which adds a 2-pointer overhead to each 128-byte 227 + * bitmap, which is excessive. 228 + */ 229 + 230 + #define IDA_MAX (0x80000000U / IDA_BITMAP_BITS) 231 + 232 + /** 233 + * ida_get_new_above - allocate new ID above or equal to a start id 234 + * @ida: ida handle 235 + * @start: id to start search at 236 + * @id: pointer to the allocated handle 237 + * 238 + * Allocate new ID above or equal to @start. It should be called 239 + * with any required locks to ensure that concurrent calls to 240 + * ida_get_new_above() / ida_get_new() / ida_remove() are not allowed. 241 + * Consider using ida_simple_get() if you do not have complex locking 242 + * requirements. 243 + * 244 + * If memory is required, it will return %-EAGAIN, you should unlock 245 + * and go back to the ida_pre_get() call. If the ida is full, it will 246 + * return %-ENOSPC. On success, it will return 0. 247 + * 248 + * @id returns a value in the range @start ... %0x7fffffff. 249 + */ 250 + int ida_get_new_above(struct ida *ida, int start, int *id) 251 + { 252 + struct radix_tree_root *root = &ida->ida_rt; 253 + void __rcu **slot; 254 + struct radix_tree_iter iter; 255 + struct ida_bitmap *bitmap; 256 + unsigned long index; 257 + unsigned bit, ebit; 258 + int new; 259 + 260 + index = start / IDA_BITMAP_BITS; 261 + bit = start % IDA_BITMAP_BITS; 262 + ebit = bit + RADIX_TREE_EXCEPTIONAL_SHIFT; 263 + 264 + slot = radix_tree_iter_init(&iter, index); 265 + for (;;) { 266 + if (slot) 267 + slot = radix_tree_next_slot(slot, &iter, 268 + RADIX_TREE_ITER_TAGGED); 269 + if (!slot) { 270 + slot = idr_get_free(root, &iter, GFP_NOWAIT, IDA_MAX); 271 + if (IS_ERR(slot)) { 272 + if (slot == ERR_PTR(-ENOMEM)) 273 + return -EAGAIN; 274 + return PTR_ERR(slot); 275 + } 276 + } 277 + if (iter.index > index) { 278 + bit = 0; 279 + ebit = RADIX_TREE_EXCEPTIONAL_SHIFT; 280 + } 281 + new = iter.index * IDA_BITMAP_BITS; 282 + bitmap = rcu_dereference_raw(*slot); 283 + if (radix_tree_exception(bitmap)) { 284 + unsigned long tmp = (unsigned long)bitmap; 285 + ebit = find_next_zero_bit(&tmp, BITS_PER_LONG, ebit); 286 + if (ebit < BITS_PER_LONG) { 287 + tmp |= 1UL << ebit; 288 + rcu_assign_pointer(*slot, (void *)tmp); 289 + *id = new + ebit - RADIX_TREE_EXCEPTIONAL_SHIFT; 290 + return 0; 291 + } 292 + bitmap = this_cpu_xchg(ida_bitmap, NULL); 293 + if (!bitmap) 294 + return -EAGAIN; 295 + memset(bitmap, 0, sizeof(*bitmap)); 296 + bitmap->bitmap[0] = tmp >> RADIX_TREE_EXCEPTIONAL_SHIFT; 297 + rcu_assign_pointer(*slot, bitmap); 298 + } 299 + 300 + if (bitmap) { 301 + bit = find_next_zero_bit(bitmap->bitmap, 302 + IDA_BITMAP_BITS, bit); 303 + new += bit; 304 + if (new < 0) 305 + return -ENOSPC; 306 + if (bit == IDA_BITMAP_BITS) 307 + continue; 308 + 309 + __set_bit(bit, bitmap->bitmap); 310 + if (bitmap_full(bitmap->bitmap, IDA_BITMAP_BITS)) 311 + radix_tree_iter_tag_clear(root, &iter, 312 + IDR_FREE); 313 + } else { 314 + new += bit; 315 + if (new < 0) 316 + return -ENOSPC; 317 + if (ebit < BITS_PER_LONG) { 318 + bitmap = (void *)((1UL << ebit) | 319 + RADIX_TREE_EXCEPTIONAL_ENTRY); 320 + radix_tree_iter_replace(root, &iter, slot, 321 + bitmap); 322 + *id = new; 323 + return 0; 324 + } 325 + bitmap = this_cpu_xchg(ida_bitmap, NULL); 326 + if (!bitmap) 327 + return -EAGAIN; 328 + memset(bitmap, 0, sizeof(*bitmap)); 329 + __set_bit(bit, bitmap->bitmap); 330 + radix_tree_iter_replace(root, &iter, slot, bitmap); 331 + } 332 + 333 + *id = new; 334 + return 0; 335 + } 336 + } 1006 337 EXPORT_SYMBOL(ida_get_new_above); 1007 338 1008 339 /** 1009 - * ida_remove - remove the given ID 1010 - * @ida: ida handle 1011 - * @id: ID to free 340 + * ida_remove - Free the given ID 341 + * @ida: ida handle 342 + * @id: ID to free 343 + * 344 + * This function should not be called at the same time as ida_get_new_above(). 1012 345 */ 1013 346 void ida_remove(struct ida *ida, int id) 1014 347 { 1015 - struct idr_layer *p = ida->idr.top; 1016 - int shift = (ida->idr.layers - 1) * IDR_BITS; 1017 - int idr_id = id / IDA_BITMAP_BITS; 1018 - int offset = id % IDA_BITMAP_BITS; 1019 - int n; 348 + unsigned long index = id / IDA_BITMAP_BITS; 349 + unsigned offset = id % IDA_BITMAP_BITS; 1020 350 struct ida_bitmap *bitmap; 351 + unsigned long *btmp; 352 + struct radix_tree_iter iter; 353 + void __rcu **slot; 1021 354 1022 - if (idr_id > idr_max(ida->idr.layers)) 355 + slot = radix_tree_iter_lookup(&ida->ida_rt, &iter, index); 356 + if (!slot) 1023 357 goto err; 1024 358 1025 - /* clear full bits while looking up the leaf idr_layer */ 1026 - while ((shift > 0) && p) { 1027 - n = (idr_id >> shift) & IDR_MASK; 1028 - __clear_bit(n, p->bitmap); 1029 - p = p->ary[n]; 1030 - shift -= IDR_BITS; 359 + bitmap = rcu_dereference_raw(*slot); 360 + if (radix_tree_exception(bitmap)) { 361 + btmp = (unsigned long *)slot; 362 + offset += RADIX_TREE_EXCEPTIONAL_SHIFT; 363 + if (offset >= BITS_PER_LONG) 364 + goto err; 365 + } else { 366 + btmp = bitmap->bitmap; 1031 367 } 1032 - 1033 - if (p == NULL) 368 + if (!test_bit(offset, btmp)) 1034 369 goto err; 1035 370 1036 - n = idr_id & IDR_MASK; 1037 - __clear_bit(n, p->bitmap); 1038 - 1039 - bitmap = (void *)p->ary[n]; 1040 - if (!bitmap || !test_bit(offset, bitmap->bitmap)) 1041 - goto err; 1042 - 1043 - /* update bitmap and remove it if empty */ 1044 - __clear_bit(offset, bitmap->bitmap); 1045 - if (--bitmap->nr_busy == 0) { 1046 - __set_bit(n, p->bitmap); /* to please idr_remove() */ 1047 - idr_remove(&ida->idr, idr_id); 1048 - free_bitmap(ida, bitmap); 371 + __clear_bit(offset, btmp); 372 + radix_tree_iter_tag_set(&ida->ida_rt, &iter, IDR_FREE); 373 + if (radix_tree_exception(bitmap)) { 374 + if (rcu_dereference_raw(*slot) == 375 + (void *)RADIX_TREE_EXCEPTIONAL_ENTRY) 376 + radix_tree_iter_delete(&ida->ida_rt, &iter, slot); 377 + } else if (bitmap_empty(btmp, IDA_BITMAP_BITS)) { 378 + kfree(bitmap); 379 + radix_tree_iter_delete(&ida->ida_rt, &iter, slot); 1049 380 } 1050 - 1051 381 return; 1052 - 1053 382 err: 1054 383 WARN(1, "ida_remove called for id=%d which is not allocated.\n", id); 1055 384 } 1056 385 EXPORT_SYMBOL(ida_remove); 1057 386 1058 387 /** 1059 - * ida_destroy - release all cached layers within an ida tree 1060 - * @ida: ida handle 388 + * ida_destroy - Free the contents of an ida 389 + * @ida: ida handle 390 + * 391 + * Calling this function releases all resources associated with an IDA. When 392 + * this call returns, the IDA is empty and can be reused or freed. The caller 393 + * should not allow ida_remove() or ida_get_new_above() to be called at the 394 + * same time. 1061 395 */ 1062 396 void ida_destroy(struct ida *ida) 1063 397 { 1064 - idr_destroy(&ida->idr); 1065 - kfree(ida->free_bitmap); 398 + struct radix_tree_iter iter; 399 + void __rcu **slot; 400 + 401 + radix_tree_for_each_slot(slot, &ida->ida_rt, &iter, 0) { 402 + struct ida_bitmap *bitmap = rcu_dereference_raw(*slot); 403 + if (!radix_tree_exception(bitmap)) 404 + kfree(bitmap); 405 + radix_tree_iter_delete(&ida->ida_rt, &iter, slot); 406 + } 1066 407 } 1067 408 EXPORT_SYMBOL(ida_destroy); 1068 409 ··· 482 1141 spin_unlock_irqrestore(&simple_ida_lock, flags); 483 1142 } 484 1143 EXPORT_SYMBOL(ida_simple_remove); 485 - 486 - /** 487 - * ida_init - initialize ida handle 488 - * @ida: ida handle 489 - * 490 - * This function is use to set up the handle (@ida) that you will pass 491 - * to the rest of the functions. 492 - */ 493 - void ida_init(struct ida *ida) 494 - { 495 - memset(ida, 0, sizeof(struct ida)); 496 - idr_init(&ida->idr); 497 - 498 - } 499 - EXPORT_SYMBOL(ida_init);
+533 -230
lib/radix-tree.c
··· 22 22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 23 23 */ 24 24 25 + #include <linux/bitmap.h> 26 + #include <linux/bitops.h> 25 27 #include <linux/cpu.h> 26 28 #include <linux/errno.h> 29 + #include <linux/export.h> 30 + #include <linux/idr.h> 27 31 #include <linux/init.h> 28 32 #include <linux/kernel.h> 29 - #include <linux/export.h> 30 - #include <linux/radix-tree.h> 31 - #include <linux/percpu.h> 32 - #include <linux/slab.h> 33 33 #include <linux/kmemleak.h> 34 - #include <linux/cpu.h> 35 - #include <linux/string.h> 36 - #include <linux/bitops.h> 37 - #include <linux/rcupdate.h> 34 + #include <linux/percpu.h> 38 35 #include <linux/preempt.h> /* in_interrupt() */ 36 + #include <linux/radix-tree.h> 37 + #include <linux/rcupdate.h> 38 + #include <linux/slab.h> 39 + #include <linux/string.h> 39 40 40 41 41 42 /* Number of nodes in fully populated tree of given height */ ··· 61 60 #define RADIX_TREE_PRELOAD_SIZE (RADIX_TREE_MAX_PATH * 2 - 1) 62 61 63 62 /* 63 + * The IDR does not have to be as high as the radix tree since it uses 64 + * signed integers, not unsigned longs. 65 + */ 66 + #define IDR_INDEX_BITS (8 /* CHAR_BIT */ * sizeof(int) - 1) 67 + #define IDR_MAX_PATH (DIV_ROUND_UP(IDR_INDEX_BITS, \ 68 + RADIX_TREE_MAP_SHIFT)) 69 + #define IDR_PRELOAD_SIZE (IDR_MAX_PATH * 2 - 1) 70 + 71 + /* 72 + * The IDA is even shorter since it uses a bitmap at the last level. 73 + */ 74 + #define IDA_INDEX_BITS (8 * sizeof(int) - 1 - ilog2(IDA_BITMAP_BITS)) 75 + #define IDA_MAX_PATH (DIV_ROUND_UP(IDA_INDEX_BITS, \ 76 + RADIX_TREE_MAP_SHIFT)) 77 + #define IDA_PRELOAD_SIZE (IDA_MAX_PATH * 2 - 1) 78 + 79 + /* 64 80 * Per-cpu pool of preloaded nodes 65 81 */ 66 82 struct radix_tree_preload { 67 83 unsigned nr; 68 - /* nodes->private_data points to next preallocated node */ 84 + /* nodes->parent points to next preallocated node */ 69 85 struct radix_tree_node *nodes; 70 86 }; 71 87 static DEFINE_PER_CPU(struct radix_tree_preload, radix_tree_preloads) = { 0, }; ··· 101 83 102 84 #ifdef CONFIG_RADIX_TREE_MULTIORDER 103 85 /* Sibling slots point directly to another slot in the same node */ 104 - static inline bool is_sibling_entry(struct radix_tree_node *parent, void *node) 86 + static inline 87 + bool is_sibling_entry(const struct radix_tree_node *parent, void *node) 105 88 { 106 - void **ptr = node; 89 + void __rcu **ptr = node; 107 90 return (parent->slots <= ptr) && 108 91 (ptr < parent->slots + RADIX_TREE_MAP_SIZE); 109 92 } 110 93 #else 111 - static inline bool is_sibling_entry(struct radix_tree_node *parent, void *node) 94 + static inline 95 + bool is_sibling_entry(const struct radix_tree_node *parent, void *node) 112 96 { 113 97 return false; 114 98 } 115 99 #endif 116 100 117 - static inline unsigned long get_slot_offset(struct radix_tree_node *parent, 118 - void **slot) 101 + static inline unsigned long 102 + get_slot_offset(const struct radix_tree_node *parent, void __rcu **slot) 119 103 { 120 104 return slot - parent->slots; 121 105 } 122 106 123 - static unsigned int radix_tree_descend(struct radix_tree_node *parent, 107 + static unsigned int radix_tree_descend(const struct radix_tree_node *parent, 124 108 struct radix_tree_node **nodep, unsigned long index) 125 109 { 126 110 unsigned int offset = (index >> parent->shift) & RADIX_TREE_MAP_MASK; 127 - void **entry = rcu_dereference_raw(parent->slots[offset]); 111 + void __rcu **entry = rcu_dereference_raw(parent->slots[offset]); 128 112 129 113 #ifdef CONFIG_RADIX_TREE_MULTIORDER 130 114 if (radix_tree_is_internal_node(entry)) { 131 115 if (is_sibling_entry(parent, entry)) { 132 - void **sibentry = (void **) entry_to_node(entry); 116 + void __rcu **sibentry; 117 + sibentry = (void __rcu **) entry_to_node(entry); 133 118 offset = get_slot_offset(parent, sibentry); 134 119 entry = rcu_dereference_raw(*sibentry); 135 120 } ··· 143 122 return offset; 144 123 } 145 124 146 - static inline gfp_t root_gfp_mask(struct radix_tree_root *root) 125 + static inline gfp_t root_gfp_mask(const struct radix_tree_root *root) 147 126 { 148 127 return root->gfp_mask & __GFP_BITS_MASK; 149 128 } ··· 160 139 __clear_bit(offset, node->tags[tag]); 161 140 } 162 141 163 - static inline int tag_get(struct radix_tree_node *node, unsigned int tag, 142 + static inline int tag_get(const struct radix_tree_node *node, unsigned int tag, 164 143 int offset) 165 144 { 166 145 return test_bit(offset, node->tags[tag]); 167 146 } 168 147 169 - static inline void root_tag_set(struct radix_tree_root *root, unsigned int tag) 148 + static inline void root_tag_set(struct radix_tree_root *root, unsigned tag) 170 149 { 171 - root->gfp_mask |= (__force gfp_t)(1 << (tag + __GFP_BITS_SHIFT)); 150 + root->gfp_mask |= (__force gfp_t)(1 << (tag + ROOT_TAG_SHIFT)); 172 151 } 173 152 174 153 static inline void root_tag_clear(struct radix_tree_root *root, unsigned tag) 175 154 { 176 - root->gfp_mask &= (__force gfp_t)~(1 << (tag + __GFP_BITS_SHIFT)); 155 + root->gfp_mask &= (__force gfp_t)~(1 << (tag + ROOT_TAG_SHIFT)); 177 156 } 178 157 179 158 static inline void root_tag_clear_all(struct radix_tree_root *root) 180 159 { 181 - root->gfp_mask &= __GFP_BITS_MASK; 160 + root->gfp_mask &= (1 << ROOT_TAG_SHIFT) - 1; 182 161 } 183 162 184 - static inline int root_tag_get(struct radix_tree_root *root, unsigned int tag) 163 + static inline int root_tag_get(const struct radix_tree_root *root, unsigned tag) 185 164 { 186 - return (__force int)root->gfp_mask & (1 << (tag + __GFP_BITS_SHIFT)); 165 + return (__force int)root->gfp_mask & (1 << (tag + ROOT_TAG_SHIFT)); 187 166 } 188 167 189 - static inline unsigned root_tags_get(struct radix_tree_root *root) 168 + static inline unsigned root_tags_get(const struct radix_tree_root *root) 190 169 { 191 - return (__force unsigned)root->gfp_mask >> __GFP_BITS_SHIFT; 170 + return (__force unsigned)root->gfp_mask >> ROOT_TAG_SHIFT; 171 + } 172 + 173 + static inline bool is_idr(const struct radix_tree_root *root) 174 + { 175 + return !!(root->gfp_mask & ROOT_IS_IDR); 192 176 } 193 177 194 178 /* 195 179 * Returns 1 if any slot in the node has this tag set. 196 180 * Otherwise returns 0. 197 181 */ 198 - static inline int any_tag_set(struct radix_tree_node *node, unsigned int tag) 182 + static inline int any_tag_set(const struct radix_tree_node *node, 183 + unsigned int tag) 199 184 { 200 185 unsigned idx; 201 186 for (idx = 0; idx < RADIX_TREE_TAG_LONGS; idx++) { ··· 209 182 return 1; 210 183 } 211 184 return 0; 185 + } 186 + 187 + static inline void all_tag_set(struct radix_tree_node *node, unsigned int tag) 188 + { 189 + bitmap_fill(node->tags[tag], RADIX_TREE_MAP_SIZE); 212 190 } 213 191 214 192 /** ··· 264 232 return (RADIX_TREE_MAP_SIZE << shift) - 1; 265 233 } 266 234 267 - static inline unsigned long node_maxindex(struct radix_tree_node *node) 235 + static inline unsigned long node_maxindex(const struct radix_tree_node *node) 268 236 { 269 237 return shift_maxindex(node->shift); 238 + } 239 + 240 + static unsigned long next_index(unsigned long index, 241 + const struct radix_tree_node *node, 242 + unsigned long offset) 243 + { 244 + return (index & ~node_maxindex(node)) + (offset << node->shift); 270 245 } 271 246 272 247 #ifndef __KERNEL__ ··· 314 275 { 315 276 pr_debug("radix root: %p rnode %p tags %x\n", 316 277 root, root->rnode, 317 - root->gfp_mask >> __GFP_BITS_SHIFT); 278 + root->gfp_mask >> ROOT_TAG_SHIFT); 318 279 if (!radix_tree_is_internal_node(root->rnode)) 319 280 return; 320 281 dump_node(entry_to_node(root->rnode), 0); 282 + } 283 + 284 + static void dump_ida_node(void *entry, unsigned long index) 285 + { 286 + unsigned long i; 287 + 288 + if (!entry) 289 + return; 290 + 291 + if (radix_tree_is_internal_node(entry)) { 292 + struct radix_tree_node *node = entry_to_node(entry); 293 + 294 + pr_debug("ida node: %p offset %d indices %lu-%lu parent %p free %lx shift %d count %d\n", 295 + node, node->offset, index * IDA_BITMAP_BITS, 296 + ((index | node_maxindex(node)) + 1) * 297 + IDA_BITMAP_BITS - 1, 298 + node->parent, node->tags[0][0], node->shift, 299 + node->count); 300 + for (i = 0; i < RADIX_TREE_MAP_SIZE; i++) 301 + dump_ida_node(node->slots[i], 302 + index | (i << node->shift)); 303 + } else if (radix_tree_exceptional_entry(entry)) { 304 + pr_debug("ida excp: %p offset %d indices %lu-%lu data %lx\n", 305 + entry, (int)(index & RADIX_TREE_MAP_MASK), 306 + index * IDA_BITMAP_BITS, 307 + index * IDA_BITMAP_BITS + BITS_PER_LONG - 308 + RADIX_TREE_EXCEPTIONAL_SHIFT, 309 + (unsigned long)entry >> 310 + RADIX_TREE_EXCEPTIONAL_SHIFT); 311 + } else { 312 + struct ida_bitmap *bitmap = entry; 313 + 314 + pr_debug("ida btmp: %p offset %d indices %lu-%lu data", bitmap, 315 + (int)(index & RADIX_TREE_MAP_MASK), 316 + index * IDA_BITMAP_BITS, 317 + (index + 1) * IDA_BITMAP_BITS - 1); 318 + for (i = 0; i < IDA_BITMAP_LONGS; i++) 319 + pr_cont(" %lx", bitmap->bitmap[i]); 320 + pr_cont("\n"); 321 + } 322 + } 323 + 324 + static void ida_dump(struct ida *ida) 325 + { 326 + struct radix_tree_root *root = &ida->ida_rt; 327 + pr_debug("ida: %p node %p free %d\n", ida, root->rnode, 328 + root->gfp_mask >> ROOT_TAG_SHIFT); 329 + dump_ida_node(root->rnode, 0); 321 330 } 322 331 #endif 323 332 ··· 374 287 * that the caller has pinned this thread of control to the current CPU. 375 288 */ 376 289 static struct radix_tree_node * 377 - radix_tree_node_alloc(struct radix_tree_root *root, 378 - struct radix_tree_node *parent, 290 + radix_tree_node_alloc(gfp_t gfp_mask, struct radix_tree_node *parent, 291 + struct radix_tree_root *root, 379 292 unsigned int shift, unsigned int offset, 380 293 unsigned int count, unsigned int exceptional) 381 294 { 382 295 struct radix_tree_node *ret = NULL; 383 - gfp_t gfp_mask = root_gfp_mask(root); 384 296 385 297 /* 386 298 * Preload code isn't irq safe and it doesn't make sense to use ··· 407 321 rtp = this_cpu_ptr(&radix_tree_preloads); 408 322 if (rtp->nr) { 409 323 ret = rtp->nodes; 410 - rtp->nodes = ret->private_data; 411 - ret->private_data = NULL; 324 + rtp->nodes = ret->parent; 412 325 rtp->nr--; 413 326 } 414 327 /* ··· 421 336 out: 422 337 BUG_ON(radix_tree_is_internal_node(ret)); 423 338 if (ret) { 424 - ret->parent = parent; 425 339 ret->shift = shift; 426 340 ret->offset = offset; 427 341 ret->count = count; 428 342 ret->exceptional = exceptional; 343 + ret->parent = parent; 344 + ret->root = root; 429 345 } 430 346 return ret; 431 347 } ··· 485 399 preempt_disable(); 486 400 rtp = this_cpu_ptr(&radix_tree_preloads); 487 401 if (rtp->nr < nr) { 488 - node->private_data = rtp->nodes; 402 + node->parent = rtp->nodes; 489 403 rtp->nodes = node; 490 404 rtp->nr++; 491 405 } else { ··· 596 510 return __radix_tree_preload(gfp_mask, nr_nodes); 597 511 } 598 512 599 - static unsigned radix_tree_load_root(struct radix_tree_root *root, 513 + static unsigned radix_tree_load_root(const struct radix_tree_root *root, 600 514 struct radix_tree_node **nodep, unsigned long *maxindex) 601 515 { 602 516 struct radix_tree_node *node = rcu_dereference_raw(root->rnode); ··· 616 530 /* 617 531 * Extend a radix tree so it can store key @index. 618 532 */ 619 - static int radix_tree_extend(struct radix_tree_root *root, 533 + static int radix_tree_extend(struct radix_tree_root *root, gfp_t gfp, 620 534 unsigned long index, unsigned int shift) 621 535 { 622 - struct radix_tree_node *slot; 536 + void *entry; 623 537 unsigned int maxshift; 624 538 int tag; 625 539 ··· 628 542 while (index > shift_maxindex(maxshift)) 629 543 maxshift += RADIX_TREE_MAP_SHIFT; 630 544 631 - slot = root->rnode; 632 - if (!slot) 545 + entry = rcu_dereference_raw(root->rnode); 546 + if (!entry && (!is_idr(root) || root_tag_get(root, IDR_FREE))) 633 547 goto out; 634 548 635 549 do { 636 - struct radix_tree_node *node = radix_tree_node_alloc(root, 637 - NULL, shift, 0, 1, 0); 550 + struct radix_tree_node *node = radix_tree_node_alloc(gfp, NULL, 551 + root, shift, 0, 1, 0); 638 552 if (!node) 639 553 return -ENOMEM; 640 554 641 - /* Propagate the aggregated tag info into the new root */ 642 - for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) { 643 - if (root_tag_get(root, tag)) 644 - tag_set(node, tag, 0); 555 + if (is_idr(root)) { 556 + all_tag_set(node, IDR_FREE); 557 + if (!root_tag_get(root, IDR_FREE)) { 558 + tag_clear(node, IDR_FREE, 0); 559 + root_tag_set(root, IDR_FREE); 560 + } 561 + } else { 562 + /* Propagate the aggregated tag info to the new child */ 563 + for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) { 564 + if (root_tag_get(root, tag)) 565 + tag_set(node, tag, 0); 566 + } 645 567 } 646 568 647 569 BUG_ON(shift > BITS_PER_LONG); 648 - if (radix_tree_is_internal_node(slot)) { 649 - entry_to_node(slot)->parent = node; 650 - } else if (radix_tree_exceptional_entry(slot)) { 570 + if (radix_tree_is_internal_node(entry)) { 571 + entry_to_node(entry)->parent = node; 572 + } else if (radix_tree_exceptional_entry(entry)) { 651 573 /* Moving an exceptional root->rnode to a node */ 652 574 node->exceptional = 1; 653 575 } 654 - node->slots[0] = slot; 655 - slot = node_to_entry(node); 656 - rcu_assign_pointer(root->rnode, slot); 576 + /* 577 + * entry was already in the radix tree, so we do not need 578 + * rcu_assign_pointer here 579 + */ 580 + node->slots[0] = (void __rcu *)entry; 581 + entry = node_to_entry(node); 582 + rcu_assign_pointer(root->rnode, entry); 657 583 shift += RADIX_TREE_MAP_SHIFT; 658 584 } while (shift <= maxshift); 659 585 out: ··· 676 578 * radix_tree_shrink - shrink radix tree to minimum height 677 579 * @root radix tree root 678 580 */ 679 - static inline void radix_tree_shrink(struct radix_tree_root *root, 581 + static inline bool radix_tree_shrink(struct radix_tree_root *root, 680 582 radix_tree_update_node_t update_node, 681 583 void *private) 682 584 { 585 + bool shrunk = false; 586 + 683 587 for (;;) { 684 - struct radix_tree_node *node = root->rnode; 588 + struct radix_tree_node *node = rcu_dereference_raw(root->rnode); 685 589 struct radix_tree_node *child; 686 590 687 591 if (!radix_tree_is_internal_node(node)) ··· 697 597 */ 698 598 if (node->count != 1) 699 599 break; 700 - child = node->slots[0]; 600 + child = rcu_dereference_raw(node->slots[0]); 701 601 if (!child) 702 602 break; 703 603 if (!radix_tree_is_internal_node(child) && node->shift) ··· 713 613 * (node->slots[0]), it will be safe to dereference the new 714 614 * one (root->rnode) as far as dependent read barriers go. 715 615 */ 716 - root->rnode = child; 616 + root->rnode = (void __rcu *)child; 617 + if (is_idr(root) && !tag_get(node, IDR_FREE, 0)) 618 + root_tag_clear(root, IDR_FREE); 717 619 718 620 /* 719 621 * We have a dilemma here. The node's slot[0] must not be ··· 737 635 */ 738 636 node->count = 0; 739 637 if (!radix_tree_is_internal_node(child)) { 740 - node->slots[0] = RADIX_TREE_RETRY; 638 + node->slots[0] = (void __rcu *)RADIX_TREE_RETRY; 741 639 if (update_node) 742 640 update_node(node, private); 743 641 } 744 642 745 643 WARN_ON_ONCE(!list_empty(&node->private_list)); 746 644 radix_tree_node_free(node); 645 + shrunk = true; 747 646 } 647 + 648 + return shrunk; 748 649 } 749 650 750 - static void delete_node(struct radix_tree_root *root, 651 + static bool delete_node(struct radix_tree_root *root, 751 652 struct radix_tree_node *node, 752 653 radix_tree_update_node_t update_node, void *private) 753 654 { 655 + bool deleted = false; 656 + 754 657 do { 755 658 struct radix_tree_node *parent; 756 659 757 660 if (node->count) { 758 - if (node == entry_to_node(root->rnode)) 759 - radix_tree_shrink(root, update_node, private); 760 - return; 661 + if (node_to_entry(node) == 662 + rcu_dereference_raw(root->rnode)) 663 + deleted |= radix_tree_shrink(root, update_node, 664 + private); 665 + return deleted; 761 666 } 762 667 763 668 parent = node->parent; ··· 772 663 parent->slots[node->offset] = NULL; 773 664 parent->count--; 774 665 } else { 775 - root_tag_clear_all(root); 666 + /* 667 + * Shouldn't the tags already have all been cleared 668 + * by the caller? 669 + */ 670 + if (!is_idr(root)) 671 + root_tag_clear_all(root); 776 672 root->rnode = NULL; 777 673 } 778 674 779 675 WARN_ON_ONCE(!list_empty(&node->private_list)); 780 676 radix_tree_node_free(node); 677 + deleted = true; 781 678 782 679 node = parent; 783 680 } while (node); 681 + 682 + return deleted; 784 683 } 785 684 786 685 /** ··· 810 693 */ 811 694 int __radix_tree_create(struct radix_tree_root *root, unsigned long index, 812 695 unsigned order, struct radix_tree_node **nodep, 813 - void ***slotp) 696 + void __rcu ***slotp) 814 697 { 815 698 struct radix_tree_node *node = NULL, *child; 816 - void **slot = (void **)&root->rnode; 699 + void __rcu **slot = (void __rcu **)&root->rnode; 817 700 unsigned long maxindex; 818 701 unsigned int shift, offset = 0; 819 702 unsigned long max = index | ((1UL << order) - 1); 703 + gfp_t gfp = root_gfp_mask(root); 820 704 821 705 shift = radix_tree_load_root(root, &child, &maxindex); 822 706 ··· 825 707 if (order > 0 && max == ((1UL << order) - 1)) 826 708 max++; 827 709 if (max > maxindex) { 828 - int error = radix_tree_extend(root, max, shift); 710 + int error = radix_tree_extend(root, gfp, max, shift); 829 711 if (error < 0) 830 712 return error; 831 713 shift = error; 832 - child = root->rnode; 714 + child = rcu_dereference_raw(root->rnode); 833 715 } 834 716 835 717 while (shift > order) { 836 718 shift -= RADIX_TREE_MAP_SHIFT; 837 719 if (child == NULL) { 838 720 /* Have to add a child node. */ 839 - child = radix_tree_node_alloc(root, node, shift, 721 + child = radix_tree_node_alloc(gfp, node, root, shift, 840 722 offset, 0, 0); 841 723 if (!child) 842 724 return -ENOMEM; ··· 859 741 return 0; 860 742 } 861 743 862 - #ifdef CONFIG_RADIX_TREE_MULTIORDER 863 744 /* 864 745 * Free any nodes below this node. The tree is presumed to not need 865 746 * shrinking, and any user data in the tree is presumed to not need a ··· 874 757 struct radix_tree_node *child = entry_to_node(node); 875 758 876 759 for (;;) { 877 - void *entry = child->slots[offset]; 760 + void *entry = rcu_dereference_raw(child->slots[offset]); 878 761 if (radix_tree_is_internal_node(entry) && 879 762 !is_sibling_entry(child, entry)) { 880 763 child = entry_to_node(entry); ··· 894 777 } 895 778 } 896 779 897 - static inline int insert_entries(struct radix_tree_node *node, void **slot, 898 - void *item, unsigned order, bool replace) 780 + #ifdef CONFIG_RADIX_TREE_MULTIORDER 781 + static inline int insert_entries(struct radix_tree_node *node, 782 + void __rcu **slot, void *item, unsigned order, bool replace) 899 783 { 900 784 struct radix_tree_node *child; 901 785 unsigned i, n, tag, offset, tags = 0; ··· 931 813 } 932 814 933 815 for (i = 0; i < n; i++) { 934 - struct radix_tree_node *old = slot[i]; 816 + struct radix_tree_node *old = rcu_dereference_raw(slot[i]); 935 817 if (i) { 936 818 rcu_assign_pointer(slot[i], child); 937 819 for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) ··· 958 840 return n; 959 841 } 960 842 #else 961 - static inline int insert_entries(struct radix_tree_node *node, void **slot, 962 - void *item, unsigned order, bool replace) 843 + static inline int insert_entries(struct radix_tree_node *node, 844 + void __rcu **slot, void *item, unsigned order, bool replace) 963 845 { 964 846 if (*slot) 965 847 return -EEXIST; ··· 986 868 unsigned order, void *item) 987 869 { 988 870 struct radix_tree_node *node; 989 - void **slot; 871 + void __rcu **slot; 990 872 int error; 991 873 992 874 BUG_ON(radix_tree_is_internal_node(item)); ··· 1026 908 * allocated and @root->rnode is used as a direct slot instead of 1027 909 * pointing to a node, in which case *@nodep will be NULL. 1028 910 */ 1029 - void *__radix_tree_lookup(struct radix_tree_root *root, unsigned long index, 1030 - struct radix_tree_node **nodep, void ***slotp) 911 + void *__radix_tree_lookup(const struct radix_tree_root *root, 912 + unsigned long index, struct radix_tree_node **nodep, 913 + void __rcu ***slotp) 1031 914 { 1032 915 struct radix_tree_node *node, *parent; 1033 916 unsigned long maxindex; 1034 - void **slot; 917 + void __rcu **slot; 1035 918 1036 919 restart: 1037 920 parent = NULL; 1038 - slot = (void **)&root->rnode; 921 + slot = (void __rcu **)&root->rnode; 1039 922 radix_tree_load_root(root, &node, &maxindex); 1040 923 if (index > maxindex) 1041 924 return NULL; ··· 1071 952 * exclusive from other writers. Any dereference of the slot must be done 1072 953 * using radix_tree_deref_slot. 1073 954 */ 1074 - void **radix_tree_lookup_slot(struct radix_tree_root *root, unsigned long index) 955 + void __rcu **radix_tree_lookup_slot(const struct radix_tree_root *root, 956 + unsigned long index) 1075 957 { 1076 - void **slot; 958 + void __rcu **slot; 1077 959 1078 960 if (!__radix_tree_lookup(root, index, NULL, &slot)) 1079 961 return NULL; ··· 1094 974 * them safely). No RCU barriers are required to access or modify the 1095 975 * returned item, however. 1096 976 */ 1097 - void *radix_tree_lookup(struct radix_tree_root *root, unsigned long index) 977 + void *radix_tree_lookup(const struct radix_tree_root *root, unsigned long index) 1098 978 { 1099 979 return __radix_tree_lookup(root, index, NULL, NULL); 1100 980 } 1101 981 EXPORT_SYMBOL(radix_tree_lookup); 1102 982 1103 - static inline int slot_count(struct radix_tree_node *node, 1104 - void **slot) 983 + static inline void replace_sibling_entries(struct radix_tree_node *node, 984 + void __rcu **slot, int count, int exceptional) 1105 985 { 1106 - int n = 1; 1107 986 #ifdef CONFIG_RADIX_TREE_MULTIORDER 1108 987 void *ptr = node_to_entry(slot); 1109 - unsigned offset = get_slot_offset(node, slot); 1110 - int i; 988 + unsigned offset = get_slot_offset(node, slot) + 1; 1111 989 1112 - for (i = 1; offset + i < RADIX_TREE_MAP_SIZE; i++) { 1113 - if (node->slots[offset + i] != ptr) 990 + while (offset < RADIX_TREE_MAP_SIZE) { 991 + if (rcu_dereference_raw(node->slots[offset]) != ptr) 1114 992 break; 1115 - n++; 993 + if (count < 0) { 994 + node->slots[offset] = NULL; 995 + node->count--; 996 + } 997 + node->exceptional += exceptional; 998 + offset++; 1116 999 } 1117 1000 #endif 1118 - return n; 1119 1001 } 1120 1002 1121 - static void replace_slot(struct radix_tree_root *root, 1122 - struct radix_tree_node *node, 1123 - void **slot, void *item, 1124 - bool warn_typeswitch) 1003 + static void replace_slot(void __rcu **slot, void *item, 1004 + struct radix_tree_node *node, int count, int exceptional) 1125 1005 { 1126 - void *old = rcu_dereference_raw(*slot); 1127 - int count, exceptional; 1006 + if (WARN_ON_ONCE(radix_tree_is_internal_node(item))) 1007 + return; 1128 1008 1129 - WARN_ON_ONCE(radix_tree_is_internal_node(item)); 1130 - 1131 - count = !!item - !!old; 1132 - exceptional = !!radix_tree_exceptional_entry(item) - 1133 - !!radix_tree_exceptional_entry(old); 1134 - 1135 - WARN_ON_ONCE(warn_typeswitch && (count || exceptional)); 1136 - 1137 - if (node) { 1009 + if (node && (count || exceptional)) { 1138 1010 node->count += count; 1139 - if (exceptional) { 1140 - exceptional *= slot_count(node, slot); 1141 - node->exceptional += exceptional; 1142 - } 1011 + node->exceptional += exceptional; 1012 + replace_sibling_entries(node, slot, count, exceptional); 1143 1013 } 1144 1014 1145 1015 rcu_assign_pointer(*slot, item); 1146 1016 } 1147 1017 1148 - static inline void delete_sibling_entries(struct radix_tree_node *node, 1149 - void **slot) 1018 + static bool node_tag_get(const struct radix_tree_root *root, 1019 + const struct radix_tree_node *node, 1020 + unsigned int tag, unsigned int offset) 1150 1021 { 1151 - #ifdef CONFIG_RADIX_TREE_MULTIORDER 1152 - bool exceptional = radix_tree_exceptional_entry(*slot); 1153 - void *ptr = node_to_entry(slot); 1154 - unsigned offset = get_slot_offset(node, slot); 1155 - int i; 1022 + if (node) 1023 + return tag_get(node, tag, offset); 1024 + return root_tag_get(root, tag); 1025 + } 1156 1026 1157 - for (i = 1; offset + i < RADIX_TREE_MAP_SIZE; i++) { 1158 - if (node->slots[offset + i] != ptr) 1159 - break; 1160 - node->slots[offset + i] = NULL; 1161 - node->count--; 1162 - if (exceptional) 1163 - node->exceptional--; 1027 + /* 1028 + * IDR users want to be able to store NULL in the tree, so if the slot isn't 1029 + * free, don't adjust the count, even if it's transitioning between NULL and 1030 + * non-NULL. For the IDA, we mark slots as being IDR_FREE while they still 1031 + * have empty bits, but it only stores NULL in slots when they're being 1032 + * deleted. 1033 + */ 1034 + static int calculate_count(struct radix_tree_root *root, 1035 + struct radix_tree_node *node, void __rcu **slot, 1036 + void *item, void *old) 1037 + { 1038 + if (is_idr(root)) { 1039 + unsigned offset = get_slot_offset(node, slot); 1040 + bool free = node_tag_get(root, node, IDR_FREE, offset); 1041 + if (!free) 1042 + return 0; 1043 + if (!old) 1044 + return 1; 1164 1045 } 1165 - #endif 1046 + return !!item - !!old; 1166 1047 } 1167 1048 1168 1049 /** ··· 1180 1059 */ 1181 1060 void __radix_tree_replace(struct radix_tree_root *root, 1182 1061 struct radix_tree_node *node, 1183 - void **slot, void *item, 1062 + void __rcu **slot, void *item, 1184 1063 radix_tree_update_node_t update_node, void *private) 1185 1064 { 1186 - if (!item) 1187 - delete_sibling_entries(node, slot); 1065 + void *old = rcu_dereference_raw(*slot); 1066 + int exceptional = !!radix_tree_exceptional_entry(item) - 1067 + !!radix_tree_exceptional_entry(old); 1068 + int count = calculate_count(root, node, slot, item, old); 1069 + 1188 1070 /* 1189 1071 * This function supports replacing exceptional entries and 1190 1072 * deleting entries, but that needs accounting against the 1191 1073 * node unless the slot is root->rnode. 1192 1074 */ 1193 - replace_slot(root, node, slot, item, 1194 - !node && slot != (void **)&root->rnode); 1075 + WARN_ON_ONCE(!node && (slot != (void __rcu **)&root->rnode) && 1076 + (count || exceptional)); 1077 + replace_slot(slot, item, node, count, exceptional); 1195 1078 1196 1079 if (!node) 1197 1080 return; ··· 1223 1098 * radix_tree_iter_replace(). 1224 1099 */ 1225 1100 void radix_tree_replace_slot(struct radix_tree_root *root, 1226 - void **slot, void *item) 1101 + void __rcu **slot, void *item) 1227 1102 { 1228 - replace_slot(root, NULL, slot, item, true); 1103 + __radix_tree_replace(root, NULL, slot, item, NULL, NULL); 1229 1104 } 1230 1105 EXPORT_SYMBOL(radix_tree_replace_slot); 1231 1106 ··· 1239 1114 * Caller must hold tree write locked across split and replacement. 1240 1115 */ 1241 1116 void radix_tree_iter_replace(struct radix_tree_root *root, 1242 - const struct radix_tree_iter *iter, void **slot, void *item) 1117 + const struct radix_tree_iter *iter, 1118 + void __rcu **slot, void *item) 1243 1119 { 1244 1120 __radix_tree_replace(root, iter->node, slot, item, NULL, NULL); 1245 1121 } ··· 1264 1138 unsigned order, void *item) 1265 1139 { 1266 1140 struct radix_tree_node *node; 1267 - void **slot; 1141 + void __rcu **slot; 1268 1142 int error; 1269 1143 1270 1144 BUG_ON(radix_tree_is_internal_node(item)); ··· 1299 1173 unsigned order) 1300 1174 { 1301 1175 struct radix_tree_node *parent, *node, *child; 1302 - void **slot; 1176 + void __rcu **slot; 1303 1177 unsigned int offset, end; 1304 1178 unsigned n, tag, tags = 0; 1179 + gfp_t gfp = root_gfp_mask(root); 1305 1180 1306 1181 if (!__radix_tree_lookup(root, index, &parent, &slot)) 1307 1182 return -ENOENT; ··· 1316 1189 tags |= 1 << tag; 1317 1190 1318 1191 for (end = offset + 1; end < RADIX_TREE_MAP_SIZE; end++) { 1319 - if (!is_sibling_entry(parent, parent->slots[end])) 1192 + if (!is_sibling_entry(parent, 1193 + rcu_dereference_raw(parent->slots[end]))) 1320 1194 break; 1321 1195 for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) 1322 1196 if (tags & (1 << tag)) ··· 1341 1213 1342 1214 for (;;) { 1343 1215 if (node->shift > order) { 1344 - child = radix_tree_node_alloc(root, node, 1216 + child = radix_tree_node_alloc(gfp, node, root, 1345 1217 node->shift - RADIX_TREE_MAP_SHIFT, 1346 1218 offset, 0, 0); 1347 1219 if (!child) 1348 1220 goto nomem; 1349 1221 if (node != parent) { 1350 1222 node->count++; 1351 - node->slots[offset] = node_to_entry(child); 1223 + rcu_assign_pointer(node->slots[offset], 1224 + node_to_entry(child)); 1352 1225 for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) 1353 1226 if (tags & (1 << tag)) 1354 1227 tag_set(node, tag, offset); ··· 1390 1261 return -ENOMEM; 1391 1262 } 1392 1263 #endif 1264 + 1265 + static void node_tag_set(struct radix_tree_root *root, 1266 + struct radix_tree_node *node, 1267 + unsigned int tag, unsigned int offset) 1268 + { 1269 + while (node) { 1270 + if (tag_get(node, tag, offset)) 1271 + return; 1272 + tag_set(node, tag, offset); 1273 + offset = node->offset; 1274 + node = node->parent; 1275 + } 1276 + 1277 + if (!root_tag_get(root, tag)) 1278 + root_tag_set(root, tag); 1279 + } 1393 1280 1394 1281 /** 1395 1282 * radix_tree_tag_set - set a tag on a radix tree node ··· 1448 1303 } 1449 1304 EXPORT_SYMBOL(radix_tree_tag_set); 1450 1305 1306 + /** 1307 + * radix_tree_iter_tag_set - set a tag on the current iterator entry 1308 + * @root: radix tree root 1309 + * @iter: iterator state 1310 + * @tag: tag to set 1311 + */ 1312 + void radix_tree_iter_tag_set(struct radix_tree_root *root, 1313 + const struct radix_tree_iter *iter, unsigned int tag) 1314 + { 1315 + node_tag_set(root, iter->node, tag, iter_offset(iter)); 1316 + } 1317 + 1451 1318 static void node_tag_clear(struct radix_tree_root *root, 1452 1319 struct radix_tree_node *node, 1453 1320 unsigned int tag, unsigned int offset) ··· 1478 1321 /* clear the root's tag bit */ 1479 1322 if (root_tag_get(root, tag)) 1480 1323 root_tag_clear(root, tag); 1481 - } 1482 - 1483 - static void node_tag_set(struct radix_tree_root *root, 1484 - struct radix_tree_node *node, 1485 - unsigned int tag, unsigned int offset) 1486 - { 1487 - while (node) { 1488 - if (tag_get(node, tag, offset)) 1489 - return; 1490 - tag_set(node, tag, offset); 1491 - offset = node->offset; 1492 - node = node->parent; 1493 - } 1494 - 1495 - if (!root_tag_get(root, tag)) 1496 - root_tag_set(root, tag); 1497 - } 1498 - 1499 - /** 1500 - * radix_tree_iter_tag_set - set a tag on the current iterator entry 1501 - * @root: radix tree root 1502 - * @iter: iterator state 1503 - * @tag: tag to set 1504 - */ 1505 - void radix_tree_iter_tag_set(struct radix_tree_root *root, 1506 - const struct radix_tree_iter *iter, unsigned int tag) 1507 - { 1508 - node_tag_set(root, iter->node, tag, iter_offset(iter)); 1509 1324 } 1510 1325 1511 1326 /** ··· 1520 1391 EXPORT_SYMBOL(radix_tree_tag_clear); 1521 1392 1522 1393 /** 1394 + * radix_tree_iter_tag_clear - clear a tag on the current iterator entry 1395 + * @root: radix tree root 1396 + * @iter: iterator state 1397 + * @tag: tag to clear 1398 + */ 1399 + void radix_tree_iter_tag_clear(struct radix_tree_root *root, 1400 + const struct radix_tree_iter *iter, unsigned int tag) 1401 + { 1402 + node_tag_clear(root, iter->node, tag, iter_offset(iter)); 1403 + } 1404 + 1405 + /** 1523 1406 * radix_tree_tag_get - get a tag on a radix tree node 1524 1407 * @root: radix tree root 1525 1408 * @index: index key ··· 1546 1405 * the RCU lock is held, unless tag modification and node deletion are excluded 1547 1406 * from concurrency. 1548 1407 */ 1549 - int radix_tree_tag_get(struct radix_tree_root *root, 1408 + int radix_tree_tag_get(const struct radix_tree_root *root, 1550 1409 unsigned long index, unsigned int tag) 1551 1410 { 1552 1411 struct radix_tree_node *node, *parent; ··· 1558 1417 radix_tree_load_root(root, &node, &maxindex); 1559 1418 if (index > maxindex) 1560 1419 return 0; 1561 - if (node == NULL) 1562 - return 0; 1563 1420 1564 1421 while (radix_tree_is_internal_node(node)) { 1565 1422 unsigned offset; ··· 1565 1426 parent = entry_to_node(node); 1566 1427 offset = radix_tree_descend(parent, &node, index); 1567 1428 1568 - if (!node) 1569 - return 0; 1570 1429 if (!tag_get(parent, tag, offset)) 1571 1430 return 0; 1572 1431 if (node == RADIX_TREE_RETRY) ··· 1591 1454 unsigned tag_long = offset / BITS_PER_LONG; 1592 1455 unsigned tag_bit = offset % BITS_PER_LONG; 1593 1456 1457 + if (!node) { 1458 + iter->tags = 1; 1459 + return; 1460 + } 1461 + 1594 1462 iter->tags = node->tags[tag][tag_long] >> tag_bit; 1595 1463 1596 1464 /* This never happens if RADIX_TREE_TAG_LONGS == 1 */ ··· 1610 1468 } 1611 1469 1612 1470 #ifdef CONFIG_RADIX_TREE_MULTIORDER 1613 - static void **skip_siblings(struct radix_tree_node **nodep, 1614 - void **slot, struct radix_tree_iter *iter) 1471 + static void __rcu **skip_siblings(struct radix_tree_node **nodep, 1472 + void __rcu **slot, struct radix_tree_iter *iter) 1615 1473 { 1616 1474 void *sib = node_to_entry(slot - 1); 1617 1475 ··· 1628 1486 return NULL; 1629 1487 } 1630 1488 1631 - void ** __radix_tree_next_slot(void **slot, struct radix_tree_iter *iter, 1632 - unsigned flags) 1489 + void __rcu **__radix_tree_next_slot(void __rcu **slot, 1490 + struct radix_tree_iter *iter, unsigned flags) 1633 1491 { 1634 1492 unsigned tag = flags & RADIX_TREE_ITER_TAG_MASK; 1635 1493 struct radix_tree_node *node = rcu_dereference_raw(*slot); ··· 1682 1540 } 1683 1541 EXPORT_SYMBOL(__radix_tree_next_slot); 1684 1542 #else 1685 - static void **skip_siblings(struct radix_tree_node **nodep, 1686 - void **slot, struct radix_tree_iter *iter) 1543 + static void __rcu **skip_siblings(struct radix_tree_node **nodep, 1544 + void __rcu **slot, struct radix_tree_iter *iter) 1687 1545 { 1688 1546 return slot; 1689 1547 } 1690 1548 #endif 1691 1549 1692 - void **radix_tree_iter_resume(void **slot, struct radix_tree_iter *iter) 1550 + void __rcu **radix_tree_iter_resume(void __rcu **slot, 1551 + struct radix_tree_iter *iter) 1693 1552 { 1694 1553 struct radix_tree_node *node; 1695 1554 1696 1555 slot++; 1697 1556 iter->index = __radix_tree_iter_add(iter, 1); 1698 - node = rcu_dereference_raw(*slot); 1699 1557 skip_siblings(&node, slot, iter); 1700 1558 iter->next_index = iter->index; 1701 1559 iter->tags = 0; ··· 1711 1569 * @flags: RADIX_TREE_ITER_* flags and tag index 1712 1570 * Returns: pointer to chunk first slot, or NULL if iteration is over 1713 1571 */ 1714 - void **radix_tree_next_chunk(struct radix_tree_root *root, 1572 + void __rcu **radix_tree_next_chunk(const struct radix_tree_root *root, 1715 1573 struct radix_tree_iter *iter, unsigned flags) 1716 1574 { 1717 1575 unsigned tag = flags & RADIX_TREE_ITER_TAG_MASK; ··· 1748 1606 iter->tags = 1; 1749 1607 iter->node = NULL; 1750 1608 __set_iter_shift(iter, 0); 1751 - return (void **)&root->rnode; 1609 + return (void __rcu **)&root->rnode; 1752 1610 } 1753 1611 1754 1612 do { ··· 1766 1624 offset + 1); 1767 1625 else 1768 1626 while (++offset < RADIX_TREE_MAP_SIZE) { 1769 - void *slot = node->slots[offset]; 1627 + void *slot = rcu_dereference_raw( 1628 + node->slots[offset]); 1770 1629 if (is_sibling_entry(node, slot)) 1771 1630 continue; 1772 1631 if (slot) ··· 1823 1680 * stored in 'results'. 1824 1681 */ 1825 1682 unsigned int 1826 - radix_tree_gang_lookup(struct radix_tree_root *root, void **results, 1683 + radix_tree_gang_lookup(const struct radix_tree_root *root, void **results, 1827 1684 unsigned long first_index, unsigned int max_items) 1828 1685 { 1829 1686 struct radix_tree_iter iter; 1830 - void **slot; 1687 + void __rcu **slot; 1831 1688 unsigned int ret = 0; 1832 1689 1833 1690 if (unlikely(!max_items)) ··· 1868 1725 * protection, radix_tree_deref_slot may fail requiring a retry. 1869 1726 */ 1870 1727 unsigned int 1871 - radix_tree_gang_lookup_slot(struct radix_tree_root *root, 1872 - void ***results, unsigned long *indices, 1728 + radix_tree_gang_lookup_slot(const struct radix_tree_root *root, 1729 + void __rcu ***results, unsigned long *indices, 1873 1730 unsigned long first_index, unsigned int max_items) 1874 1731 { 1875 1732 struct radix_tree_iter iter; 1876 - void **slot; 1733 + void __rcu **slot; 1877 1734 unsigned int ret = 0; 1878 1735 1879 1736 if (unlikely(!max_items)) ··· 1905 1762 * returns the number of items which were placed at *@results. 1906 1763 */ 1907 1764 unsigned int 1908 - radix_tree_gang_lookup_tag(struct radix_tree_root *root, void **results, 1765 + radix_tree_gang_lookup_tag(const struct radix_tree_root *root, void **results, 1909 1766 unsigned long first_index, unsigned int max_items, 1910 1767 unsigned int tag) 1911 1768 { 1912 1769 struct radix_tree_iter iter; 1913 - void **slot; 1770 + void __rcu **slot; 1914 1771 unsigned int ret = 0; 1915 1772 1916 1773 if (unlikely(!max_items)) ··· 1946 1803 * returns the number of slots which were placed at *@results. 1947 1804 */ 1948 1805 unsigned int 1949 - radix_tree_gang_lookup_tag_slot(struct radix_tree_root *root, void ***results, 1950 - unsigned long first_index, unsigned int max_items, 1951 - unsigned int tag) 1806 + radix_tree_gang_lookup_tag_slot(const struct radix_tree_root *root, 1807 + void __rcu ***results, unsigned long first_index, 1808 + unsigned int max_items, unsigned int tag) 1952 1809 { 1953 1810 struct radix_tree_iter iter; 1954 - void **slot; 1811 + void __rcu **slot; 1955 1812 unsigned int ret = 0; 1956 1813 1957 1814 if (unlikely(!max_items)) ··· 1986 1843 delete_node(root, node, update_node, private); 1987 1844 } 1988 1845 1846 + static bool __radix_tree_delete(struct radix_tree_root *root, 1847 + struct radix_tree_node *node, void __rcu **slot) 1848 + { 1849 + void *old = rcu_dereference_raw(*slot); 1850 + int exceptional = radix_tree_exceptional_entry(old) ? -1 : 0; 1851 + unsigned offset = get_slot_offset(node, slot); 1852 + int tag; 1853 + 1854 + if (is_idr(root)) 1855 + node_tag_set(root, node, IDR_FREE, offset); 1856 + else 1857 + for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) 1858 + node_tag_clear(root, node, tag, offset); 1859 + 1860 + replace_slot(slot, NULL, node, -1, exceptional); 1861 + return node && delete_node(root, node, NULL, NULL); 1862 + } 1863 + 1989 1864 /** 1990 - * radix_tree_delete_item - delete an item from a radix tree 1991 - * @root: radix tree root 1992 - * @index: index key 1993 - * @item: expected item 1865 + * radix_tree_iter_delete - delete the entry at this iterator position 1866 + * @root: radix tree root 1867 + * @iter: iterator state 1868 + * @slot: pointer to slot 1994 1869 * 1995 - * Remove @item at @index from the radix tree rooted at @root. 1870 + * Delete the entry at the position currently pointed to by the iterator. 1871 + * This may result in the current node being freed; if it is, the iterator 1872 + * is advanced so that it will not reference the freed memory. This 1873 + * function may be called without any locking if there are no other threads 1874 + * which can access this tree. 1875 + */ 1876 + void radix_tree_iter_delete(struct radix_tree_root *root, 1877 + struct radix_tree_iter *iter, void __rcu **slot) 1878 + { 1879 + if (__radix_tree_delete(root, iter->node, slot)) 1880 + iter->index = iter->next_index; 1881 + } 1882 + 1883 + /** 1884 + * radix_tree_delete_item - delete an item from a radix tree 1885 + * @root: radix tree root 1886 + * @index: index key 1887 + * @item: expected item 1996 1888 * 1997 - * Returns the address of the deleted item, or NULL if it was not present 1998 - * or the entry at the given @index was not @item. 1889 + * Remove @item at @index from the radix tree rooted at @root. 1890 + * 1891 + * Return: the deleted entry, or %NULL if it was not present 1892 + * or the entry at the given @index was not @item. 1999 1893 */ 2000 1894 void *radix_tree_delete_item(struct radix_tree_root *root, 2001 1895 unsigned long index, void *item) 2002 1896 { 2003 - struct radix_tree_node *node; 2004 - unsigned int offset; 2005 - void **slot; 1897 + struct radix_tree_node *node = NULL; 1898 + void __rcu **slot; 2006 1899 void *entry; 2007 - int tag; 2008 1900 2009 1901 entry = __radix_tree_lookup(root, index, &node, &slot); 2010 - if (!entry) 1902 + if (!entry && (!is_idr(root) || node_tag_get(root, node, IDR_FREE, 1903 + get_slot_offset(node, slot)))) 2011 1904 return NULL; 2012 1905 2013 1906 if (item && entry != item) 2014 1907 return NULL; 2015 1908 2016 - if (!node) { 2017 - root_tag_clear_all(root); 2018 - root->rnode = NULL; 2019 - return entry; 2020 - } 2021 - 2022 - offset = get_slot_offset(node, slot); 2023 - 2024 - /* Clear all tags associated with the item to be deleted. */ 2025 - for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) 2026 - node_tag_clear(root, node, tag, offset); 2027 - 2028 - __radix_tree_replace(root, node, slot, NULL, NULL, NULL); 1909 + __radix_tree_delete(root, node, slot); 2029 1910 2030 1911 return entry; 2031 1912 } 2032 1913 EXPORT_SYMBOL(radix_tree_delete_item); 2033 1914 2034 1915 /** 2035 - * radix_tree_delete - delete an item from a radix tree 2036 - * @root: radix tree root 2037 - * @index: index key 1916 + * radix_tree_delete - delete an entry from a radix tree 1917 + * @root: radix tree root 1918 + * @index: index key 2038 1919 * 2039 - * Remove the item at @index from the radix tree rooted at @root. 1920 + * Remove the entry at @index from the radix tree rooted at @root. 2040 1921 * 2041 - * Returns the address of the deleted item, or NULL if it was not present. 1922 + * Return: The deleted entry, or %NULL if it was not present. 2042 1923 */ 2043 1924 void *radix_tree_delete(struct radix_tree_root *root, unsigned long index) 2044 1925 { ··· 2072 1905 2073 1906 void radix_tree_clear_tags(struct radix_tree_root *root, 2074 1907 struct radix_tree_node *node, 2075 - void **slot) 1908 + void __rcu **slot) 2076 1909 { 2077 1910 if (node) { 2078 1911 unsigned int tag, offset = get_slot_offset(node, slot); 2079 1912 for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) 2080 1913 node_tag_clear(root, node, tag, offset); 2081 1914 } else { 2082 - /* Clear root node tags */ 2083 - root->gfp_mask &= __GFP_BITS_MASK; 1915 + root_tag_clear_all(root); 2084 1916 } 2085 1917 } 2086 1918 ··· 2088 1922 * @root: radix tree root 2089 1923 * @tag: tag to test 2090 1924 */ 2091 - int radix_tree_tagged(struct radix_tree_root *root, unsigned int tag) 1925 + int radix_tree_tagged(const struct radix_tree_root *root, unsigned int tag) 2092 1926 { 2093 1927 return root_tag_get(root, tag); 2094 1928 } 2095 1929 EXPORT_SYMBOL(radix_tree_tagged); 1930 + 1931 + /** 1932 + * idr_preload - preload for idr_alloc() 1933 + * @gfp_mask: allocation mask to use for preloading 1934 + * 1935 + * Preallocate memory to use for the next call to idr_alloc(). This function 1936 + * returns with preemption disabled. It will be enabled by idr_preload_end(). 1937 + */ 1938 + void idr_preload(gfp_t gfp_mask) 1939 + { 1940 + __radix_tree_preload(gfp_mask, IDR_PRELOAD_SIZE); 1941 + } 1942 + EXPORT_SYMBOL(idr_preload); 1943 + 1944 + /** 1945 + * ida_pre_get - reserve resources for ida allocation 1946 + * @ida: ida handle 1947 + * @gfp: memory allocation flags 1948 + * 1949 + * This function should be called before calling ida_get_new_above(). If it 1950 + * is unable to allocate memory, it will return %0. On success, it returns %1. 1951 + */ 1952 + int ida_pre_get(struct ida *ida, gfp_t gfp) 1953 + { 1954 + __radix_tree_preload(gfp, IDA_PRELOAD_SIZE); 1955 + /* 1956 + * The IDA API has no preload_end() equivalent. Instead, 1957 + * ida_get_new() can return -EAGAIN, prompting the caller 1958 + * to return to the ida_pre_get() step. 1959 + */ 1960 + preempt_enable(); 1961 + 1962 + if (!this_cpu_read(ida_bitmap)) { 1963 + struct ida_bitmap *bitmap = kmalloc(sizeof(*bitmap), gfp); 1964 + if (!bitmap) 1965 + return 0; 1966 + bitmap = this_cpu_cmpxchg(ida_bitmap, NULL, bitmap); 1967 + kfree(bitmap); 1968 + } 1969 + 1970 + return 1; 1971 + } 1972 + EXPORT_SYMBOL(ida_pre_get); 1973 + 1974 + void __rcu **idr_get_free(struct radix_tree_root *root, 1975 + struct radix_tree_iter *iter, gfp_t gfp, int end) 1976 + { 1977 + struct radix_tree_node *node = NULL, *child; 1978 + void __rcu **slot = (void __rcu **)&root->rnode; 1979 + unsigned long maxindex, start = iter->next_index; 1980 + unsigned long max = end > 0 ? end - 1 : INT_MAX; 1981 + unsigned int shift, offset = 0; 1982 + 1983 + grow: 1984 + shift = radix_tree_load_root(root, &child, &maxindex); 1985 + if (!radix_tree_tagged(root, IDR_FREE)) 1986 + start = max(start, maxindex + 1); 1987 + if (start > max) 1988 + return ERR_PTR(-ENOSPC); 1989 + 1990 + if (start > maxindex) { 1991 + int error = radix_tree_extend(root, gfp, start, shift); 1992 + if (error < 0) 1993 + return ERR_PTR(error); 1994 + shift = error; 1995 + child = rcu_dereference_raw(root->rnode); 1996 + } 1997 + 1998 + while (shift) { 1999 + shift -= RADIX_TREE_MAP_SHIFT; 2000 + if (child == NULL) { 2001 + /* Have to add a child node. */ 2002 + child = radix_tree_node_alloc(gfp, node, root, shift, 2003 + offset, 0, 0); 2004 + if (!child) 2005 + return ERR_PTR(-ENOMEM); 2006 + all_tag_set(child, IDR_FREE); 2007 + rcu_assign_pointer(*slot, node_to_entry(child)); 2008 + if (node) 2009 + node->count++; 2010 + } else if (!radix_tree_is_internal_node(child)) 2011 + break; 2012 + 2013 + node = entry_to_node(child); 2014 + offset = radix_tree_descend(node, &child, start); 2015 + if (!tag_get(node, IDR_FREE, offset)) { 2016 + offset = radix_tree_find_next_bit(node, IDR_FREE, 2017 + offset + 1); 2018 + start = next_index(start, node, offset); 2019 + if (start > max) 2020 + return ERR_PTR(-ENOSPC); 2021 + while (offset == RADIX_TREE_MAP_SIZE) { 2022 + offset = node->offset + 1; 2023 + node = node->parent; 2024 + if (!node) 2025 + goto grow; 2026 + shift = node->shift; 2027 + } 2028 + child = rcu_dereference_raw(node->slots[offset]); 2029 + } 2030 + slot = &node->slots[offset]; 2031 + } 2032 + 2033 + iter->index = start; 2034 + if (node) 2035 + iter->next_index = 1 + min(max, (start | node_maxindex(node))); 2036 + else 2037 + iter->next_index = 1; 2038 + iter->node = node; 2039 + __set_iter_shift(iter, shift); 2040 + set_iter_tags(iter, node, offset, IDR_FREE); 2041 + 2042 + return slot; 2043 + } 2044 + 2045 + /** 2046 + * idr_destroy - release all internal memory from an IDR 2047 + * @idr: idr handle 2048 + * 2049 + * After this function is called, the IDR is empty, and may be reused or 2050 + * the data structure containing it may be freed. 2051 + * 2052 + * A typical clean-up sequence for objects stored in an idr tree will use 2053 + * idr_for_each() to free all objects, if necessary, then idr_destroy() to 2054 + * free the memory used to keep track of those objects. 2055 + */ 2056 + void idr_destroy(struct idr *idr) 2057 + { 2058 + struct radix_tree_node *node = rcu_dereference_raw(idr->idr_rt.rnode); 2059 + if (radix_tree_is_internal_node(node)) 2060 + radix_tree_free_nodes(node); 2061 + idr->idr_rt.rnode = NULL; 2062 + root_tag_set(&idr->idr_rt, IDR_FREE); 2063 + } 2064 + EXPORT_SYMBOL(idr_destroy); 2096 2065 2097 2066 static void 2098 2067 radix_tree_node_ctor(void *arg) ··· 2272 1971 rtp = &per_cpu(radix_tree_preloads, cpu); 2273 1972 while (rtp->nr) { 2274 1973 node = rtp->nodes; 2275 - rtp->nodes = node->private_data; 1974 + rtp->nodes = node->parent; 2276 1975 kmem_cache_free(radix_tree_node_cachep, node); 2277 1976 rtp->nr--; 2278 1977 } 1978 + kfree(per_cpu(ida_bitmap, cpu)); 1979 + per_cpu(ida_bitmap, cpu) = NULL; 2279 1980 return 0; 2280 1981 } 2281 1982
+2 -4
mm/workingset.c
··· 355 355 * as node->private_list is protected by &mapping->tree_lock. 356 356 */ 357 357 if (node->count && node->count == node->exceptional) { 358 - if (list_empty(&node->private_list)) { 359 - node->private_data = mapping; 358 + if (list_empty(&node->private_list)) 360 359 list_lru_add(&shadow_nodes, &node->private_list); 361 - } 362 360 } else { 363 361 if (!list_empty(&node->private_list)) 364 362 list_lru_del(&shadow_nodes, &node->private_list); ··· 434 436 */ 435 437 436 438 node = container_of(item, struct radix_tree_node, private_list); 437 - mapping = node->private_data; 439 + mapping = container_of(node->root, struct address_space, page_tree); 438 440 439 441 /* Coming from the list, invert the lock order */ 440 442 if (!spin_trylock(&mapping->tree_lock)) {
+1 -3
net/mac80211/status.c
··· 462 462 unsigned long flags; 463 463 464 464 spin_lock_irqsave(&local->ack_status_lock, flags); 465 - skb = idr_find(&local->ack_status_frames, info->ack_frame_id); 466 - if (skb) 467 - idr_remove(&local->ack_status_frames, info->ack_frame_id); 465 + skb = idr_remove(&local->ack_status_frames, info->ack_frame_id); 468 466 spin_unlock_irqrestore(&local->ack_status_lock, flags); 469 467 470 468 if (!skb)
+3
tools/include/asm-generic/bitops/atomic.h
··· 20 20 (((unsigned long *)addr)[nr / __BITS_PER_LONG])) != 0; 21 21 } 22 22 23 + #define __set_bit(nr, addr) set_bit(nr, addr) 24 + #define __clear_bit(nr, addr) clear_bit(nr, addr) 25 + 23 26 #endif /* _TOOLS_LINUX_ASM_GENERIC_BITOPS_ATOMIC_H_ */
+8
tools/include/asm/bug.h
··· 12 12 unlikely(__ret_warn_on); \ 13 13 }) 14 14 15 + #define WARN_ON(condition) ({ \ 16 + int __ret_warn_on = !!(condition); \ 17 + if (unlikely(__ret_warn_on)) \ 18 + __WARN_printf("assertion failed at %s:%d\n", \ 19 + __FILE__, __LINE__); \ 20 + unlikely(__ret_warn_on); \ 21 + }) 22 + 15 23 #define WARN_ON_ONCE(condition) ({ \ 16 24 static int __warned; \ 17 25 int __ret_warn_once = !!(condition); \
+1
tools/include/linux/bitmap.h
··· 4 4 #include <string.h> 5 5 #include <linux/bitops.h> 6 6 #include <stdlib.h> 7 + #include <linux/kernel.h> 7 8 8 9 #define DECLARE_BITMAP(name,bits) \ 9 10 unsigned long name[BITS_TO_LONGS(bits)]
-1
tools/include/linux/bitops.h
··· 2 2 #define _TOOLS_LINUX_BITOPS_H_ 3 3 4 4 #include <asm/types.h> 5 - #include <linux/kernel.h> 6 5 #include <linux/compiler.h> 7 6 8 7 #ifndef __WORDSIZE
+4
tools/include/linux/compiler.h
··· 25 25 #endif 26 26 27 27 #define __user 28 + #define __rcu 29 + #define __read_mostly 28 30 29 31 #ifndef __attribute_const__ 30 32 # define __attribute_const__ ··· 55 53 #ifndef unlikely 56 54 # define unlikely(x) __builtin_expect(!!(x), 0) 57 55 #endif 56 + 57 + #define uninitialized_var(x) x = *(&(x)) 58 58 59 59 #define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x)) 60 60
+5
tools/include/linux/spinlock.h
··· 1 + #define spinlock_t pthread_mutex_t 2 + #define DEFINE_SPINLOCK(x) pthread_mutex_t x = PTHREAD_MUTEX_INITIALIZER; 3 + 4 + #define spin_lock_irqsave(x, f) (void)f, pthread_mutex_lock(x) 5 + #define spin_unlock_irqrestore(x, f) (void)f, pthread_mutex_unlock(x)
+4
tools/testing/radix-tree/.gitignore
··· 1 + generated/map-shift.h 2 + idr.c 3 + idr-test 1 4 main 5 + multiorder 2 6 radix-tree.c
+32 -14
tools/testing/radix-tree/Makefile
··· 1 1 2 - CFLAGS += -I. -I../../include -g -O2 -Wall -D_LGPL_SOURCE 2 + CFLAGS += -I. -I../../include -g -O2 -Wall -D_LGPL_SOURCE -fsanitize=address 3 3 LDFLAGS += -lpthread -lurcu 4 - TARGETS = main 5 - OFILES = main.o radix-tree.o linux.o test.o tag_check.o find_next_bit.o \ 6 - regression1.o regression2.o regression3.o multiorder.o \ 7 - iteration_check.o benchmark.o 4 + TARGETS = main idr-test multiorder 5 + CORE_OFILES := radix-tree.o idr.o linux.o test.o find_bit.o 6 + OFILES = main.o $(CORE_OFILES) regression1.o regression2.o regression3.o \ 7 + tag_check.o multiorder.o idr-test.o iteration_check.o benchmark.o 8 8 9 - ifdef BENCHMARK 10 - CFLAGS += -DBENCHMARK=1 9 + ifndef SHIFT 10 + SHIFT=3 11 11 endif 12 12 13 - targets: $(TARGETS) 13 + targets: mapshift $(TARGETS) 14 14 15 15 main: $(OFILES) 16 - $(CC) $(CFLAGS) $(LDFLAGS) $(OFILES) -o main 16 + $(CC) $(CFLAGS) $(LDFLAGS) $^ -o main 17 + 18 + idr-test: idr-test.o $(CORE_OFILES) 19 + $(CC) $(CFLAGS) $(LDFLAGS) $^ -o idr-test 20 + 21 + multiorder: multiorder.o $(CORE_OFILES) 22 + $(CC) $(CFLAGS) $(LDFLAGS) $^ -o multiorder 17 23 18 24 clean: 19 - $(RM) -f $(TARGETS) *.o radix-tree.c 25 + $(RM) $(TARGETS) *.o radix-tree.c idr.c generated/map-shift.h 20 26 21 - find_next_bit.o: ../../lib/find_bit.c 22 - $(CC) $(CFLAGS) -c -o $@ $< 27 + vpath %.c ../../lib 23 28 24 - $(OFILES): *.h */*.h \ 29 + $(OFILES): *.h */*.h generated/map-shift.h \ 25 30 ../../include/linux/*.h \ 26 - ../../../include/linux/radix-tree.h 31 + ../../include/asm/*.h \ 32 + ../../../include/linux/radix-tree.h \ 33 + ../../../include/linux/idr.h 27 34 28 35 radix-tree.c: ../../../lib/radix-tree.c 29 36 sed -e 's/^static //' -e 's/__always_inline //' -e 's/inline //' < $< > $@ 37 + 38 + idr.c: ../../../lib/idr.c 39 + sed -e 's/^static //' -e 's/__always_inline //' -e 's/inline //' < $< > $@ 40 + 41 + .PHONY: mapshift 42 + 43 + mapshift: 44 + @if ! grep -qw $(SHIFT) generated/map-shift.h; then \ 45 + echo "#define RADIX_TREE_MAP_SHIFT $(SHIFT)" > \ 46 + generated/map-shift.h; \ 47 + fi
+3 -3
tools/testing/radix-tree/benchmark.c
··· 71 71 tagged = benchmark_iter(&tree, true); 72 72 normal = benchmark_iter(&tree, false); 73 73 74 - printf("Size %ld, step %6ld, order %d tagged %10lld ns, normal %10lld ns\n", 74 + printv(2, "Size %ld, step %6ld, order %d tagged %10lld ns, normal %10lld ns\n", 75 75 size, step, order, tagged, normal); 76 76 77 77 item_kill_tree(&tree); ··· 85 85 128, 256, 512, 12345, 0}; 86 86 int c, s; 87 87 88 - printf("starting benchmarks\n"); 89 - printf("RADIX_TREE_MAP_SHIFT = %d\n", RADIX_TREE_MAP_SHIFT); 88 + printv(1, "starting benchmarks\n"); 89 + printv(1, "RADIX_TREE_MAP_SHIFT = %d\n", RADIX_TREE_MAP_SHIFT); 90 90 91 91 for (c = 0; size[c]; c++) 92 92 for (s = 0; step[s]; s++)
-2
tools/testing/radix-tree/generated/autoconf.h
··· 1 1 #define CONFIG_RADIX_TREE_MULTIORDER 1 2 - #define CONFIG_SHMEM 1 3 - #define CONFIG_SWAP 1
+444
tools/testing/radix-tree/idr-test.c
··· 1 + /* 2 + * idr-test.c: Test the IDR API 3 + * Copyright (c) 2016 Matthew Wilcox <willy@infradead.org> 4 + * 5 + * This program is free software; you can redistribute it and/or modify it 6 + * under the terms and conditions of the GNU General Public License, 7 + * version 2, as published by the Free Software Foundation. 8 + * 9 + * This program is distributed in the hope it will be useful, but WITHOUT 10 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 + * more details. 13 + */ 14 + #include <linux/bitmap.h> 15 + #include <linux/idr.h> 16 + #include <linux/slab.h> 17 + #include <linux/kernel.h> 18 + #include <linux/errno.h> 19 + 20 + #include "test.h" 21 + 22 + #define DUMMY_PTR ((void *)0x12) 23 + 24 + int item_idr_free(int id, void *p, void *data) 25 + { 26 + struct item *item = p; 27 + assert(item->index == id); 28 + free(p); 29 + 30 + return 0; 31 + } 32 + 33 + void item_idr_remove(struct idr *idr, int id) 34 + { 35 + struct item *item = idr_find(idr, id); 36 + assert(item->index == id); 37 + idr_remove(idr, id); 38 + free(item); 39 + } 40 + 41 + void idr_alloc_test(void) 42 + { 43 + unsigned long i; 44 + DEFINE_IDR(idr); 45 + 46 + assert(idr_alloc_cyclic(&idr, DUMMY_PTR, 0, 0x4000, GFP_KERNEL) == 0); 47 + assert(idr_alloc_cyclic(&idr, DUMMY_PTR, 0x3ffd, 0x4000, GFP_KERNEL) == 0x3ffd); 48 + idr_remove(&idr, 0x3ffd); 49 + idr_remove(&idr, 0); 50 + 51 + for (i = 0x3ffe; i < 0x4003; i++) { 52 + int id; 53 + struct item *item; 54 + 55 + if (i < 0x4000) 56 + item = item_create(i, 0); 57 + else 58 + item = item_create(i - 0x3fff, 0); 59 + 60 + id = idr_alloc_cyclic(&idr, item, 1, 0x4000, GFP_KERNEL); 61 + assert(id == item->index); 62 + } 63 + 64 + idr_for_each(&idr, item_idr_free, &idr); 65 + idr_destroy(&idr); 66 + } 67 + 68 + void idr_replace_test(void) 69 + { 70 + DEFINE_IDR(idr); 71 + 72 + idr_alloc(&idr, (void *)-1, 10, 11, GFP_KERNEL); 73 + idr_replace(&idr, &idr, 10); 74 + 75 + idr_destroy(&idr); 76 + } 77 + 78 + /* 79 + * Unlike the radix tree, you can put a NULL pointer -- with care -- into 80 + * the IDR. Some interfaces, like idr_find() do not distinguish between 81 + * "present, value is NULL" and "not present", but that's exactly what some 82 + * users want. 83 + */ 84 + void idr_null_test(void) 85 + { 86 + int i; 87 + DEFINE_IDR(idr); 88 + 89 + assert(idr_is_empty(&idr)); 90 + 91 + assert(idr_alloc(&idr, NULL, 0, 0, GFP_KERNEL) == 0); 92 + assert(!idr_is_empty(&idr)); 93 + idr_remove(&idr, 0); 94 + assert(idr_is_empty(&idr)); 95 + 96 + assert(idr_alloc(&idr, NULL, 0, 0, GFP_KERNEL) == 0); 97 + assert(!idr_is_empty(&idr)); 98 + idr_destroy(&idr); 99 + assert(idr_is_empty(&idr)); 100 + 101 + for (i = 0; i < 10; i++) { 102 + assert(idr_alloc(&idr, NULL, 0, 0, GFP_KERNEL) == i); 103 + } 104 + 105 + assert(idr_replace(&idr, DUMMY_PTR, 3) == NULL); 106 + assert(idr_replace(&idr, DUMMY_PTR, 4) == NULL); 107 + assert(idr_replace(&idr, NULL, 4) == DUMMY_PTR); 108 + assert(idr_replace(&idr, DUMMY_PTR, 11) == ERR_PTR(-ENOENT)); 109 + idr_remove(&idr, 5); 110 + assert(idr_alloc(&idr, NULL, 0, 0, GFP_KERNEL) == 5); 111 + idr_remove(&idr, 5); 112 + 113 + for (i = 0; i < 9; i++) { 114 + idr_remove(&idr, i); 115 + assert(!idr_is_empty(&idr)); 116 + } 117 + idr_remove(&idr, 8); 118 + assert(!idr_is_empty(&idr)); 119 + idr_remove(&idr, 9); 120 + assert(idr_is_empty(&idr)); 121 + 122 + assert(idr_alloc(&idr, NULL, 0, 0, GFP_KERNEL) == 0); 123 + assert(idr_replace(&idr, DUMMY_PTR, 3) == ERR_PTR(-ENOENT)); 124 + assert(idr_replace(&idr, DUMMY_PTR, 0) == NULL); 125 + assert(idr_replace(&idr, NULL, 0) == DUMMY_PTR); 126 + 127 + idr_destroy(&idr); 128 + assert(idr_is_empty(&idr)); 129 + 130 + for (i = 1; i < 10; i++) { 131 + assert(idr_alloc(&idr, NULL, 1, 0, GFP_KERNEL) == i); 132 + } 133 + 134 + idr_destroy(&idr); 135 + assert(idr_is_empty(&idr)); 136 + } 137 + 138 + void idr_nowait_test(void) 139 + { 140 + unsigned int i; 141 + DEFINE_IDR(idr); 142 + 143 + idr_preload(GFP_KERNEL); 144 + 145 + for (i = 0; i < 3; i++) { 146 + struct item *item = item_create(i, 0); 147 + assert(idr_alloc(&idr, item, i, i + 1, GFP_NOWAIT) == i); 148 + } 149 + 150 + idr_preload_end(); 151 + 152 + idr_for_each(&idr, item_idr_free, &idr); 153 + idr_destroy(&idr); 154 + } 155 + 156 + void idr_checks(void) 157 + { 158 + unsigned long i; 159 + DEFINE_IDR(idr); 160 + 161 + for (i = 0; i < 10000; i++) { 162 + struct item *item = item_create(i, 0); 163 + assert(idr_alloc(&idr, item, 0, 20000, GFP_KERNEL) == i); 164 + } 165 + 166 + assert(idr_alloc(&idr, DUMMY_PTR, 5, 30, GFP_KERNEL) < 0); 167 + 168 + for (i = 0; i < 5000; i++) 169 + item_idr_remove(&idr, i); 170 + 171 + idr_remove(&idr, 3); 172 + 173 + idr_for_each(&idr, item_idr_free, &idr); 174 + idr_destroy(&idr); 175 + 176 + assert(idr_is_empty(&idr)); 177 + 178 + idr_remove(&idr, 3); 179 + idr_remove(&idr, 0); 180 + 181 + for (i = INT_MAX - 3UL; i < INT_MAX + 1UL; i++) { 182 + struct item *item = item_create(i, 0); 183 + assert(idr_alloc(&idr, item, i, i + 10, GFP_KERNEL) == i); 184 + } 185 + assert(idr_alloc(&idr, DUMMY_PTR, i - 2, i, GFP_KERNEL) == -ENOSPC); 186 + 187 + idr_for_each(&idr, item_idr_free, &idr); 188 + idr_destroy(&idr); 189 + idr_destroy(&idr); 190 + 191 + assert(idr_is_empty(&idr)); 192 + 193 + for (i = 1; i < 10000; i++) { 194 + struct item *item = item_create(i, 0); 195 + assert(idr_alloc(&idr, item, 1, 20000, GFP_KERNEL) == i); 196 + } 197 + 198 + idr_for_each(&idr, item_idr_free, &idr); 199 + idr_destroy(&idr); 200 + 201 + idr_replace_test(); 202 + idr_alloc_test(); 203 + idr_null_test(); 204 + idr_nowait_test(); 205 + } 206 + 207 + /* 208 + * Check that we get the correct error when we run out of memory doing 209 + * allocations. To ensure we run out of memory, just "forget" to preload. 210 + * The first test is for not having a bitmap available, and the second test 211 + * is for not being able to allocate a level of the radix tree. 212 + */ 213 + void ida_check_nomem(void) 214 + { 215 + DEFINE_IDA(ida); 216 + int id, err; 217 + 218 + err = ida_get_new_above(&ida, 256, &id); 219 + assert(err == -EAGAIN); 220 + err = ida_get_new_above(&ida, 1UL << 30, &id); 221 + assert(err == -EAGAIN); 222 + } 223 + 224 + /* 225 + * Check what happens when we fill a leaf and then delete it. This may 226 + * discover mishandling of IDR_FREE. 227 + */ 228 + void ida_check_leaf(void) 229 + { 230 + DEFINE_IDA(ida); 231 + int id; 232 + unsigned long i; 233 + 234 + for (i = 0; i < IDA_BITMAP_BITS; i++) { 235 + assert(ida_pre_get(&ida, GFP_KERNEL)); 236 + assert(!ida_get_new(&ida, &id)); 237 + assert(id == i); 238 + } 239 + 240 + ida_destroy(&ida); 241 + assert(ida_is_empty(&ida)); 242 + 243 + assert(ida_pre_get(&ida, GFP_KERNEL)); 244 + assert(!ida_get_new(&ida, &id)); 245 + assert(id == 0); 246 + ida_destroy(&ida); 247 + assert(ida_is_empty(&ida)); 248 + } 249 + 250 + /* 251 + * Check handling of conversions between exceptional entries and full bitmaps. 252 + */ 253 + void ida_check_conv(void) 254 + { 255 + DEFINE_IDA(ida); 256 + int id; 257 + unsigned long i; 258 + 259 + for (i = 0; i < IDA_BITMAP_BITS * 2; i += IDA_BITMAP_BITS) { 260 + assert(ida_pre_get(&ida, GFP_KERNEL)); 261 + assert(!ida_get_new_above(&ida, i + 1, &id)); 262 + assert(id == i + 1); 263 + assert(!ida_get_new_above(&ida, i + BITS_PER_LONG, &id)); 264 + assert(id == i + BITS_PER_LONG); 265 + ida_remove(&ida, i + 1); 266 + ida_remove(&ida, i + BITS_PER_LONG); 267 + assert(ida_is_empty(&ida)); 268 + } 269 + 270 + assert(ida_pre_get(&ida, GFP_KERNEL)); 271 + 272 + for (i = 0; i < IDA_BITMAP_BITS * 2; i++) { 273 + assert(ida_pre_get(&ida, GFP_KERNEL)); 274 + assert(!ida_get_new(&ida, &id)); 275 + assert(id == i); 276 + } 277 + 278 + for (i = IDA_BITMAP_BITS * 2; i > 0; i--) { 279 + ida_remove(&ida, i - 1); 280 + } 281 + assert(ida_is_empty(&ida)); 282 + 283 + for (i = 0; i < IDA_BITMAP_BITS + BITS_PER_LONG - 4; i++) { 284 + assert(ida_pre_get(&ida, GFP_KERNEL)); 285 + assert(!ida_get_new(&ida, &id)); 286 + assert(id == i); 287 + } 288 + 289 + for (i = IDA_BITMAP_BITS + BITS_PER_LONG - 4; i > 0; i--) { 290 + ida_remove(&ida, i - 1); 291 + } 292 + assert(ida_is_empty(&ida)); 293 + 294 + radix_tree_cpu_dead(1); 295 + for (i = 0; i < 1000000; i++) { 296 + int err = ida_get_new(&ida, &id); 297 + if (err == -EAGAIN) { 298 + assert((i % IDA_BITMAP_BITS) == (BITS_PER_LONG - 2)); 299 + assert(ida_pre_get(&ida, GFP_KERNEL)); 300 + err = ida_get_new(&ida, &id); 301 + } else { 302 + assert((i % IDA_BITMAP_BITS) != (BITS_PER_LONG - 2)); 303 + } 304 + assert(!err); 305 + assert(id == i); 306 + } 307 + ida_destroy(&ida); 308 + } 309 + 310 + /* 311 + * Check allocations up to and slightly above the maximum allowed (2^31-1) ID. 312 + * Allocating up to 2^31-1 should succeed, and then allocating the next one 313 + * should fail. 314 + */ 315 + void ida_check_max(void) 316 + { 317 + DEFINE_IDA(ida); 318 + int id, err; 319 + unsigned long i, j; 320 + 321 + for (j = 1; j < 65537; j *= 2) { 322 + unsigned long base = (1UL << 31) - j; 323 + for (i = 0; i < j; i++) { 324 + assert(ida_pre_get(&ida, GFP_KERNEL)); 325 + assert(!ida_get_new_above(&ida, base, &id)); 326 + assert(id == base + i); 327 + } 328 + assert(ida_pre_get(&ida, GFP_KERNEL)); 329 + err = ida_get_new_above(&ida, base, &id); 330 + assert(err == -ENOSPC); 331 + ida_destroy(&ida); 332 + assert(ida_is_empty(&ida)); 333 + rcu_barrier(); 334 + } 335 + } 336 + 337 + void ida_check_random(void) 338 + { 339 + DEFINE_IDA(ida); 340 + DECLARE_BITMAP(bitmap, 2048); 341 + int id; 342 + unsigned int i; 343 + time_t s = time(NULL); 344 + 345 + repeat: 346 + memset(bitmap, 0, sizeof(bitmap)); 347 + for (i = 0; i < 100000; i++) { 348 + int i = rand(); 349 + int bit = i & 2047; 350 + if (test_bit(bit, bitmap)) { 351 + __clear_bit(bit, bitmap); 352 + ida_remove(&ida, bit); 353 + } else { 354 + __set_bit(bit, bitmap); 355 + ida_pre_get(&ida, GFP_KERNEL); 356 + assert(!ida_get_new_above(&ida, bit, &id)); 357 + assert(id == bit); 358 + } 359 + } 360 + ida_destroy(&ida); 361 + if (time(NULL) < s + 10) 362 + goto repeat; 363 + } 364 + 365 + void ida_checks(void) 366 + { 367 + DEFINE_IDA(ida); 368 + int id; 369 + unsigned long i; 370 + 371 + radix_tree_cpu_dead(1); 372 + ida_check_nomem(); 373 + 374 + for (i = 0; i < 10000; i++) { 375 + assert(ida_pre_get(&ida, GFP_KERNEL)); 376 + assert(!ida_get_new(&ida, &id)); 377 + assert(id == i); 378 + } 379 + 380 + ida_remove(&ida, 20); 381 + ida_remove(&ida, 21); 382 + for (i = 0; i < 3; i++) { 383 + assert(ida_pre_get(&ida, GFP_KERNEL)); 384 + assert(!ida_get_new(&ida, &id)); 385 + if (i == 2) 386 + assert(id == 10000); 387 + } 388 + 389 + for (i = 0; i < 5000; i++) 390 + ida_remove(&ida, i); 391 + 392 + assert(ida_pre_get(&ida, GFP_KERNEL)); 393 + assert(!ida_get_new_above(&ida, 5000, &id)); 394 + assert(id == 10001); 395 + 396 + ida_destroy(&ida); 397 + 398 + assert(ida_is_empty(&ida)); 399 + 400 + assert(ida_pre_get(&ida, GFP_KERNEL)); 401 + assert(!ida_get_new_above(&ida, 1, &id)); 402 + assert(id == 1); 403 + 404 + ida_remove(&ida, id); 405 + assert(ida_is_empty(&ida)); 406 + ida_destroy(&ida); 407 + assert(ida_is_empty(&ida)); 408 + 409 + assert(ida_pre_get(&ida, GFP_KERNEL)); 410 + assert(!ida_get_new_above(&ida, 1, &id)); 411 + ida_destroy(&ida); 412 + assert(ida_is_empty(&ida)); 413 + 414 + assert(ida_pre_get(&ida, GFP_KERNEL)); 415 + assert(!ida_get_new_above(&ida, 1, &id)); 416 + assert(id == 1); 417 + assert(ida_pre_get(&ida, GFP_KERNEL)); 418 + assert(!ida_get_new_above(&ida, 1025, &id)); 419 + assert(id == 1025); 420 + assert(ida_pre_get(&ida, GFP_KERNEL)); 421 + assert(!ida_get_new_above(&ida, 10000, &id)); 422 + assert(id == 10000); 423 + ida_remove(&ida, 1025); 424 + ida_destroy(&ida); 425 + assert(ida_is_empty(&ida)); 426 + 427 + ida_check_leaf(); 428 + ida_check_max(); 429 + ida_check_conv(); 430 + ida_check_random(); 431 + 432 + radix_tree_cpu_dead(1); 433 + } 434 + 435 + int __weak main(void) 436 + { 437 + radix_tree_init(); 438 + idr_checks(); 439 + ida_checks(); 440 + rcu_barrier(); 441 + if (nr_allocated) 442 + printf("nr_allocated = %d\n", nr_allocated); 443 + return 0; 444 + }
+1 -1
tools/testing/radix-tree/iteration_check.c
··· 177 177 { 178 178 int i; 179 179 180 - printf("Running %siteration tests for %d seconds\n", 180 + printv(1, "Running %siteration tests for %d seconds\n", 181 181 order > 0 ? "multiorder " : "", test_duration); 182 182 183 183 max_order = order;
+14 -25
tools/testing/radix-tree/linux.c
··· 5 5 #include <unistd.h> 6 6 #include <assert.h> 7 7 8 - #include <linux/mempool.h> 8 + #include <linux/gfp.h> 9 9 #include <linux/poison.h> 10 10 #include <linux/slab.h> 11 11 #include <linux/radix-tree.h> ··· 13 13 14 14 int nr_allocated; 15 15 int preempt_count; 16 + int kmalloc_verbose; 17 + int test_verbose; 16 18 17 19 struct kmem_cache { 18 20 pthread_mutex_t lock; ··· 23 21 void *objs; 24 22 void (*ctor)(void *); 25 23 }; 26 - 27 - void *mempool_alloc(mempool_t *pool, int gfp_mask) 28 - { 29 - return pool->alloc(gfp_mask, pool->data); 30 - } 31 - 32 - void mempool_free(void *element, mempool_t *pool) 33 - { 34 - pool->free(element, pool->data); 35 - } 36 - 37 - mempool_t *mempool_create(int min_nr, mempool_alloc_t *alloc_fn, 38 - mempool_free_t *free_fn, void *pool_data) 39 - { 40 - mempool_t *ret = malloc(sizeof(*ret)); 41 - 42 - ret->alloc = alloc_fn; 43 - ret->free = free_fn; 44 - ret->data = pool_data; 45 - return ret; 46 - } 47 24 48 25 void *kmem_cache_alloc(struct kmem_cache *cachep, int flags) 49 26 { ··· 35 54 if (cachep->nr_objs) { 36 55 cachep->nr_objs--; 37 56 node = cachep->objs; 38 - cachep->objs = node->private_data; 57 + cachep->objs = node->parent; 39 58 pthread_mutex_unlock(&cachep->lock); 40 - node->private_data = NULL; 59 + node->parent = NULL; 41 60 } else { 42 61 pthread_mutex_unlock(&cachep->lock); 43 62 node = malloc(cachep->size); ··· 46 65 } 47 66 48 67 uatomic_inc(&nr_allocated); 68 + if (kmalloc_verbose) 69 + printf("Allocating %p from slab\n", node); 49 70 return node; 50 71 } 51 72 ··· 55 72 { 56 73 assert(objp); 57 74 uatomic_dec(&nr_allocated); 75 + if (kmalloc_verbose) 76 + printf("Freeing %p to slab\n", objp); 58 77 pthread_mutex_lock(&cachep->lock); 59 78 if (cachep->nr_objs > 10) { 60 79 memset(objp, POISON_FREE, cachep->size); ··· 64 79 } else { 65 80 struct radix_tree_node *node = objp; 66 81 cachep->nr_objs++; 67 - node->private_data = cachep->objs; 82 + node->parent = cachep->objs; 68 83 cachep->objs = node; 69 84 } 70 85 pthread_mutex_unlock(&cachep->lock); ··· 74 89 { 75 90 void *ret = malloc(size); 76 91 uatomic_inc(&nr_allocated); 92 + if (kmalloc_verbose) 93 + printf("Allocating %p from malloc\n", ret); 77 94 return ret; 78 95 } 79 96 ··· 84 97 if (!p) 85 98 return; 86 99 uatomic_dec(&nr_allocated); 100 + if (kmalloc_verbose) 101 + printf("Freeing %p to malloc\n", p); 87 102 free(p); 88 103 } 89 104
-160
tools/testing/radix-tree/linux/bitops.h
··· 1 - #ifndef _ASM_GENERIC_BITOPS_NON_ATOMIC_H_ 2 - #define _ASM_GENERIC_BITOPS_NON_ATOMIC_H_ 3 - 4 - #include <linux/types.h> 5 - #include <linux/bitops/find.h> 6 - #include <linux/bitops/hweight.h> 7 - #include <linux/kernel.h> 8 - 9 - #define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG)) 10 - #define BIT_WORD(nr) ((nr) / BITS_PER_LONG) 11 - #define BITS_PER_BYTE 8 12 - #define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long)) 13 - 14 - /** 15 - * __set_bit - Set a bit in memory 16 - * @nr: the bit to set 17 - * @addr: the address to start counting from 18 - * 19 - * Unlike set_bit(), this function is non-atomic and may be reordered. 20 - * If it's called on the same region of memory simultaneously, the effect 21 - * may be that only one operation succeeds. 22 - */ 23 - static inline void __set_bit(int nr, volatile unsigned long *addr) 24 - { 25 - unsigned long mask = BIT_MASK(nr); 26 - unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); 27 - 28 - *p |= mask; 29 - } 30 - 31 - static inline void __clear_bit(int nr, volatile unsigned long *addr) 32 - { 33 - unsigned long mask = BIT_MASK(nr); 34 - unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); 35 - 36 - *p &= ~mask; 37 - } 38 - 39 - /** 40 - * __change_bit - Toggle a bit in memory 41 - * @nr: the bit to change 42 - * @addr: the address to start counting from 43 - * 44 - * Unlike change_bit(), this function is non-atomic and may be reordered. 45 - * If it's called on the same region of memory simultaneously, the effect 46 - * may be that only one operation succeeds. 47 - */ 48 - static inline void __change_bit(int nr, volatile unsigned long *addr) 49 - { 50 - unsigned long mask = BIT_MASK(nr); 51 - unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); 52 - 53 - *p ^= mask; 54 - } 55 - 56 - /** 57 - * __test_and_set_bit - Set a bit and return its old value 58 - * @nr: Bit to set 59 - * @addr: Address to count from 60 - * 61 - * This operation is non-atomic and can be reordered. 62 - * If two examples of this operation race, one can appear to succeed 63 - * but actually fail. You must protect multiple accesses with a lock. 64 - */ 65 - static inline int __test_and_set_bit(int nr, volatile unsigned long *addr) 66 - { 67 - unsigned long mask = BIT_MASK(nr); 68 - unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); 69 - unsigned long old = *p; 70 - 71 - *p = old | mask; 72 - return (old & mask) != 0; 73 - } 74 - 75 - /** 76 - * __test_and_clear_bit - Clear a bit and return its old value 77 - * @nr: Bit to clear 78 - * @addr: Address to count from 79 - * 80 - * This operation is non-atomic and can be reordered. 81 - * If two examples of this operation race, one can appear to succeed 82 - * but actually fail. You must protect multiple accesses with a lock. 83 - */ 84 - static inline int __test_and_clear_bit(int nr, volatile unsigned long *addr) 85 - { 86 - unsigned long mask = BIT_MASK(nr); 87 - unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); 88 - unsigned long old = *p; 89 - 90 - *p = old & ~mask; 91 - return (old & mask) != 0; 92 - } 93 - 94 - /* WARNING: non atomic and it can be reordered! */ 95 - static inline int __test_and_change_bit(int nr, 96 - volatile unsigned long *addr) 97 - { 98 - unsigned long mask = BIT_MASK(nr); 99 - unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); 100 - unsigned long old = *p; 101 - 102 - *p = old ^ mask; 103 - return (old & mask) != 0; 104 - } 105 - 106 - /** 107 - * test_bit - Determine whether a bit is set 108 - * @nr: bit number to test 109 - * @addr: Address to start counting from 110 - */ 111 - static inline int test_bit(int nr, const volatile unsigned long *addr) 112 - { 113 - return 1UL & (addr[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1))); 114 - } 115 - 116 - /** 117 - * __ffs - find first bit in word. 118 - * @word: The word to search 119 - * 120 - * Undefined if no bit exists, so code should check against 0 first. 121 - */ 122 - static inline unsigned long __ffs(unsigned long word) 123 - { 124 - int num = 0; 125 - 126 - if ((word & 0xffffffff) == 0) { 127 - num += 32; 128 - word >>= 32; 129 - } 130 - if ((word & 0xffff) == 0) { 131 - num += 16; 132 - word >>= 16; 133 - } 134 - if ((word & 0xff) == 0) { 135 - num += 8; 136 - word >>= 8; 137 - } 138 - if ((word & 0xf) == 0) { 139 - num += 4; 140 - word >>= 4; 141 - } 142 - if ((word & 0x3) == 0) { 143 - num += 2; 144 - word >>= 2; 145 - } 146 - if ((word & 0x1) == 0) 147 - num += 1; 148 - return num; 149 - } 150 - 151 - unsigned long find_next_bit(const unsigned long *addr, 152 - unsigned long size, 153 - unsigned long offset); 154 - 155 - static inline unsigned long hweight_long(unsigned long w) 156 - { 157 - return sizeof(w) == 4 ? hweight32(w) : hweight64(w); 158 - } 159 - 160 - #endif /* _ASM_GENERIC_BITOPS_NON_ATOMIC_H_ */
-43
tools/testing/radix-tree/linux/bitops/__ffs.h
··· 1 - #ifndef _ASM_GENERIC_BITOPS___FFS_H_ 2 - #define _ASM_GENERIC_BITOPS___FFS_H_ 3 - 4 - #include <asm/types.h> 5 - 6 - /** 7 - * __ffs - find first bit in word. 8 - * @word: The word to search 9 - * 10 - * Undefined if no bit exists, so code should check against 0 first. 11 - */ 12 - static inline unsigned long __ffs(unsigned long word) 13 - { 14 - int num = 0; 15 - 16 - #if BITS_PER_LONG == 64 17 - if ((word & 0xffffffff) == 0) { 18 - num += 32; 19 - word >>= 32; 20 - } 21 - #endif 22 - if ((word & 0xffff) == 0) { 23 - num += 16; 24 - word >>= 16; 25 - } 26 - if ((word & 0xff) == 0) { 27 - num += 8; 28 - word >>= 8; 29 - } 30 - if ((word & 0xf) == 0) { 31 - num += 4; 32 - word >>= 4; 33 - } 34 - if ((word & 0x3) == 0) { 35 - num += 2; 36 - word >>= 2; 37 - } 38 - if ((word & 0x1) == 0) 39 - num += 1; 40 - return num; 41 - } 42 - 43 - #endif /* _ASM_GENERIC_BITOPS___FFS_H_ */
-41
tools/testing/radix-tree/linux/bitops/ffs.h
··· 1 - #ifndef _ASM_GENERIC_BITOPS_FFS_H_ 2 - #define _ASM_GENERIC_BITOPS_FFS_H_ 3 - 4 - /** 5 - * ffs - find first bit set 6 - * @x: the word to search 7 - * 8 - * This is defined the same way as 9 - * the libc and compiler builtin ffs routines, therefore 10 - * differs in spirit from the above ffz (man ffs). 11 - */ 12 - static inline int ffs(int x) 13 - { 14 - int r = 1; 15 - 16 - if (!x) 17 - return 0; 18 - if (!(x & 0xffff)) { 19 - x >>= 16; 20 - r += 16; 21 - } 22 - if (!(x & 0xff)) { 23 - x >>= 8; 24 - r += 8; 25 - } 26 - if (!(x & 0xf)) { 27 - x >>= 4; 28 - r += 4; 29 - } 30 - if (!(x & 3)) { 31 - x >>= 2; 32 - r += 2; 33 - } 34 - if (!(x & 1)) { 35 - x >>= 1; 36 - r += 1; 37 - } 38 - return r; 39 - } 40 - 41 - #endif /* _ASM_GENERIC_BITOPS_FFS_H_ */
-12
tools/testing/radix-tree/linux/bitops/ffz.h
··· 1 - #ifndef _ASM_GENERIC_BITOPS_FFZ_H_ 2 - #define _ASM_GENERIC_BITOPS_FFZ_H_ 3 - 4 - /* 5 - * ffz - find first zero in word. 6 - * @word: The word to search 7 - * 8 - * Undefined if no zero exists, so code should check against ~0UL first. 9 - */ 10 - #define ffz(x) __ffs(~(x)) 11 - 12 - #endif /* _ASM_GENERIC_BITOPS_FFZ_H_ */
-13
tools/testing/radix-tree/linux/bitops/find.h
··· 1 - #ifndef _ASM_GENERIC_BITOPS_FIND_H_ 2 - #define _ASM_GENERIC_BITOPS_FIND_H_ 3 - 4 - extern unsigned long find_next_bit(const unsigned long *addr, unsigned long 5 - size, unsigned long offset); 6 - 7 - extern unsigned long find_next_zero_bit(const unsigned long *addr, unsigned 8 - long size, unsigned long offset); 9 - 10 - #define find_first_bit(addr, size) find_next_bit((addr), (size), 0) 11 - #define find_first_zero_bit(addr, size) find_next_zero_bit((addr), (size), 0) 12 - 13 - #endif /*_ASM_GENERIC_BITOPS_FIND_H_ */
-41
tools/testing/radix-tree/linux/bitops/fls.h
··· 1 - #ifndef _ASM_GENERIC_BITOPS_FLS_H_ 2 - #define _ASM_GENERIC_BITOPS_FLS_H_ 3 - 4 - /** 5 - * fls - find last (most-significant) bit set 6 - * @x: the word to search 7 - * 8 - * This is defined the same way as ffs. 9 - * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32. 10 - */ 11 - 12 - static inline int fls(int x) 13 - { 14 - int r = 32; 15 - 16 - if (!x) 17 - return 0; 18 - if (!(x & 0xffff0000u)) { 19 - x <<= 16; 20 - r -= 16; 21 - } 22 - if (!(x & 0xff000000u)) { 23 - x <<= 8; 24 - r -= 8; 25 - } 26 - if (!(x & 0xf0000000u)) { 27 - x <<= 4; 28 - r -= 4; 29 - } 30 - if (!(x & 0xc0000000u)) { 31 - x <<= 2; 32 - r -= 2; 33 - } 34 - if (!(x & 0x80000000u)) { 35 - x <<= 1; 36 - r -= 1; 37 - } 38 - return r; 39 - } 40 - 41 - #endif /* _ASM_GENERIC_BITOPS_FLS_H_ */
-14
tools/testing/radix-tree/linux/bitops/fls64.h
··· 1 - #ifndef _ASM_GENERIC_BITOPS_FLS64_H_ 2 - #define _ASM_GENERIC_BITOPS_FLS64_H_ 3 - 4 - #include <asm/types.h> 5 - 6 - static inline int fls64(__u64 x) 7 - { 8 - __u32 h = x >> 32; 9 - if (h) 10 - return fls(h) + 32; 11 - return fls(x); 12 - } 13 - 14 - #endif /* _ASM_GENERIC_BITOPS_FLS64_H_ */
-11
tools/testing/radix-tree/linux/bitops/hweight.h
··· 1 - #ifndef _ASM_GENERIC_BITOPS_HWEIGHT_H_ 2 - #define _ASM_GENERIC_BITOPS_HWEIGHT_H_ 3 - 4 - #include <asm/types.h> 5 - 6 - extern unsigned int hweight32(unsigned int w); 7 - extern unsigned int hweight16(unsigned int w); 8 - extern unsigned int hweight8(unsigned int w); 9 - extern unsigned long hweight64(__u64 w); 10 - 11 - #endif /* _ASM_GENERIC_BITOPS_HWEIGHT_H_ */
-53
tools/testing/radix-tree/linux/bitops/le.h
··· 1 - #ifndef _ASM_GENERIC_BITOPS_LE_H_ 2 - #define _ASM_GENERIC_BITOPS_LE_H_ 3 - 4 - #include <asm/types.h> 5 - #include <asm/byteorder.h> 6 - 7 - #define BITOP_WORD(nr) ((nr) / BITS_PER_LONG) 8 - #define BITOP_LE_SWIZZLE ((BITS_PER_LONG-1) & ~0x7) 9 - 10 - #if defined(__LITTLE_ENDIAN) 11 - 12 - #define generic_test_le_bit(nr, addr) test_bit(nr, addr) 13 - #define generic___set_le_bit(nr, addr) __set_bit(nr, addr) 14 - #define generic___clear_le_bit(nr, addr) __clear_bit(nr, addr) 15 - 16 - #define generic_test_and_set_le_bit(nr, addr) test_and_set_bit(nr, addr) 17 - #define generic_test_and_clear_le_bit(nr, addr) test_and_clear_bit(nr, addr) 18 - 19 - #define generic___test_and_set_le_bit(nr, addr) __test_and_set_bit(nr, addr) 20 - #define generic___test_and_clear_le_bit(nr, addr) __test_and_clear_bit(nr, addr) 21 - 22 - #define generic_find_next_zero_le_bit(addr, size, offset) find_next_zero_bit(addr, size, offset) 23 - 24 - #elif defined(__BIG_ENDIAN) 25 - 26 - #define generic_test_le_bit(nr, addr) \ 27 - test_bit((nr) ^ BITOP_LE_SWIZZLE, (addr)) 28 - #define generic___set_le_bit(nr, addr) \ 29 - __set_bit((nr) ^ BITOP_LE_SWIZZLE, (addr)) 30 - #define generic___clear_le_bit(nr, addr) \ 31 - __clear_bit((nr) ^ BITOP_LE_SWIZZLE, (addr)) 32 - 33 - #define generic_test_and_set_le_bit(nr, addr) \ 34 - test_and_set_bit((nr) ^ BITOP_LE_SWIZZLE, (addr)) 35 - #define generic_test_and_clear_le_bit(nr, addr) \ 36 - test_and_clear_bit((nr) ^ BITOP_LE_SWIZZLE, (addr)) 37 - 38 - #define generic___test_and_set_le_bit(nr, addr) \ 39 - __test_and_set_bit((nr) ^ BITOP_LE_SWIZZLE, (addr)) 40 - #define generic___test_and_clear_le_bit(nr, addr) \ 41 - __test_and_clear_bit((nr) ^ BITOP_LE_SWIZZLE, (addr)) 42 - 43 - extern unsigned long generic_find_next_zero_le_bit(const unsigned long *addr, 44 - unsigned long size, unsigned long offset); 45 - 46 - #else 47 - #error "Please fix <asm/byteorder.h>" 48 - #endif 49 - 50 - #define generic_find_first_zero_le_bit(addr, size) \ 51 - generic_find_next_zero_le_bit((addr), (size), 0) 52 - 53 - #endif /* _ASM_GENERIC_BITOPS_LE_H_ */
-110
tools/testing/radix-tree/linux/bitops/non-atomic.h
··· 1 - #ifndef _ASM_GENERIC_BITOPS_NON_ATOMIC_H_ 2 - #define _ASM_GENERIC_BITOPS_NON_ATOMIC_H_ 3 - 4 - #include <asm/types.h> 5 - 6 - #define BITOP_WORD(nr) ((nr) / BITS_PER_LONG) 7 - 8 - /** 9 - * __set_bit - Set a bit in memory 10 - * @nr: the bit to set 11 - * @addr: the address to start counting from 12 - * 13 - * Unlike set_bit(), this function is non-atomic and may be reordered. 14 - * If it's called on the same region of memory simultaneously, the effect 15 - * may be that only one operation succeeds. 16 - */ 17 - static inline void __set_bit(int nr, volatile unsigned long *addr) 18 - { 19 - unsigned long mask = BIT_MASK(nr); 20 - unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); 21 - 22 - *p |= mask; 23 - } 24 - 25 - static inline void __clear_bit(int nr, volatile unsigned long *addr) 26 - { 27 - unsigned long mask = BIT_MASK(nr); 28 - unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); 29 - 30 - *p &= ~mask; 31 - } 32 - 33 - /** 34 - * __change_bit - Toggle a bit in memory 35 - * @nr: the bit to change 36 - * @addr: the address to start counting from 37 - * 38 - * Unlike change_bit(), this function is non-atomic and may be reordered. 39 - * If it's called on the same region of memory simultaneously, the effect 40 - * may be that only one operation succeeds. 41 - */ 42 - static inline void __change_bit(int nr, volatile unsigned long *addr) 43 - { 44 - unsigned long mask = BIT_MASK(nr); 45 - unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); 46 - 47 - *p ^= mask; 48 - } 49 - 50 - /** 51 - * __test_and_set_bit - Set a bit and return its old value 52 - * @nr: Bit to set 53 - * @addr: Address to count from 54 - * 55 - * This operation is non-atomic and can be reordered. 56 - * If two examples of this operation race, one can appear to succeed 57 - * but actually fail. You must protect multiple accesses with a lock. 58 - */ 59 - static inline int __test_and_set_bit(int nr, volatile unsigned long *addr) 60 - { 61 - unsigned long mask = BIT_MASK(nr); 62 - unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); 63 - unsigned long old = *p; 64 - 65 - *p = old | mask; 66 - return (old & mask) != 0; 67 - } 68 - 69 - /** 70 - * __test_and_clear_bit - Clear a bit and return its old value 71 - * @nr: Bit to clear 72 - * @addr: Address to count from 73 - * 74 - * This operation is non-atomic and can be reordered. 75 - * If two examples of this operation race, one can appear to succeed 76 - * but actually fail. You must protect multiple accesses with a lock. 77 - */ 78 - static inline int __test_and_clear_bit(int nr, volatile unsigned long *addr) 79 - { 80 - unsigned long mask = BIT_MASK(nr); 81 - unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); 82 - unsigned long old = *p; 83 - 84 - *p = old & ~mask; 85 - return (old & mask) != 0; 86 - } 87 - 88 - /* WARNING: non atomic and it can be reordered! */ 89 - static inline int __test_and_change_bit(int nr, 90 - volatile unsigned long *addr) 91 - { 92 - unsigned long mask = BIT_MASK(nr); 93 - unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); 94 - unsigned long old = *p; 95 - 96 - *p = old ^ mask; 97 - return (old & mask) != 0; 98 - } 99 - 100 - /** 101 - * test_bit - Determine whether a bit is set 102 - * @nr: bit number to test 103 - * @addr: Address to start counting from 104 - */ 105 - static inline int test_bit(int nr, const volatile unsigned long *addr) 106 - { 107 - return 1UL & (addr[BITOP_WORD(nr)] >> (nr & (BITS_PER_LONG-1))); 108 - } 109 - 110 - #endif /* _ASM_GENERIC_BITOPS_NON_ATOMIC_H_ */
-2
tools/testing/radix-tree/linux/export.h
··· 1 - 2 - #define EXPORT_SYMBOL(sym)
+7 -3
tools/testing/radix-tree/linux/gfp.h
··· 1 1 #ifndef _GFP_H 2 2 #define _GFP_H 3 3 4 + #include <linux/types.h> 5 + 4 6 #define __GFP_BITS_SHIFT 26 5 7 #define __GFP_BITS_MASK ((gfp_t)((1 << __GFP_BITS_SHIFT) - 1)) 6 8 ··· 15 13 #define __GFP_DIRECT_RECLAIM 0x400000u 16 14 #define __GFP_KSWAPD_RECLAIM 0x2000000u 17 15 18 - #define __GFP_RECLAIM (__GFP_DIRECT_RECLAIM|__GFP_KSWAPD_RECLAIM) 16 + #define __GFP_RECLAIM (__GFP_DIRECT_RECLAIM|__GFP_KSWAPD_RECLAIM) 19 17 20 - #define GFP_ATOMIC (__GFP_HIGH|__GFP_ATOMIC|__GFP_KSWAPD_RECLAIM) 21 - #define GFP_KERNEL (__GFP_RECLAIM | __GFP_IO | __GFP_FS) 18 + #define GFP_ATOMIC (__GFP_HIGH|__GFP_ATOMIC|__GFP_KSWAPD_RECLAIM) 19 + #define GFP_KERNEL (__GFP_RECLAIM | __GFP_IO | __GFP_FS) 20 + #define GFP_NOWAIT (__GFP_KSWAPD_RECLAIM) 21 + 22 22 23 23 static inline bool gfpflags_allow_blocking(const gfp_t gfp_flags) 24 24 {
+1
tools/testing/radix-tree/linux/idr.h
··· 1 + #include "../../../../include/linux/idr.h"
+1 -1
tools/testing/radix-tree/linux/init.h
··· 1 - /* An empty file stub that allows radix-tree.c to compile. */ 1 + #define __init
+6 -49
tools/testing/radix-tree/linux/kernel.h
··· 1 1 #ifndef _KERNEL_H 2 2 #define _KERNEL_H 3 3 4 - #include <assert.h> 4 + #include "../../include/linux/kernel.h" 5 5 #include <string.h> 6 6 #include <stdio.h> 7 - #include <stddef.h> 8 7 #include <limits.h> 9 8 10 - #include "../../include/linux/compiler.h" 11 - #include "../../include/linux/err.h" 9 + #include <linux/compiler.h> 10 + #include <linux/err.h> 11 + #include <linux/bitops.h> 12 + #include <linux/log2.h> 12 13 #include "../../../include/linux/kconfig.h" 13 14 14 - #ifdef BENCHMARK 15 - #define RADIX_TREE_MAP_SHIFT 6 16 - #else 17 - #define RADIX_TREE_MAP_SHIFT 3 18 - #endif 19 - 20 - #ifndef NULL 21 - #define NULL 0 22 - #endif 23 - 24 - #define BUG_ON(expr) assert(!(expr)) 25 - #define WARN_ON(expr) assert(!(expr)) 26 - #define __init 27 - #define __must_check 28 - #define panic(expr) 29 15 #define printk printf 30 - #define __force 31 - #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) 32 16 #define pr_debug printk 33 - 34 - #define smp_rmb() barrier() 35 - #define smp_wmb() barrier() 36 - #define cpu_relax() barrier() 17 + #define pr_cont printk 37 18 38 19 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) 39 - 40 - #define container_of(ptr, type, member) ({ \ 41 - const typeof( ((type *)0)->member ) *__mptr = (ptr); \ 42 - (type *)( (char *)__mptr - offsetof(type, member) );}) 43 - #define min(a, b) ((a) < (b) ? (a) : (b)) 44 - 45 - #define cond_resched() sched_yield() 46 - 47 - static inline int in_interrupt(void) 48 - { 49 - return 0; 50 - } 51 - 52 - /* 53 - * This looks more complex than it should be. But we need to 54 - * get the type for the ~ right in round_down (it needs to be 55 - * as wide as the result!), and we want to evaluate the macro 56 - * arguments just once each. 57 - */ 58 - #define __round_mask(x, y) ((__typeof__(x))((y)-1)) 59 - #define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1) 60 - #define round_down(x, y) ((x) & ~__round_mask(x, y)) 61 - 62 - #define xchg(ptr, x) uatomic_xchg(ptr, x) 63 20 64 21 #endif /* _KERNEL_H */
-16
tools/testing/radix-tree/linux/mempool.h
··· 1 - 2 - #include <linux/slab.h> 3 - 4 - typedef void *(mempool_alloc_t)(int gfp_mask, void *pool_data); 5 - typedef void (mempool_free_t)(void *element, void *pool_data); 6 - 7 - typedef struct { 8 - mempool_alloc_t *alloc; 9 - mempool_free_t *free; 10 - void *data; 11 - } mempool_t; 12 - 13 - void *mempool_alloc(mempool_t *pool, int gfp_mask); 14 - void mempool_free(void *element, mempool_t *pool); 15 - mempool_t *mempool_create(int min_nr, mempool_alloc_t *alloc_fn, 16 - mempool_free_t *free_fn, void *pool_data);
+4 -1
tools/testing/radix-tree/linux/percpu.h
··· 1 - 1 + #define DECLARE_PER_CPU(type, val) extern type val 2 2 #define DEFINE_PER_CPU(type, val) type val 3 3 4 4 #define __get_cpu_var(var) var 5 5 #define this_cpu_ptr(var) var 6 + #define this_cpu_read(var) var 7 + #define this_cpu_xchg(var, val) uatomic_xchg(&var, val) 8 + #define this_cpu_cmpxchg(var, old, new) uatomic_cmpxchg(&var, old, new) 6 9 #define per_cpu_ptr(ptr, cpu) ({ (void)(cpu); (ptr); }) 7 10 #define per_cpu(var, cpu) (*per_cpu_ptr(&(var), cpu))
+10
tools/testing/radix-tree/linux/preempt.h
··· 1 + #ifndef __LINUX_PREEMPT_H 2 + #define __LINUX_PREEMPT_H 3 + 1 4 extern int preempt_count; 2 5 3 6 #define preempt_disable() uatomic_inc(&preempt_count) 4 7 #define preempt_enable() uatomic_dec(&preempt_count) 8 + 9 + static inline int in_interrupt(void) 10 + { 11 + return 0; 12 + } 13 + 14 + #endif /* __LINUX_PREEMPT_H */
+25
tools/testing/radix-tree/linux/radix-tree.h
··· 1 + #ifndef _TEST_RADIX_TREE_H 2 + #define _TEST_RADIX_TREE_H 3 + 4 + #include "generated/map-shift.h" 1 5 #include "../../../../include/linux/radix-tree.h" 6 + 7 + extern int kmalloc_verbose; 8 + extern int test_verbose; 9 + 10 + static inline void trace_call_rcu(struct rcu_head *head, 11 + void (*func)(struct rcu_head *head)) 12 + { 13 + if (kmalloc_verbose) 14 + printf("Delaying free of %p to slab\n", (char *)head - 15 + offsetof(struct radix_tree_node, rcu_head)); 16 + call_rcu(head, func); 17 + } 18 + 19 + #define printv(verbosity_level, fmt, ...) \ 20 + if(test_verbose >= verbosity_level) \ 21 + printf(fmt, ##__VA_ARGS__) 22 + 23 + #undef call_rcu 24 + #define call_rcu(x, y) trace_call_rcu(x, y) 25 + 26 + #endif /* _TEST_RADIX_TREE_H */
-23
tools/testing/radix-tree/linux/types.h
··· 1 - #ifndef _TYPES_H 2 - #define _TYPES_H 3 - 4 - #include "../../include/linux/types.h" 5 - 6 - #define __rcu 7 - #define __read_mostly 8 - 9 - static inline void INIT_LIST_HEAD(struct list_head *list) 10 - { 11 - list->next = list; 12 - list->prev = list; 13 - } 14 - 15 - typedef struct { 16 - unsigned int x; 17 - } spinlock_t; 18 - 19 - #define uninitialized_var(x) x = x 20 - 21 - #include <linux/gfp.h> 22 - 23 - #endif
+35 -18
tools/testing/radix-tree/main.c
··· 3 3 #include <unistd.h> 4 4 #include <time.h> 5 5 #include <assert.h> 6 + #include <limits.h> 6 7 7 8 #include <linux/slab.h> 8 9 #include <linux/radix-tree.h> ··· 68 67 69 68 for (i = 0; i < (long_run ? 1000 : 3); i++) { 70 69 __big_gang_check(); 71 - printf("%d ", i); 70 + printv(2, "%d ", i); 72 71 fflush(stdout); 73 72 } 74 73 } ··· 129 128 putchar('.'); */ 130 129 if (idx[i] < start || idx[i] > end) { 131 130 if (item_tag_get(tree, idx[i], totag)) { 132 - printf("%lu-%lu: %lu, tags %d-%d\n", start, end, idx[i], item_tag_get(tree, idx[i], fromtag), item_tag_get(tree, idx[i], totag)); 131 + printv(2, "%lu-%lu: %lu, tags %d-%d\n", start, 132 + end, idx[i], item_tag_get(tree, idx[i], 133 + fromtag), 134 + item_tag_get(tree, idx[i], totag)); 133 135 } 134 136 assert(!item_tag_get(tree, idx[i], totag)); 135 137 continue; 136 138 } 137 139 if (item_tag_get(tree, idx[i], fromtag) ^ 138 140 item_tag_get(tree, idx[i], totag)) { 139 - printf("%lu-%lu: %lu, tags %d-%d\n", start, end, idx[i], item_tag_get(tree, idx[i], fromtag), item_tag_get(tree, idx[i], totag)); 141 + printv(2, "%lu-%lu: %lu, tags %d-%d\n", start, end, 142 + idx[i], item_tag_get(tree, idx[i], fromtag), 143 + item_tag_get(tree, idx[i], totag)); 140 144 } 141 145 assert(!(item_tag_get(tree, idx[i], fromtag) ^ 142 146 item_tag_get(tree, idx[i], totag))); ··· 243 237 item = item_lookup(tree, index); 244 238 index2 = find_item(tree, item); 245 239 if (index != index2) { 246 - printf("index %ld order %d inserted; found %ld\n", 240 + printv(2, "index %ld order %d inserted; found %ld\n", 247 241 index, order, index2); 248 242 abort(); 249 243 } ··· 294 288 { 295 289 int i; 296 290 297 - printf("starting single_thread_tests: %d allocated, preempt %d\n", 291 + printv(1, "starting single_thread_tests: %d allocated, preempt %d\n", 298 292 nr_allocated, preempt_count); 299 293 multiorder_checks(); 300 294 rcu_barrier(); 301 - printf("after multiorder_check: %d allocated, preempt %d\n", 295 + printv(2, "after multiorder_check: %d allocated, preempt %d\n", 302 296 nr_allocated, preempt_count); 303 297 locate_check(); 304 298 rcu_barrier(); 305 - printf("after locate_check: %d allocated, preempt %d\n", 299 + printv(2, "after locate_check: %d allocated, preempt %d\n", 306 300 nr_allocated, preempt_count); 307 301 tag_check(); 308 302 rcu_barrier(); 309 - printf("after tag_check: %d allocated, preempt %d\n", 303 + printv(2, "after tag_check: %d allocated, preempt %d\n", 310 304 nr_allocated, preempt_count); 311 305 gang_check(); 312 306 rcu_barrier(); 313 - printf("after gang_check: %d allocated, preempt %d\n", 307 + printv(2, "after gang_check: %d allocated, preempt %d\n", 314 308 nr_allocated, preempt_count); 315 309 add_and_check(); 316 310 rcu_barrier(); 317 - printf("after add_and_check: %d allocated, preempt %d\n", 311 + printv(2, "after add_and_check: %d allocated, preempt %d\n", 318 312 nr_allocated, preempt_count); 319 313 dynamic_height_check(); 320 314 rcu_barrier(); 321 - printf("after dynamic_height_check: %d allocated, preempt %d\n", 315 + printv(2, "after dynamic_height_check: %d allocated, preempt %d\n", 316 + nr_allocated, preempt_count); 317 + idr_checks(); 318 + ida_checks(); 319 + rcu_barrier(); 320 + printv(2, "after idr_checks: %d allocated, preempt %d\n", 322 321 nr_allocated, preempt_count); 323 322 big_gang_check(long_run); 324 323 rcu_barrier(); 325 - printf("after big_gang_check: %d allocated, preempt %d\n", 324 + printv(2, "after big_gang_check: %d allocated, preempt %d\n", 326 325 nr_allocated, preempt_count); 327 326 for (i = 0; i < (long_run ? 2000 : 3); i++) { 328 327 copy_tag_check(); 329 - printf("%d ", i); 328 + printv(2, "%d ", i); 330 329 fflush(stdout); 331 330 } 332 331 rcu_barrier(); 333 - printf("after copy_tag_check: %d allocated, preempt %d\n", 332 + printv(2, "after copy_tag_check: %d allocated, preempt %d\n", 334 333 nr_allocated, preempt_count); 335 334 } 336 335 ··· 345 334 int opt; 346 335 unsigned int seed = time(NULL); 347 336 348 - while ((opt = getopt(argc, argv, "ls:")) != -1) { 337 + while ((opt = getopt(argc, argv, "ls:v")) != -1) { 349 338 if (opt == 'l') 350 339 long_run = true; 351 340 else if (opt == 's') 352 341 seed = strtoul(optarg, NULL, 0); 342 + else if (opt == 'v') 343 + test_verbose++; 353 344 } 354 345 355 346 printf("random seed %u\n", seed); 356 347 srand(seed); 348 + 349 + printf("running tests\n"); 357 350 358 351 rcu_register_thread(); 359 352 radix_tree_init(); ··· 365 350 regression1_test(); 366 351 regression2_test(); 367 352 regression3_test(); 368 - iteration_test(0, 10); 369 - iteration_test(7, 20); 353 + iteration_test(0, 10 + 90 * long_run); 354 + iteration_test(7, 10 + 90 * long_run); 370 355 single_thread_tests(long_run); 371 356 372 357 /* Free any remaining preallocated nodes */ ··· 375 360 benchmark(); 376 361 377 362 rcu_barrier(); 378 - printf("after rcu_barrier: %d allocated, preempt %d\n", 363 + printv(2, "after rcu_barrier: %d allocated, preempt %d\n", 379 364 nr_allocated, preempt_count); 380 365 rcu_unregister_thread(); 366 + 367 + printf("tests completed\n"); 381 368 382 369 exit(0); 383 370 }
+30 -9
tools/testing/radix-tree/multiorder.c
··· 30 30 /* our canonical entry */ 31 31 base = index & ~((1 << order) - 1); 32 32 33 - printf("Multiorder tag test with index %d, canonical entry %d\n", 33 + printv(2, "Multiorder tag test with index %d, canonical entry %d\n", 34 34 index, base); 35 35 36 36 err = item_insert_order(&tree, index, order); ··· 150 150 struct item *item2 = item_create(min, order); 151 151 RADIX_TREE(tree, GFP_KERNEL); 152 152 153 - printf("Multiorder index %ld, order %d\n", index, order); 153 + printv(2, "Multiorder index %ld, order %d\n", index, order); 154 154 155 155 assert(item_insert_order(&tree, index, order) == 0); 156 156 ··· 188 188 RADIX_TREE(tree, GFP_KERNEL); 189 189 struct radix_tree_node *node; 190 190 191 - printf("Multiorder shrink index %ld, order %d\n", index, order); 191 + printv(2, "Multiorder shrink index %ld, order %d\n", index, order); 192 192 193 193 assert(item_insert_order(&tree, 0, order) == 0); 194 194 ··· 209 209 item_check_absent(&tree, i); 210 210 211 211 if (!item_delete(&tree, 0)) { 212 - printf("failed to delete index %ld (order %d)\n", index, order); abort(); 212 + printv(2, "failed to delete index %ld (order %d)\n", index, order); 213 + abort(); 213 214 } 214 215 215 216 for (i = 0; i < 2*max; i++) ··· 235 234 void **slot; 236 235 int i, j, err; 237 236 238 - printf("Multiorder iteration test\n"); 237 + printv(1, "Multiorder iteration test\n"); 239 238 240 239 #define NUM_ENTRIES 11 241 240 int index[NUM_ENTRIES] = {0, 2, 4, 8, 16, 32, 34, 36, 64, 72, 128}; ··· 276 275 void **slot; 277 276 int i, j; 278 277 279 - printf("Multiorder tagged iteration test\n"); 278 + printv(1, "Multiorder tagged iteration test\n"); 280 279 281 280 #define MT_NUM_ENTRIES 9 282 281 int index[MT_NUM_ENTRIES] = {0, 2, 4, 16, 32, 40, 64, 72, 128}; ··· 356 355 item_kill_tree(&tree); 357 356 } 358 357 358 + /* 359 + * Basic join checks: make sure we can't find an entry in the tree after 360 + * a larger entry has replaced it 361 + */ 359 362 static void multiorder_join1(unsigned long index, 360 363 unsigned order1, unsigned order2) 361 364 { ··· 378 373 item_kill_tree(&tree); 379 374 } 380 375 376 + /* 377 + * Check that the accounting of exceptional entries is handled correctly 378 + * by joining an exceptional entry to a normal pointer. 379 + */ 381 380 static void multiorder_join2(unsigned order1, unsigned order2) 382 381 { 383 382 RADIX_TREE(tree, GFP_KERNEL); ··· 394 385 item2 = __radix_tree_lookup(&tree, 1 << order2, &node, NULL); 395 386 assert(item2 == (void *)0x12UL); 396 387 assert(node->exceptional == 1); 388 + 389 + item2 = radix_tree_lookup(&tree, 0); 390 + free(item2); 397 391 398 392 radix_tree_join(&tree, 0, order1, item1); 399 393 item2 = __radix_tree_lookup(&tree, 1 << order2, &node, NULL); ··· 465 453 { 466 454 struct radix_tree_preload *rtp = &radix_tree_preloads; 467 455 if (rtp->nr != 0) 468 - printf("split(%u %u) remaining %u\n", old_order, new_order, 456 + printv(2, "split(%u %u) remaining %u\n", old_order, new_order, 469 457 rtp->nr); 470 458 /* 471 459 * Can't check for equality here as some nodes may have been ··· 473 461 * nodes allocated since they should have all been preloaded. 474 462 */ 475 463 if (nr_allocated > alloc) 476 - printf("split(%u %u) allocated %u %u\n", old_order, new_order, 464 + printv(2, "split(%u %u) allocated %u %u\n", old_order, new_order, 477 465 alloc, nr_allocated); 478 466 } 479 467 ··· 483 471 void **slot; 484 472 struct radix_tree_iter iter; 485 473 unsigned alloc; 474 + struct item *item; 486 475 487 476 radix_tree_preload(GFP_KERNEL); 488 477 assert(item_insert_order(&tree, 0, old_order) == 0); ··· 492 479 /* Wipe out the preloaded cache or it'll confuse check_mem() */ 493 480 radix_tree_cpu_dead(0); 494 481 495 - radix_tree_tag_set(&tree, 0, 2); 482 + item = radix_tree_tag_set(&tree, 0, 2); 496 483 497 484 radix_tree_split_preload(old_order, new_order, GFP_KERNEL); 498 485 alloc = nr_allocated; ··· 505 492 radix_tree_preload_end(); 506 493 507 494 item_kill_tree(&tree); 495 + free(item); 508 496 } 509 497 510 498 static void __multiorder_split2(int old_order, int new_order) ··· 646 632 multiorder_account(); 647 633 648 634 radix_tree_cpu_dead(0); 635 + } 636 + 637 + int __weak main(void) 638 + { 639 + radix_tree_init(); 640 + multiorder_checks(); 641 + return 0; 649 642 }
+2 -2
tools/testing/radix-tree/regression1.c
··· 193 193 long arg; 194 194 195 195 /* Regression #1 */ 196 - printf("running regression test 1, should finish in under a minute\n"); 196 + printv(1, "running regression test 1, should finish in under a minute\n"); 197 197 nr_threads = 2; 198 198 pthread_barrier_init(&worker_barrier, NULL, nr_threads); 199 199 ··· 216 216 217 217 free(threads); 218 218 219 - printf("regression test 1, done\n"); 219 + printv(1, "regression test 1, done\n"); 220 220 }
+6 -4
tools/testing/radix-tree/regression2.c
··· 80 80 unsigned long int start, end; 81 81 struct page *pages[1]; 82 82 83 - printf("running regression test 2 (should take milliseconds)\n"); 83 + printv(1, "running regression test 2 (should take milliseconds)\n"); 84 84 /* 0. */ 85 85 for (i = 0; i <= max_slots - 1; i++) { 86 86 p = page_alloc(); ··· 103 103 104 104 /* 4. */ 105 105 for (i = max_slots - 1; i >= 0; i--) 106 - radix_tree_delete(&mt_tree, i); 106 + free(radix_tree_delete(&mt_tree, i)); 107 107 108 108 /* 5. */ 109 109 // NOTE: start should not be 0 because radix_tree_gang_lookup_tag_slot ··· 114 114 PAGECACHE_TAG_TOWRITE); 115 115 116 116 /* We remove all the remained nodes */ 117 - radix_tree_delete(&mt_tree, max_slots); 117 + free(radix_tree_delete(&mt_tree, max_slots)); 118 118 119 - printf("regression test 2, done\n"); 119 + BUG_ON(!radix_tree_empty(&mt_tree)); 120 + 121 + printv(1, "regression test 2, done\n"); 120 122 }
+14 -14
tools/testing/radix-tree/regression3.c
··· 34 34 void **slot; 35 35 bool first; 36 36 37 - printf("running regression test 3 (should take milliseconds)\n"); 37 + printv(1, "running regression test 3 (should take milliseconds)\n"); 38 38 39 39 radix_tree_insert(&root, 0, ptr0); 40 40 radix_tree_tag_set(&root, 0, 0); 41 41 42 42 first = true; 43 43 radix_tree_for_each_tagged(slot, &root, &iter, 0, 0) { 44 - printf("tagged %ld %p\n", iter.index, *slot); 44 + printv(2, "tagged %ld %p\n", iter.index, *slot); 45 45 if (first) { 46 46 radix_tree_insert(&root, 1, ptr); 47 47 radix_tree_tag_set(&root, 1, 0); 48 48 first = false; 49 49 } 50 50 if (radix_tree_deref_retry(*slot)) { 51 - printf("retry at %ld\n", iter.index); 51 + printv(2, "retry at %ld\n", iter.index); 52 52 slot = radix_tree_iter_retry(&iter); 53 53 continue; 54 54 } ··· 57 57 58 58 first = true; 59 59 radix_tree_for_each_slot(slot, &root, &iter, 0) { 60 - printf("slot %ld %p\n", iter.index, *slot); 60 + printv(2, "slot %ld %p\n", iter.index, *slot); 61 61 if (first) { 62 62 radix_tree_insert(&root, 1, ptr); 63 63 first = false; 64 64 } 65 65 if (radix_tree_deref_retry(*slot)) { 66 - printk("retry at %ld\n", iter.index); 66 + printv(2, "retry at %ld\n", iter.index); 67 67 slot = radix_tree_iter_retry(&iter); 68 68 continue; 69 69 } ··· 72 72 73 73 first = true; 74 74 radix_tree_for_each_contig(slot, &root, &iter, 0) { 75 - printk("contig %ld %p\n", iter.index, *slot); 75 + printv(2, "contig %ld %p\n", iter.index, *slot); 76 76 if (first) { 77 77 radix_tree_insert(&root, 1, ptr); 78 78 first = false; 79 79 } 80 80 if (radix_tree_deref_retry(*slot)) { 81 - printk("retry at %ld\n", iter.index); 81 + printv(2, "retry at %ld\n", iter.index); 82 82 slot = radix_tree_iter_retry(&iter); 83 83 continue; 84 84 } 85 85 } 86 86 87 87 radix_tree_for_each_slot(slot, &root, &iter, 0) { 88 - printf("slot %ld %p\n", iter.index, *slot); 88 + printv(2, "slot %ld %p\n", iter.index, *slot); 89 89 if (!iter.index) { 90 - printf("next at %ld\n", iter.index); 90 + printv(2, "next at %ld\n", iter.index); 91 91 slot = radix_tree_iter_resume(slot, &iter); 92 92 } 93 93 } 94 94 95 95 radix_tree_for_each_contig(slot, &root, &iter, 0) { 96 - printf("contig %ld %p\n", iter.index, *slot); 96 + printv(2, "contig %ld %p\n", iter.index, *slot); 97 97 if (!iter.index) { 98 - printf("next at %ld\n", iter.index); 98 + printv(2, "next at %ld\n", iter.index); 99 99 slot = radix_tree_iter_resume(slot, &iter); 100 100 } 101 101 } ··· 103 103 radix_tree_tag_set(&root, 0, 0); 104 104 radix_tree_tag_set(&root, 1, 0); 105 105 radix_tree_for_each_tagged(slot, &root, &iter, 0, 0) { 106 - printf("tagged %ld %p\n", iter.index, *slot); 106 + printv(2, "tagged %ld %p\n", iter.index, *slot); 107 107 if (!iter.index) { 108 - printf("next at %ld\n", iter.index); 108 + printv(2, "next at %ld\n", iter.index); 109 109 slot = radix_tree_iter_resume(slot, &iter); 110 110 } 111 111 } ··· 113 113 radix_tree_delete(&root, 0); 114 114 radix_tree_delete(&root, 1); 115 115 116 - printf("regression test 3 passed\n"); 116 + printv(1, "regression test 3 passed\n"); 117 117 }
+11 -11
tools/testing/radix-tree/tag_check.c
··· 49 49 } 50 50 verify_tag_consistency(&tree, 0); 51 51 verify_tag_consistency(&tree, 1); 52 - printf("before item_kill_tree: %d allocated\n", nr_allocated); 52 + printv(2, "before item_kill_tree: %d allocated\n", nr_allocated); 53 53 item_kill_tree(&tree); 54 54 rcu_barrier(); 55 - printf("after item_kill_tree: %d allocated\n", nr_allocated); 55 + printv(2, "after item_kill_tree: %d allocated\n", nr_allocated); 56 56 } 57 57 58 58 /* ··· 257 257 258 258 gang_check(tree, thrash_state, tag); 259 259 260 - printf("%d(%d) %d(%d) %d(%d) %d(%d) / " 260 + printv(2, "%d(%d) %d(%d) %d(%d) %d(%d) / " 261 261 "%d(%d) present, %d(%d) tagged\n", 262 262 insert_chunk, nr_inserted, 263 263 delete_chunk, nr_deleted, ··· 296 296 { 297 297 RADIX_TREE(tree, GFP_KERNEL); 298 298 299 - printf("%d: nr_allocated=%d\n", __LINE__, nr_allocated); 299 + printv(2, "%d: nr_allocated=%d\n", __LINE__, nr_allocated); 300 300 item_insert(&tree, 1000000); 301 - printf("%d: nr_allocated=%d\n", __LINE__, nr_allocated); 301 + printv(2, "%d: nr_allocated=%d\n", __LINE__, nr_allocated); 302 302 item_delete(&tree, 1000000); 303 - printf("%d: nr_allocated=%d\n", __LINE__, nr_allocated); 303 + printv(2, "%d: nr_allocated=%d\n", __LINE__, nr_allocated); 304 304 item_kill_tree(&tree); 305 - printf("%d: nr_allocated=%d\n", __LINE__, nr_allocated); 305 + printv(2, "%d: nr_allocated=%d\n", __LINE__, nr_allocated); 306 306 } 307 307 308 308 static void single_check(void) ··· 336 336 extend_checks(); 337 337 contract_checks(); 338 338 rcu_barrier(); 339 - printf("after extend_checks: %d allocated\n", nr_allocated); 339 + printv(2, "after extend_checks: %d allocated\n", nr_allocated); 340 340 __leak_check(); 341 341 leak_check(); 342 342 rcu_barrier(); 343 - printf("after leak_check: %d allocated\n", nr_allocated); 343 + printv(2, "after leak_check: %d allocated\n", nr_allocated); 344 344 simple_checks(); 345 345 rcu_barrier(); 346 - printf("after simple_checks: %d allocated\n", nr_allocated); 346 + printv(2, "after simple_checks: %d allocated\n", nr_allocated); 347 347 thrash_tags(); 348 348 rcu_barrier(); 349 - printf("after thrash_tags: %d allocated\n", nr_allocated); 349 + printv(2, "after thrash_tags: %d allocated\n", nr_allocated); 350 350 }
+16 -12
tools/testing/radix-tree/test.c
··· 29 29 return __radix_tree_insert(root, item->index, item->order, item); 30 30 } 31 31 32 - int item_insert(struct radix_tree_root *root, unsigned long index) 32 + struct item *item_create(unsigned long index, unsigned int order) 33 33 { 34 - return __item_insert(root, item_create(index, 0)); 34 + struct item *ret = malloc(sizeof(*ret)); 35 + 36 + ret->index = index; 37 + ret->order = order; 38 + return ret; 35 39 } 36 40 37 41 int item_insert_order(struct radix_tree_root *root, unsigned long index, 38 42 unsigned order) 39 43 { 40 - return __item_insert(root, item_create(index, order)); 44 + struct item *item = item_create(index, order); 45 + int err = __item_insert(root, item); 46 + if (err) 47 + free(item); 48 + return err; 49 + } 50 + 51 + int item_insert(struct radix_tree_root *root, unsigned long index) 52 + { 53 + return item_insert_order(root, index, 0); 41 54 } 42 55 43 56 void item_sanity(struct item *item, unsigned long index) ··· 72 59 return 1; 73 60 } 74 61 return 0; 75 - } 76 - 77 - struct item *item_create(unsigned long index, unsigned int order) 78 - { 79 - struct item *ret = malloc(sizeof(*ret)); 80 - 81 - ret->index = index; 82 - ret->order = order; 83 - return ret; 84 62 } 85 63 86 64 void item_check_present(struct radix_tree_root *root, unsigned long index)
+2
tools/testing/radix-tree/test.h
··· 34 34 void multiorder_checks(void); 35 35 void iteration_test(unsigned order, unsigned duration); 36 36 void benchmark(void); 37 + void idr_checks(void); 38 + void ida_checks(void); 37 39 38 40 struct item * 39 41 item_tag_set(struct radix_tree_root *root, unsigned long index, int tag);