| 4495 | } |
| 4496 | |
| 4497 | static void |
| 4498 | slab_free_item(uma_zone_t zone, uma_slab_t slab, void *item) |
| 4499 | { |
| 4500 | uma_keg_t keg; |
| 4501 | uma_domain_t dom; |
| 4502 | int freei; |
| 4503 | |
| 4504 | keg = zone->uz_keg; |
| 4505 | KEG_LOCK_ASSERT(keg, slab->us_domain); |
| 4506 | |
| 4507 | /* Do we need to remove from any lists? */ |
| 4508 | dom = &keg->uk_domain[slab->us_domain]; |
| 4509 | if (slab->us_freecount + 1 == keg->uk_ipers) { |
| 4510 | LIST_REMOVE(slab, us_link); |
| 4511 | LIST_INSERT_HEAD(&dom->ud_free_slab, slab, us_link); |
| 4512 | dom->ud_free_slabs++; |
| 4513 | } else if (slab->us_freecount == 0) { |
| 4514 | LIST_REMOVE(slab, us_link); |
| 4515 | LIST_INSERT_HEAD(&dom->ud_part_slab, slab, us_link); |
| 4516 | } |
| 4517 | |
| 4518 | /* Slab management. */ |
| 4519 | freei = slab_item_index(slab, keg, item); |
| 4520 | BIT_SET(keg->uk_ipers, freei, &slab->us_free); |
| 4521 | slab->us_freecount++; |
| 4522 | |
| 4523 | /* Keg statistics. */ |
| 4524 | dom->ud_free_items++; |
| 4525 | } |
| 4526 | |
| 4527 | static void |
| 4528 | zone_release(void *arg, void **bucket, int cnt) |
no test coverage detected