* Verifies freed addresses. Checks for alignment, valid slab membership * and duplicate frees. * */
| 5465 | * |
| 5466 | */ |
| 5467 | static void |
| 5468 | uma_dbg_free(uma_zone_t zone, uma_slab_t slab, void *item) |
| 5469 | { |
| 5470 | uma_keg_t keg; |
| 5471 | int freei; |
| 5472 | |
| 5473 | if (slab == NULL) { |
| 5474 | slab = uma_dbg_getslab(zone, item); |
| 5475 | if (slab == NULL) |
| 5476 | panic("uma: Freed item %p did not belong to zone %s", |
| 5477 | item, zone->uz_name); |
| 5478 | } |
| 5479 | keg = zone->uz_keg; |
| 5480 | freei = slab_item_index(slab, keg, item); |
| 5481 | |
| 5482 | if (freei >= keg->uk_ipers) |
| 5483 | panic("Invalid free of %p from zone %p(%s) slab %p(%d)", |
| 5484 | item, zone, zone->uz_name, slab, freei); |
| 5485 | |
| 5486 | if (slab_item(slab, keg, freei) != item) |
| 5487 | panic("Unaligned free of %p from zone %p(%s) slab %p(%d)", |
| 5488 | item, zone, zone->uz_name, slab, freei); |
| 5489 | |
| 5490 | if (!BIT_TEST_CLR_ATOMIC(keg->uk_ipers, freei, |
| 5491 | slab_dbg_bits(slab, keg))) |
| 5492 | panic("Duplicate free of %p from zone %p(%s) slab %p(%d)", |
| 5493 | item, zone, zone->uz_name, slab, freei); |
| 5494 | } |
| 5495 | #endif /* INVARIANTS */ |
| 5496 | |
| 5497 | #ifdef DDB |
no test coverage detected