Changeset View
Changeset View
Standalone View
Standalone View
head/sys/kern/kern_malloc.c
Show First 20 Lines • Show All 612 Lines • ▼ Show 20 Lines | |||||
{ | { | ||||
int indx; | int indx; | ||||
caddr_t va; | caddr_t va; | ||||
uma_zone_t zone; | uma_zone_t zone; | ||||
#if defined(DEBUG_REDZONE) | #if defined(DEBUG_REDZONE) | ||||
unsigned long osize = size; | unsigned long osize = size; | ||||
#endif | #endif | ||||
MPASS((flags & M_EXEC) == 0); | |||||
#ifdef MALLOC_DEBUG | #ifdef MALLOC_DEBUG | ||||
va = NULL; | va = NULL; | ||||
if (malloc_dbg(&va, &size, mtp, flags) != 0) | if (malloc_dbg(&va, &size, mtp, flags) != 0) | ||||
return (va); | return (va); | ||||
#endif | #endif | ||||
if (size <= kmem_zmax && (flags & M_EXEC) == 0) { | if (size <= kmem_zmax) { | ||||
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(zone, flags); | va = uma_zalloc(zone, flags); | ||||
if (va != NULL) | if (va != NULL) | ||||
size = zone->uz_size; | size = zone->uz_size; | ||||
malloc_type_zone_allocated(mtp, va == NULL ? 0 : size, indx); | malloc_type_zone_allocated(mtp, va == NULL ? 0 : size, indx); | ||||
} else { | } else { | ||||
va = malloc_large(&size, DOMAINSET_RR(), flags); | va = malloc_large(&size, DOMAINSET_RR(), flags); | ||||
malloc_type_allocated(mtp, va == NULL ? 0 : size); | malloc_type_allocated(mtp, va == NULL ? 0 : size); | ||||
} | } | ||||
if (flags & M_WAITOK) | if (__predict_false(va == NULL)) { | ||||
KASSERT(va != NULL, ("malloc(M_WAITOK) returned NULL")); | KASSERT((flags & M_WAITOK) == 0, | ||||
else if (va == NULL) | ("malloc(M_WAITOK) returned NULL")); | ||||
t_malloc_fail = time_uptime; | t_malloc_fail = time_uptime; | ||||
} | |||||
#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 * | ||||
Show All 22 Lines | #endif | ||||
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 va; | ||||
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 | ||||
MPASS((flags & M_EXEC) == 0); | |||||
#ifdef MALLOC_DEBUG | #ifdef MALLOC_DEBUG | ||||
ret= NULL; | va = NULL; | ||||
if (malloc_dbg(&ret, &size, mtp, flags) != 0) | if (malloc_dbg(&va, &size, mtp, flags) != 0) | ||||
return (ret); | return (va); | ||||
#endif | #endif | ||||
if (size <= kmem_zmax && (flags & M_EXEC) == 0) { | if (size <= kmem_zmax) { | ||||
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); | va = malloc_domain(&size, &indx, mtp, domain, flags); | ||||
} while (ret == NULL && | } while (va == 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, va == NULL ? 0 : size, indx); | ||||
} else { | } else { | ||||
/* Policy is handled by kmem. */ | /* Policy is handled by kmem. */ | ||||
ret = malloc_large(&size, ds, flags); | va = malloc_large(&size, ds, flags); | ||||
malloc_type_allocated(mtp, ret == NULL ? 0 : size); | malloc_type_allocated(mtp, va == NULL ? 0 : size); | ||||
} | } | ||||
if (__predict_false(va == NULL)) { | |||||
KASSERT((flags & M_WAITOK) == 0, | |||||
("malloc(M_WAITOK) returned NULL")); | |||||
t_malloc_fail = time_uptime; | |||||
} | |||||
#ifdef DEBUG_REDZONE | |||||
if (va != NULL) | |||||
va = redzone_setup(va, osize); | |||||
#endif | |||||
return (va); | |||||
} | |||||
if (flags & M_WAITOK) | /* | ||||
KASSERT(ret != NULL, ("malloc(M_WAITOK) returned NULL")); | * Allocate an executable area. | ||||
else if (ret == NULL) | */ | ||||
void * | |||||
malloc_exec(size_t size, struct malloc_type *mtp, int flags) | |||||
{ | |||||
caddr_t va; | |||||
#if defined(DEBUG_REDZONE) | |||||
unsigned long osize = size; | |||||
#endif | |||||
flags |= M_EXEC; | |||||
#ifdef MALLOC_DEBUG | |||||
va = NULL; | |||||
if (malloc_dbg(&va, &size, mtp, flags) != 0) | |||||
return (va); | |||||
#endif | |||||
va = malloc_large(&size, DOMAINSET_RR(), flags); | |||||
malloc_type_allocated(mtp, va == NULL ? 0 : size); | |||||
if (__predict_false(va == NULL)) { | |||||
KASSERT((flags & M_WAITOK) == 0, | |||||
("malloc(M_WAITOK) returned NULL")); | |||||
t_malloc_fail = time_uptime; | t_malloc_fail = time_uptime; | ||||
} | |||||
#ifdef DEBUG_REDZONE | #ifdef DEBUG_REDZONE | ||||
if (ret != NULL) | if (va != NULL) | ||||
ret = redzone_setup(ret, osize); | va = redzone_setup(va, osize); | ||||
#endif | #endif | ||||
return (ret); | return ((void *) va); | ||||
} | |||||
void * | |||||
malloc_domainset_exec(size_t size, struct malloc_type *mtp, struct domainset *ds, | |||||
int flags) | |||||
{ | |||||
caddr_t va; | |||||
#if defined(DEBUG_REDZONE) | |||||
unsigned long osize = size; | |||||
#endif | |||||
flags |= M_EXEC; | |||||
#ifdef MALLOC_DEBUG | |||||
va = NULL; | |||||
if (malloc_dbg(&va, &size, mtp, flags) != 0) | |||||
return (va); | |||||
#endif | |||||
/* Policy is handled by kmem. */ | |||||
va = malloc_large(&size, ds, flags); | |||||
malloc_type_allocated(mtp, va == NULL ? 0 : size); | |||||
if (__predict_false(va == NULL)) { | |||||
KASSERT((flags & M_WAITOK) == 0, | |||||
("malloc(M_WAITOK) returned NULL")); | |||||
t_malloc_fail = time_uptime; | |||||
} | |||||
#ifdef DEBUG_REDZONE | |||||
if (va != NULL) | |||||
va = redzone_setup(va, osize); | |||||
#endif | |||||
return (va); | |||||
} | } | ||||
void * | void * | ||||
mallocarray(size_t nmemb, size_t size, struct malloc_type *type, int flags) | mallocarray(size_t nmemb, size_t size, struct malloc_type *type, int flags) | ||||
{ | { | ||||
if (WOULD_OVERFLOW(nmemb, size)) | if (WOULD_OVERFLOW(nmemb, size)) | ||||
panic("mallocarray: %zu * %zu overflowed", nmemb, size); | panic("mallocarray: %zu * %zu overflowed", nmemb, size); | ||||
▲ Show 20 Lines • Show All 753 Lines • Show Last 20 Lines |