Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/kern_malloc.c
Show First 20 Lines • Show All 758 Lines • ▼ Show 20 Lines | #ifdef MALLOC_DEBUG | ||||
if (malloc_dbg(&va, &size, mtp, flags) != 0) | if (malloc_dbg(&va, &size, mtp, flags) != 0) | ||||
return (va); | return (va); | ||||
#endif | #endif | ||||
return (malloc_large(&size, mtp, ds, flags DEBUG_REDZONE_ARG)); | return (malloc_large(&size, mtp, ds, flags DEBUG_REDZONE_ARG)); | ||||
} | } | ||||
void * | void * | ||||
malloc_domainset_aligned(size_t size, size_t align, | |||||
struct malloc_type *mtp, struct domainset *ds, int flags) | |||||
{ | |||||
void *res; | |||||
KASSERT(align != 0 && powerof2(align), | |||||
("malloc_domainset_aligned: wrong alig %#zx size %#zx", | |||||
align, size)); | |||||
KASSERT(align <= kmemzones[nitems(kmemzones) - 2].kz_size, | |||||
("malloc_domainset_aligned: align %#zx (size %#zx) too large", | |||||
markj: I would add an assertion that the result really is correctly aligned. | |||||
align, size)); | |||||
if (size < align) | |||||
size = align; | |||||
res = malloc_domainset(size, mtp, ds, flags); | |||||
KASSERT(res == NULL || ((uintptr_t)res & (align - 1)) == 0, | |||||
("malloc_domainset_aligned: result not aligned %p size %#zx " | |||||
"align %#zx", res, size, align)); | |||||
return (res); | |||||
} | |||||
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); | ||||
return (malloc(size * nmemb, type, flags)); | return (malloc(size * nmemb, type, flags)); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 366 Lines • ▼ Show 20 Lines | mallocinit(void *dummy) | ||||
kmeminit(); | kmeminit(); | ||||
if (kmem_zmax < PAGE_SIZE || kmem_zmax > KMEM_ZMAX) | if (kmem_zmax < PAGE_SIZE || kmem_zmax > KMEM_ZMAX) | ||||
kmem_zmax = KMEM_ZMAX; | kmem_zmax = KMEM_ZMAX; | ||||
for (i = 0, indx = 0; kmemzones[indx].kz_size != 0; indx++) { | for (i = 0, indx = 0; kmemzones[indx].kz_size != 0; indx++) { | ||||
int size = kmemzones[indx].kz_size; | int size = kmemzones[indx].kz_size; | ||||
const char *name = kmemzones[indx].kz_name; | const char *name = kmemzones[indx].kz_name; | ||||
size_t align; | |||||
int subzone; | int subzone; | ||||
align = UMA_ALIGN_PTR; | |||||
if (powerof2(size) && size > sizeof(void *)) | |||||
align = size - 1; | |||||
for (subzone = 0; subzone < numzones; subzone++) { | for (subzone = 0; subzone < numzones; subzone++) { | ||||
kmemzones[indx].kz_zone[subzone] = | kmemzones[indx].kz_zone[subzone] = | ||||
uma_zcreate(name, size, | uma_zcreate(name, size, | ||||
#ifdef INVARIANTS | #ifdef INVARIANTS | ||||
mtrash_ctor, mtrash_dtor, mtrash_init, mtrash_fini, | mtrash_ctor, mtrash_dtor, mtrash_init, mtrash_fini, | ||||
#else | #else | ||||
NULL, NULL, NULL, NULL, | NULL, NULL, NULL, NULL, | ||||
#endif | #endif | ||||
UMA_ALIGN_PTR, UMA_ZONE_MALLOC); | align, UMA_ZONE_MALLOC); | ||||
} | } | ||||
for (;i <= size; i+= KMEM_ZBASE) | for (;i <= size; i+= KMEM_ZBASE) | ||||
kmemsize[i >> KMEM_ZSHIFT] = indx; | kmemsize[i >> KMEM_ZSHIFT] = indx; | ||||
} | } | ||||
} | } | ||||
SYSINIT(kmem, SI_SUB_KMEM, SI_ORDER_SECOND, mallocinit, NULL); | SYSINIT(kmem, SI_SUB_KMEM, SI_ORDER_SECOND, mallocinit, NULL); | ||||
void | void | ||||
▲ Show 20 Lines • Show All 310 Lines • Show Last 20 Lines |
I would add an assertion that the result really is correctly aligned.