diff options
author | jeff <jeff@FreeBSD.org> | 2009-01-25 09:11:24 +0000 |
---|---|---|
committer | jeff <jeff@FreeBSD.org> | 2009-01-25 09:11:24 +0000 |
commit | 69d1bd86702d1d3505e941e98bc5f72403790a22 (patch) | |
tree | 816ddb03fae2b243e6596d085b68de89f1198131 /sys/vm/uma_dbg.c | |
parent | ce1034ac575d9a536351843e5fa3ac3d26a2a766 (diff) | |
download | FreeBSD-src-69d1bd86702d1d3505e941e98bc5f72403790a22.zip FreeBSD-src-69d1bd86702d1d3505e941e98bc5f72403790a22.tar.gz |
- Make the keg abstraction more complete. Permit a zone to have multiple
backend kegs so it may source compatible memory from multiple backends.
This is useful for cases such as NUMA or different layouts for the same
memory type.
- Provide a new api for adding new backend kegs to secondary zones.
- Provide a new flag for adjusting the layout of zones to stagger
allocations better across cache lines.
Sponsored by: Nokia
Diffstat (limited to 'sys/vm/uma_dbg.c')
-rw-r--r-- | sys/vm/uma_dbg.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/sys/vm/uma_dbg.c b/sys/vm/uma_dbg.c index 9075bf9..ade5fb5 100644 --- a/sys/vm/uma_dbg.c +++ b/sys/vm/uma_dbg.c @@ -198,15 +198,15 @@ uma_dbg_getslab(uma_zone_t zone, void *item) uma_keg_t keg; u_int8_t *mem; - keg = zone->uz_keg; mem = (u_int8_t *)((unsigned long)item & (~UMA_SLAB_MASK)); - if (keg->uk_flags & UMA_ZONE_MALLOC) { + if (zone->uz_flags & UMA_ZONE_VTOSLAB) { slab = vtoslab((vm_offset_t)mem); - } else if (keg->uk_flags & UMA_ZONE_HASH) { - slab = hash_sfind(&keg->uk_hash, mem); } else { - mem += keg->uk_pgoff; - slab = (uma_slab_t)mem; + keg = LIST_FIRST(&zone->uz_kegs)->kl_keg; + if (keg->uk_flags & UMA_ZONE_HASH) + slab = hash_sfind(&keg->uk_hash, mem); + else + slab = (uma_slab_t)(mem + keg->uk_pgoff); } return (slab); @@ -224,13 +224,13 @@ uma_dbg_alloc(uma_zone_t zone, uma_slab_t slab, void *item) uma_slabrefcnt_t slabref; int freei; - keg = zone->uz_keg; if (slab == NULL) { slab = uma_dbg_getslab(zone, item); if (slab == NULL) panic("uma: item %p did not belong to zone %s\n", item, zone->uz_name); } + keg = slab->us_keg; freei = ((unsigned long)item - (unsigned long)slab->us_data) / keg->uk_rsize; @@ -258,13 +258,13 @@ uma_dbg_free(uma_zone_t zone, uma_slab_t slab, void *item) uma_slabrefcnt_t slabref; int freei; - keg = zone->uz_keg; if (slab == NULL) { slab = uma_dbg_getslab(zone, item); if (slab == NULL) panic("uma: Freed item %p did not belong to zone %s\n", item, zone->uz_name); } + keg = slab->us_keg; freei = ((unsigned long)item - (unsigned long)slab->us_data) / keg->uk_rsize; |