Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/kern_malloc.c
Show First 20 Lines • Show All 222 Lines • ▼ Show 20 Lines | SYSCTL_UINT(_vm_malloc, OID_AUTO, zone_count, | ||||
CTLFLAG_RD, &vm_malloc_zone_count, 0, | CTLFLAG_RD, &vm_malloc_zone_count, 0, | ||||
"Number of malloc zones"); | "Number of malloc zones"); | ||||
static int sysctl_vm_malloc_zone_sizes(SYSCTL_HANDLER_ARGS); | static int sysctl_vm_malloc_zone_sizes(SYSCTL_HANDLER_ARGS); | ||||
SYSCTL_PROC(_vm_malloc, OID_AUTO, zone_sizes, | SYSCTL_PROC(_vm_malloc, OID_AUTO, zone_sizes, | ||||
CTLFLAG_RD | CTLTYPE_OPAQUE | CTLFLAG_MPSAFE, NULL, 0, | CTLFLAG_RD | CTLTYPE_OPAQUE | CTLFLAG_MPSAFE, NULL, 0, | ||||
sysctl_vm_malloc_zone_sizes, "S", "Zone sizes used by malloc"); | sysctl_vm_malloc_zone_sizes, "S", "Zone sizes used by malloc"); | ||||
#ifdef MALLOC_DEBUG | |||||
static uint64_t sysctl_panic_on_free_addr = 0; | |||||
SYSCTL_U64(_vm_malloc, OID_AUTO, panic_on_free_addr, CTLFLAG_RW, | |||||
&sysctl_panic_on_free_addr, 0, "Panic if this address is freed"); | |||||
static uint64_t sysctl_printf_on_free_addr = 0; | |||||
SYSCTL_U64(_vm_malloc, OID_AUTO, printf_on_free_addr, CTLFLAG_RW, | |||||
&sysctl_printf_on_free_addr, 0, "Printf if this address is freed"); | |||||
#endif | |||||
/* | /* | ||||
* The malloc_mtx protects the kmemstatistics linked list. | * The malloc_mtx protects the kmemstatistics linked list. | ||||
*/ | */ | ||||
struct mtx malloc_mtx; | struct mtx malloc_mtx; | ||||
static int sysctl_kern_malloc_stats(SYSCTL_HANDLER_ARGS); | static int sysctl_kern_malloc_stats(SYSCTL_HANDLER_ARGS); | ||||
#if defined(MALLOC_MAKE_FAILURES) || (MALLOC_DEBUG_MAXZONES > 1) | #if defined(MALLOC_MAKE_FAILURES) || (MALLOC_DEBUG_MAXZONES > 1) | ||||
▲ Show 20 Lines • Show All 249 Lines • ▼ Show 20 Lines | |||||
* | * | ||||
* Free a block of memory allocated by contigmalloc. | * Free a block of memory allocated by contigmalloc. | ||||
* | * | ||||
* This routine may not block. | * This routine may not block. | ||||
*/ | */ | ||||
void | void | ||||
contigfree(void *addr, unsigned long size, struct malloc_type *type) | contigfree(void *addr, unsigned long size, struct malloc_type *type) | ||||
{ | { | ||||
#ifdef MALLOC_DEBUG | |||||
if (sysctl_printf_on_free_addr != 0 && (uintptr_t)addr == (uintptr_t)sysctl_printf_on_free_addr) | |||||
printf("%s: REQUESTED PRINTF on freeing %p size %lu type %s\n", __func__, addr, size, type->ks_shortdesc); | |||||
if (sysctl_panic_on_free_addr != 0 && (uintptr_t)addr == (uintptr_t)sysctl_panic_on_free_addr) | |||||
panic("%s: REQUESTED PANIC on freeing %p size %lu type %s\n", __func__, addr, size, type->ks_shortdesc); | |||||
#endif | |||||
kmem_free(addr, size); | kmem_free(addr, size); | ||||
malloc_type_freed(type, round_page(size)); | malloc_type_freed(type, round_page(size)); | ||||
} | } | ||||
#ifdef MALLOC_DEBUG | #ifdef MALLOC_DEBUG | ||||
static int | static int | ||||
malloc_dbg(caddr_t *vap, size_t *sizep, struct malloc_type *mtp, | malloc_dbg(caddr_t *vap, size_t *sizep, struct malloc_type *mtp, | ||||
int flags) | int flags) | ||||
▲ Show 20 Lines • Show All 367 Lines • ▼ Show 20 Lines | free_dbg(void **addrp, struct malloc_type *mtp) | ||||
addr = *addrp; | addr = *addrp; | ||||
KASSERT(mtp->ks_version == M_VERSION, ("free: bad malloc type version")); | KASSERT(mtp->ks_version == M_VERSION, ("free: bad malloc type version")); | ||||
KASSERT(curthread->td_critnest == 0 || SCHEDULER_STOPPED(), | KASSERT(curthread->td_critnest == 0 || SCHEDULER_STOPPED(), | ||||
("free: called with spinlock or critical section held")); | ("free: called with spinlock or critical section held")); | ||||
/* free(NULL, ...) does nothing */ | /* free(NULL, ...) does nothing */ | ||||
if (addr == NULL) | if (addr == NULL) | ||||
return (EJUSTRETURN); | return (EJUSTRETURN); | ||||
if (sysctl_printf_on_free_addr != 0 && (uintptr_t)addr == (uintptr_t)sysctl_printf_on_free_addr) | |||||
printf("%s: REQUESTED PRINTF on freeing %p type %s\n", __func__, addr, mtp->ks_shortdesc); | |||||
if (sysctl_panic_on_free_addr != 0 && (uintptr_t)addr == (uintptr_t)sysctl_panic_on_free_addr) | |||||
panic("%s: REQUESTED PANIC on freeing %p type %s\n", __func__, addr, mtp->ks_shortdesc); | |||||
#ifdef DEBUG_MEMGUARD | #ifdef DEBUG_MEMGUARD | ||||
if (is_memguard_addr(addr)) { | if (is_memguard_addr(addr)) { | ||||
memguard_free(addr); | memguard_free(addr); | ||||
return (EJUSTRETURN); | return (EJUSTRETURN); | ||||
} | } | ||||
#endif | #endif | ||||
▲ Show 20 Lines • Show All 690 Lines • Show Last 20 Lines |