summaryrefslogtreecommitdiffstats
path: root/sys/vm/uma_dbg.c
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2009-01-25 09:11:24 +0000
committerjeff <jeff@FreeBSD.org>2009-01-25 09:11:24 +0000
commit69d1bd86702d1d3505e941e98bc5f72403790a22 (patch)
tree816ddb03fae2b243e6596d085b68de89f1198131 /sys/vm/uma_dbg.c
parentce1034ac575d9a536351843e5fa3ac3d26a2a766 (diff)
downloadFreeBSD-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.c16
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;
OpenPOWER on IntegriCloud