Changeset View
Changeset View
Standalone View
Standalone View
head/sys/kern/kern_malloc.c
Show First 20 Lines • Show All 646 Lines • ▼ Show 20 Lines | |||||
#ifdef DEBUG_REDZONE | #ifdef DEBUG_REDZONE | ||||
if (va != NULL) | if (va != NULL) | ||||
va = redzone_setup(va, osize); | va = redzone_setup(va, osize); | ||||
#endif | #endif | ||||
return ((void *) va); | return ((void *) va); | ||||
} | } | ||||
static void * | static void * | ||||
malloc_domain(size_t size, int *indxp, struct malloc_type *mtp, int domain, | malloc_domain(size_t *sizep, int *indxp, struct malloc_type *mtp, int domain, | ||||
int flags) | int flags) | ||||
{ | { | ||||
int indx; | |||||
caddr_t va; | |||||
uma_zone_t zone; | uma_zone_t zone; | ||||
caddr_t va; | |||||
size_t size; | |||||
int indx; | |||||
size = *sizep; | |||||
KASSERT(size <= kmem_zmax && (flags & M_EXEC) == 0, | KASSERT(size <= kmem_zmax && (flags & M_EXEC) == 0, | ||||
("malloc_domain: Called with bad flag / size combination.")); | ("malloc_domain: Called with bad flag / size combination.")); | ||||
if (size & KMEM_ZMASK) | if (size & KMEM_ZMASK) | ||||
size = (size & ~KMEM_ZMASK) + KMEM_ZBASE; | size = (size & ~KMEM_ZMASK) + KMEM_ZBASE; | ||||
indx = kmemsize[size >> KMEM_ZSHIFT]; | indx = kmemsize[size >> KMEM_ZSHIFT]; | ||||
zone = kmemzones[indx].kz_zone[mtp_get_subzone(mtp)]; | zone = kmemzones[indx].kz_zone[mtp_get_subzone(mtp)]; | ||||
#ifdef MALLOC_PROFILE | #ifdef MALLOC_PROFILE | ||||
krequests[size >> KMEM_ZSHIFT]++; | krequests[size >> KMEM_ZSHIFT]++; | ||||
#endif | #endif | ||||
va = uma_zalloc_domain(zone, NULL, domain, flags); | va = uma_zalloc_domain(zone, NULL, domain, flags); | ||||
if (va != NULL) | if (va != NULL) | ||||
size = zone->uz_size; | *sizep = zone->uz_size; | ||||
*indxp = indx; | *indxp = indx; | ||||
return ((void *) va); | return ((void *)va); | ||||
} | } | ||||
void * | void * | ||||
malloc_domainset(size_t size, struct malloc_type *mtp, struct domainset *ds, | malloc_domainset(size_t size, struct malloc_type *mtp, struct domainset *ds, | ||||
int flags) | int flags) | ||||
{ | { | ||||
struct vm_domainset_iter di; | struct vm_domainset_iter di; | ||||
caddr_t ret; | caddr_t ret; | ||||
int domain; | int domain; | ||||
int indx; | int indx; | ||||
#if defined(DEBUG_REDZONE) | #if defined(DEBUG_REDZONE) | ||||
unsigned long osize = size; | unsigned long osize = size; | ||||
#endif | #endif | ||||
#ifdef MALLOC_DEBUG | #ifdef MALLOC_DEBUG | ||||
ret= NULL; | ret= NULL; | ||||
if (malloc_dbg(&ret, &size, mtp, flags) != 0) | if (malloc_dbg(&ret, &size, mtp, flags) != 0) | ||||
return (ret); | return (ret); | ||||
#endif | #endif | ||||
if (size <= kmem_zmax && (flags & M_EXEC) == 0) { | if (size <= kmem_zmax && (flags & M_EXEC) == 0) { | ||||
vm_domainset_iter_policy_init(&di, ds, &domain, &flags); | vm_domainset_iter_policy_init(&di, ds, &domain, &flags); | ||||
do { | do { | ||||
ret = malloc_domain(size, &indx, mtp, domain, flags); | ret = malloc_domain(&size, &indx, mtp, domain, flags); | ||||
} while (ret == NULL && | } while (ret == NULL && | ||||
vm_domainset_iter_policy(&di, &domain) == 0); | vm_domainset_iter_policy(&di, &domain) == 0); | ||||
malloc_type_zone_allocated(mtp, ret == NULL ? 0 : size, indx); | malloc_type_zone_allocated(mtp, ret == NULL ? 0 : size, indx); | ||||
} else { | } else { | ||||
/* Policy is handled by kmem. */ | /* Policy is handled by kmem. */ | ||||
ret = malloc_large(&size, ds, flags); | ret = malloc_large(&size, ds, flags); | ||||
malloc_type_allocated(mtp, ret == NULL ? 0 : size); | malloc_type_allocated(mtp, ret == NULL ? 0 : size); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 728 Lines • Show Last 20 Lines |