Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/uma_core.c
Show First 20 Lines • Show All 1,835 Lines • ▼ Show 20 Lines | keg_layout(uma_keg_t keg) | ||||
*/ | */ | ||||
eff = UMA_FRAC_FIXPT(ipers * rsize, slabsize); | eff = UMA_FRAC_FIXPT(ipers * rsize, slabsize); | ||||
ipers_offpage = slab_ipers_hdr(keg->uk_size, rsize, slabsize, false); | ipers_offpage = slab_ipers_hdr(keg->uk_size, rsize, slabsize, false); | ||||
eff_offpage = UMA_FRAC_FIXPT(ipers_offpage * rsize, | eff_offpage = UMA_FRAC_FIXPT(ipers_offpage * rsize, | ||||
slabsize + slab_sizeof(SLAB_MAX_SETSIZE)); | slabsize + slab_sizeof(SLAB_MAX_SETSIZE)); | ||||
if (ipers == 0 || (eff < UMA_MIN_EFF && eff < eff_offpage)) { | if (ipers == 0 || (eff < UMA_MIN_EFF && eff < eff_offpage)) { | ||||
CTR5(KTR_UMA, "UMA decided we need offpage slab headers for " | CTR5(KTR_UMA, "UMA decided we need offpage slab headers for " | ||||
"keg: %s(%p), minimum efficiency allowed = %u%%, " | "keg: %s(%p), minimum efficiency allowed = %u%%, " | ||||
"old efficiency = %u%%, offpage efficiency = %u%%\n", | "old efficiency = %u%%, offpage efficiency = %u%%", | ||||
keg->uk_name, keg, UMA_FIXPT_PCT(UMA_MIN_EFF), | keg->uk_name, keg, UMA_FIXPT_PCT(UMA_MIN_EFF), | ||||
UMA_FIXPT_PCT(eff), UMA_FIXPT_PCT(eff_offpage)); | UMA_FIXPT_PCT(eff), UMA_FIXPT_PCT(eff_offpage)); | ||||
format = UMA_ZFLAG_OFFPAGE; | format = UMA_ZFLAG_OFFPAGE; | ||||
ipers = ipers_offpage; | ipers = ipers_offpage; | ||||
} | } | ||||
out: | out: | ||||
/* | /* | ||||
* How do we find the slab header if it is offpage or if not all item | * How do we find the slab header if it is offpage or if not all item | ||||
* start addresses are in the same page? We could solve the latter | * start addresses are in the same page? We could solve the latter | ||||
* case with vaddr alignment, but we don't. | * case with vaddr alignment, but we don't. | ||||
*/ | */ | ||||
if ((format & UMA_ZFLAG_OFFPAGE) != 0 || | if ((format & UMA_ZFLAG_OFFPAGE) != 0 || | ||||
(ipers - 1) * rsize >= PAGE_SIZE) { | (ipers - 1) * rsize >= PAGE_SIZE) { | ||||
if ((keg->uk_flags & UMA_ZONE_NOTPAGE) != 0) | if ((keg->uk_flags & UMA_ZONE_NOTPAGE) != 0) | ||||
format |= UMA_ZFLAG_HASH; | format |= UMA_ZFLAG_HASH; | ||||
else | else | ||||
format |= UMA_ZFLAG_VTOSLAB; | format |= UMA_ZFLAG_VTOSLAB; | ||||
} | } | ||||
keg->uk_ipers = ipers; | keg->uk_ipers = ipers; | ||||
keg->uk_rsize = rsize; | keg->uk_rsize = rsize; | ||||
keg->uk_flags |= format; | keg->uk_flags |= format; | ||||
keg->uk_ppera = pages; | keg->uk_ppera = pages; | ||||
CTR6(KTR_UMA, "%s: keg=%s, flags=%#x, rsize=%u, ipers=%u, ppera=%u\n", | CTR6(KTR_UMA, "%s: keg=%s, flags=%#x, rsize=%u, ipers=%u, ppera=%u", | ||||
__func__, keg->uk_name, keg->uk_flags, rsize, ipers, pages); | __func__, keg->uk_name, keg->uk_flags, rsize, ipers, pages); | ||||
KASSERT(keg->uk_ipers > 0 && keg->uk_ipers <= SLAB_MAX_SETSIZE, | KASSERT(keg->uk_ipers > 0 && keg->uk_ipers <= SLAB_MAX_SETSIZE, | ||||
("%s: keg=%s, flags=0x%b, rsize=%u, ipers=%u, ppera=%u", __func__, | ("%s: keg=%s, flags=0x%b, rsize=%u, ipers=%u, ppera=%u", __func__, | ||||
keg->uk_name, keg->uk_flags, PRINT_UMA_ZFLAGS, rsize, ipers, | keg->uk_name, keg->uk_flags, PRINT_UMA_ZFLAGS, rsize, ipers, | ||||
pages)); | pages)); | ||||
} | } | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 117 Lines • ▼ Show 20 Lines | if (!(keg->uk_flags & UMA_ZFLAG_OFFPAGE)) { | ||||
KASSERT(keg->uk_pgoff + shsize <= PAGE_SIZE * keg->uk_ppera, | KASSERT(keg->uk_pgoff + shsize <= PAGE_SIZE * keg->uk_ppera, | ||||
("zone %s ipers %d rsize %d size %d slab won't fit", | ("zone %s ipers %d rsize %d size %d slab won't fit", | ||||
zone->uz_name, keg->uk_ipers, keg->uk_rsize, keg->uk_size)); | zone->uz_name, keg->uk_ipers, keg->uk_rsize, keg->uk_size)); | ||||
} | } | ||||
if (keg->uk_flags & UMA_ZFLAG_HASH) | if (keg->uk_flags & UMA_ZFLAG_HASH) | ||||
hash_alloc(&keg->uk_hash, 0); | hash_alloc(&keg->uk_hash, 0); | ||||
CTR3(KTR_UMA, "keg_ctor %p zone %s(%p)\n", keg, zone->uz_name, zone); | CTR3(KTR_UMA, "keg_ctor %p zone %s(%p)", keg, zone->uz_name, zone); | ||||
LIST_INSERT_HEAD(&keg->uk_zones, zone, uz_link); | LIST_INSERT_HEAD(&keg->uk_zones, zone, uz_link); | ||||
rw_wlock(&uma_rwlock); | rw_wlock(&uma_rwlock); | ||||
LIST_INSERT_HEAD(&uma_kegs, keg, uk_link); | LIST_INSERT_HEAD(&uma_kegs, keg, uk_link); | ||||
rw_wunlock(&uma_rwlock); | rw_wunlock(&uma_rwlock); | ||||
return (0); | return (0); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 1,507 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
static uma_bucket_t | static uma_bucket_t | ||||
zone_alloc_bucket(uma_zone_t zone, void *udata, int domain, int flags) | zone_alloc_bucket(uma_zone_t zone, void *udata, int domain, int flags) | ||||
{ | { | ||||
uma_bucket_t bucket; | uma_bucket_t bucket; | ||||
int maxbucket, cnt; | int maxbucket, cnt; | ||||
CTR1(KTR_UMA, "zone_alloc:_bucket domain %d)", domain); | CTR4(KTR_UMA, "zone_alloc_bucket thread %x zone %s(%p) domain %d", | ||||
markj: I think curthread is somewhat redundant since KTR always logs thread IDs.
... ah, I see it is… | |||||
rlibbyAuthorUnsubmitted Done Inline ActionsYes. Although, it looks like there are only 4 others. We could fix those not to print thread instead? How thread is printed in uma_core.c is kind of weird anyway ("%x"). Separately it looks like ktr_tracepoint/ktr_verbose doesn't print the thread. I don't know if we care to change that. rlibby: Yes. Although, it looks like there are only 4 others. We could fix those not to print thread… | |||||
markjUnsubmitted Not Done Inline ActionsI'd be fine with dropping the thread from the KTR messages. I think they used to be plain printf()s and were converted mechanically, which would explain why they're there. Hmm, I don't think I've ever used ktr_verbose before. I agree that it should print the thread pointer as well. markj: I'd be fine with dropping the thread from the KTR messages. I think they used to be plain… | |||||
curthread, zone->uz_name, zone, domain); | |||||
/* Avoid allocs targeting empty domains. */ | /* Avoid allocs targeting empty domains. */ | ||||
if (domain != UMA_ANYDOMAIN && VM_DOMAIN_EMPTY(domain)) | if (domain != UMA_ANYDOMAIN && VM_DOMAIN_EMPTY(domain)) | ||||
domain = UMA_ANYDOMAIN; | domain = UMA_ANYDOMAIN; | ||||
if (zone->uz_max_items > 0) | if (zone->uz_max_items > 0) | ||||
maxbucket = zone_alloc_limit(zone, zone->uz_bucket_size, | maxbucket = zone_alloc_limit(zone, zone->uz_bucket_size, | ||||
M_NOWAIT); | M_NOWAIT); | ||||
▲ Show 20 Lines • Show All 1,503 Lines • Show Last 20 Lines |
I think curthread is somewhat redundant since KTR always logs thread IDs.
... ah, I see it is in other KTR messages, so we should at least be consistent.