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 * Small id to pointer translation service. 10 * 11 * It uses a radix tree like structure as a sparse array indexed 12 * by the id to obtain the pointer. The bitmap makes allocating 13 * a new id quick. 14 * 15 * You call it to allocate an id (an int) an associate with that id a 16 * pointer or what ever, we treat it as a (void *). You can pass this 17 * id to a user for him to pass back at a later time. You then pass 18 * that id to this code and it returns your pointer. 19 20 * You can release ids at any time. When all ids are released, most of 21 * the memory is returned (we keep IDR_FREE_MAX) in a local pool so we 22 * don't need to go to the memory "store" during an id allocate, just 23 * so you don't need to be too concerned about locking and conflicts 24 * with the slab allocator. 25 */ 26 27 #ifndef TEST // to test in user space... 28 #include <linux/slab.h> 29 #include <linux/init.h> 30 #include <linux/module.h> 31 #endif 32 #include <linux/err.h> 33 #include <linux/string.h> 34 #include <linux/idr.h> 35 36 static kmem_cache_t *idr_layer_cache; 37 38 static struct idr_layer *alloc_layer(struct idr *idp) 39 { 40 struct idr_layer *p; 41 42 spin_lock(&idp->lock); 43 if ((p = idp->id_free)) { 44 idp->id_free = p->ary[0]; 45 idp->id_free_cnt--; 46 p->ary[0] = NULL; 47 } 48 spin_unlock(&idp->lock); 49 return(p); 50 } 51 52 /* only called when idp->lock is held */ 53 static void __free_layer(struct idr *idp, struct idr_layer *p) 54 { 55 p->ary[0] = idp->id_free; 56 idp->id_free = p; 57 idp->id_free_cnt++; 58 } 59 60 static void free_layer(struct idr *idp, struct idr_layer *p) 61 { 62 /* 63 * Depends on the return element being zeroed. 64 */ 65 spin_lock(&idp->lock); 66 __free_layer(idp, p); 67 spin_unlock(&idp->lock); 68 } 69 70 /** 71 * idr_pre_get - reserver resources for idr allocation 72 * @idp: idr handle 73 * @gfp_mask: memory allocation flags 74 * 75 * This function should be called prior to locking and calling the 76 * following function. It preallocates enough memory to satisfy 77 * the worst possible allocation. 78 * 79 * If the system is REALLY out of memory this function returns 0, 80 * otherwise 1. 81 */ 82 int idr_pre_get(struct idr *idp, gfp_t gfp_mask) 83 { 84 while (idp->id_free_cnt < IDR_FREE_MAX) { 85 struct idr_layer *new; 86 new = kmem_cache_alloc(idr_layer_cache, gfp_mask); 87 if (new == NULL) 88 return (0); 89 free_layer(idp, new); 90 } 91 return 1; 92 } 93 EXPORT_SYMBOL(idr_pre_get); 94 95 static int sub_alloc(struct idr *idp, void *ptr, int *starting_id) 96 { 97 int n, m, sh; 98 struct idr_layer *p, *new; 99 struct idr_layer *pa[MAX_LEVEL]; 100 int l, id; 101 long bm; 102 103 id = *starting_id; 104 p = idp->top; 105 l = idp->layers; 106 pa[l--] = NULL; 107 while (1) { 108 /* 109 * We run around this while until we reach the leaf node... 110 */ 111 n = (id >> (IDR_BITS*l)) & IDR_MASK; 112 bm = ~p->bitmap; 113 m = find_next_bit(&bm, IDR_SIZE, n); 114 if (m == IDR_SIZE) { 115 /* no space available go back to previous layer. */ 116 l++; 117 id = (id | ((1 << (IDR_BITS * l)) - 1)) + 1; 118 if (!(p = pa[l])) { 119 *starting_id = id; 120 return -2; 121 } 122 continue; 123 } 124 if (m != n) { 125 sh = IDR_BITS*l; 126 id = ((id >> sh) ^ n ^ m) << sh; 127 } 128 if ((id >= MAX_ID_BIT) || (id < 0)) 129 return -3; 130 if (l == 0) 131 break; 132 /* 133 * Create the layer below if it is missing. 134 */ 135 if (!p->ary[m]) { 136 if (!(new = alloc_layer(idp))) 137 return -1; 138 p->ary[m] = new; 139 p->count++; 140 } 141 pa[l--] = p; 142 p = p->ary[m]; 143 } 144 /* 145 * We have reached the leaf node, plant the 146 * users pointer and return the raw id. 147 */ 148 p->ary[m] = (struct idr_layer *)ptr; 149 __set_bit(m, &p->bitmap); 150 p->count++; 151 /* 152 * If this layer is full mark the bit in the layer above 153 * to show that this part of the radix tree is full. 154 * This may complete the layer above and require walking 155 * up the radix tree. 156 */ 157 n = id; 158 while (p->bitmap == IDR_FULL) { 159 if (!(p = pa[++l])) 160 break; 161 n = n >> IDR_BITS; 162 __set_bit((n & IDR_MASK), &p->bitmap); 163 } 164 return(id); 165 } 166 167 static int idr_get_new_above_int(struct idr *idp, void *ptr, int starting_id) 168 { 169 struct idr_layer *p, *new; 170 int layers, v, id; 171 172 id = starting_id; 173 build_up: 174 p = idp->top; 175 layers = idp->layers; 176 if (unlikely(!p)) { 177 if (!(p = alloc_layer(idp))) 178 return -1; 179 layers = 1; 180 } 181 /* 182 * Add a new layer to the top of the tree if the requested 183 * id is larger than the currently allocated space. 184 */ 185 while ((layers < (MAX_LEVEL - 1)) && (id >= (1 << (layers*IDR_BITS)))) { 186 layers++; 187 if (!p->count) 188 continue; 189 if (!(new = alloc_layer(idp))) { 190 /* 191 * The allocation failed. If we built part of 192 * the structure tear it down. 193 */ 194 spin_lock(&idp->lock); 195 for (new = p; p && p != idp->top; new = p) { 196 p = p->ary[0]; 197 new->ary[0] = NULL; 198 new->bitmap = new->count = 0; 199 __free_layer(idp, new); 200 } 201 spin_unlock(&idp->lock); 202 return -1; 203 } 204 new->ary[0] = p; 205 new->count = 1; 206 if (p->bitmap == IDR_FULL) 207 __set_bit(0, &new->bitmap); 208 p = new; 209 } 210 idp->top = p; 211 idp->layers = layers; 212 v = sub_alloc(idp, ptr, &id); 213 if (v == -2) 214 goto build_up; 215 return(v); 216 } 217 218 /** 219 * idr_get_new_above - allocate new idr entry above or equal to a start id 220 * @idp: idr handle 221 * @ptr: pointer you want associated with the ide 222 * @start_id: id to start search at 223 * @id: pointer to the allocated handle 224 * 225 * This is the allocate id function. It should be called with any 226 * required locks. 227 * 228 * If memory is required, it will return -EAGAIN, you should unlock 229 * and go back to the idr_pre_get() call. If the idr is full, it will 230 * return -ENOSPC. 231 * 232 * @id returns a value in the range 0 ... 0x7fffffff 233 */ 234 int idr_get_new_above(struct idr *idp, void *ptr, int starting_id, int *id) 235 { 236 int rv; 237 238 rv = idr_get_new_above_int(idp, ptr, starting_id); 239 /* 240 * This is a cheap hack until the IDR code can be fixed to 241 * return proper error values. 242 */ 243 if (rv < 0) { 244 if (rv == -1) 245 return -EAGAIN; 246 else /* Will be -3 */ 247 return -ENOSPC; 248 } 249 *id = rv; 250 return 0; 251 } 252 EXPORT_SYMBOL(idr_get_new_above); 253 254 /** 255 * idr_get_new - allocate new idr entry 256 * @idp: idr handle 257 * @ptr: pointer you want associated with the ide 258 * @id: pointer to the allocated handle 259 * 260 * This is the allocate id function. It should be called with any 261 * required locks. 262 * 263 * If memory is required, it will return -EAGAIN, you should unlock 264 * and go back to the idr_pre_get() call. If the idr is full, it will 265 * return -ENOSPC. 266 * 267 * @id returns a value in the range 0 ... 0x7fffffff 268 */ 269 int idr_get_new(struct idr *idp, void *ptr, int *id) 270 { 271 int rv; 272 273 rv = idr_get_new_above_int(idp, ptr, 0); 274 /* 275 * This is a cheap hack until the IDR code can be fixed to 276 * return proper error values. 277 */ 278 if (rv < 0) { 279 if (rv == -1) 280 return -EAGAIN; 281 else /* Will be -3 */ 282 return -ENOSPC; 283 } 284 *id = rv; 285 return 0; 286 } 287 EXPORT_SYMBOL(idr_get_new); 288 289 static void idr_remove_warning(int id) 290 { 291 printk("idr_remove called for id=%d which is not allocated.\n", id); 292 dump_stack(); 293 } 294 295 static void sub_remove(struct idr *idp, int shift, int id) 296 { 297 struct idr_layer *p = idp->top; 298 struct idr_layer **pa[MAX_LEVEL]; 299 struct idr_layer ***paa = &pa[0]; 300 int n; 301 302 *paa = NULL; 303 *++paa = &idp->top; 304 305 while ((shift > 0) && p) { 306 n = (id >> shift) & IDR_MASK; 307 __clear_bit(n, &p->bitmap); 308 *++paa = &p->ary[n]; 309 p = p->ary[n]; 310 shift -= IDR_BITS; 311 } 312 n = id & IDR_MASK; 313 if (likely(p != NULL && test_bit(n, &p->bitmap))){ 314 __clear_bit(n, &p->bitmap); 315 p->ary[n] = NULL; 316 while(*paa && ! --((**paa)->count)){ 317 free_layer(idp, **paa); 318 **paa-- = NULL; 319 } 320 if (!*paa) 321 idp->layers = 0; 322 } else 323 idr_remove_warning(id); 324 } 325 326 /** 327 * idr_remove - remove the given id and free it's slot 328 * idp: idr handle 329 * id: uniqueue key 330 */ 331 void idr_remove(struct idr *idp, int id) 332 { 333 struct idr_layer *p; 334 335 /* Mask off upper bits we don't use for the search. */ 336 id &= MAX_ID_MASK; 337 338 sub_remove(idp, (idp->layers - 1) * IDR_BITS, id); 339 if (idp->top && idp->top->count == 1 && (idp->layers > 1) && 340 idp->top->ary[0]) { // We can drop a layer 341 342 p = idp->top->ary[0]; 343 idp->top->bitmap = idp->top->count = 0; 344 free_layer(idp, idp->top); 345 idp->top = p; 346 --idp->layers; 347 } 348 while (idp->id_free_cnt >= IDR_FREE_MAX) { 349 p = alloc_layer(idp); 350 kmem_cache_free(idr_layer_cache, p); 351 return; 352 } 353 } 354 EXPORT_SYMBOL(idr_remove); 355 356 /** 357 * idr_destroy - release all cached layers within an idr tree 358 * idp: idr handle 359 */ 360 void idr_destroy(struct idr *idp) 361 { 362 while (idp->id_free_cnt) { 363 struct idr_layer *p = alloc_layer(idp); 364 kmem_cache_free(idr_layer_cache, p); 365 } 366 } 367 EXPORT_SYMBOL(idr_destroy); 368 369 /** 370 * idr_find - return pointer for given id 371 * @idp: idr handle 372 * @id: lookup key 373 * 374 * Return the pointer given the id it has been registered with. A %NULL 375 * return indicates that @id is not valid or you passed %NULL in 376 * idr_get_new(). 377 * 378 * The caller must serialize idr_find() vs idr_get_new() and idr_remove(). 379 */ 380 void *idr_find(struct idr *idp, int id) 381 { 382 int n; 383 struct idr_layer *p; 384 385 n = idp->layers * IDR_BITS; 386 p = idp->top; 387 388 /* Mask off upper bits we don't use for the search. */ 389 id &= MAX_ID_MASK; 390 391 if (id >= (1 << n)) 392 return NULL; 393 394 while (n > 0 && p) { 395 n -= IDR_BITS; 396 p = p->ary[(id >> n) & IDR_MASK]; 397 } 398 return((void *)p); 399 } 400 EXPORT_SYMBOL(idr_find); 401 402 /** 403 * idr_replace - replace pointer for given id 404 * @idp: idr handle 405 * @ptr: pointer you want associated with the id 406 * @id: lookup key 407 * 408 * Replace the pointer registered with an id and return the old value. 409 * A -ENOENT return indicates that @id was not found. 410 * A -EINVAL return indicates that @id was not within valid constraints. 411 * 412 * The caller must serialize vs idr_find(), idr_get_new(), and idr_remove(). 413 */ 414 void *idr_replace(struct idr *idp, void *ptr, int id) 415 { 416 int n; 417 struct idr_layer *p, *old_p; 418 419 n = idp->layers * IDR_BITS; 420 p = idp->top; 421 422 id &= MAX_ID_MASK; 423 424 if (id >= (1 << n)) 425 return ERR_PTR(-EINVAL); 426 427 n -= IDR_BITS; 428 while ((n > 0) && p) { 429 p = p->ary[(id >> n) & IDR_MASK]; 430 n -= IDR_BITS; 431 } 432 433 n = id & IDR_MASK; 434 if (unlikely(p == NULL || !test_bit(n, &p->bitmap))) 435 return ERR_PTR(-ENOENT); 436 437 old_p = p->ary[n]; 438 p->ary[n] = ptr; 439 440 return old_p; 441 } 442 EXPORT_SYMBOL(idr_replace); 443 444 static void idr_cache_ctor(void * idr_layer, kmem_cache_t *idr_layer_cache, 445 unsigned long flags) 446 { 447 memset(idr_layer, 0, sizeof(struct idr_layer)); 448 } 449 450 static int init_id_cache(void) 451 { 452 if (!idr_layer_cache) 453 idr_layer_cache = kmem_cache_create("idr_layer_cache", 454 sizeof(struct idr_layer), 0, 0, idr_cache_ctor, NULL); 455 return 0; 456 } 457 458 /** 459 * idr_init - initialize idr handle 460 * @idp: idr handle 461 * 462 * This function is use to set up the handle (@idp) that you will pass 463 * to the rest of the functions. 464 */ 465 void idr_init(struct idr *idp) 466 { 467 init_id_cache(); 468 memset(idp, 0, sizeof(struct idr)); 469 spin_lock_init(&idp->lock); 470 } 471 EXPORT_SYMBOL(idr_init); 472