45 #include <sys/cdefs.h>
49 #include "opt_kdtrace.h"
52 #include <sys/param.h>
53 #include <sys/systm.h>
55 #include <sys/kernel.h>
57 #include <sys/malloc.h>
59 #include <sys/mutex.h>
60 #include <sys/vmmeter.h>
63 #include <sys/sysctl.h>
68 #include <vm/vm_param.h>
69 #include <vm/vm_kern.h>
70 #include <vm/vm_extern.h>
71 #include <vm/vm_map.h>
72 #include <vm/vm_page.h>
74 #include <vm/uma_int.h>
75 #include <vm/uma_dbg.h>
78 #include <vm/memguard.h>
81 #include <vm/redzone.h>
84 #if defined(INVARIANTS) && defined(__i386__)
85 #include <machine/cpu.h>
91 #include <sys/dtrace_bsd.h>
93 dtrace_malloc_probe_func_t dtrace_malloc_probe;
102 #ifndef REALLOC_FRACTION
103 #define REALLOC_FRACTION 1
109 MALLOC_DEFINE(M_CACHE,
"cache",
"Various Dynamically allocated caches");
111 MALLOC_DEFINE(M_TEMP,
"temp",
"misc temporary data buffers");
114 MALLOC_DEFINE(M_IP6NDP,
"ip6ndp",
"IPv6 Neighbor Discovery");
124 #define KMEM_ZSHIFT 4
125 #define KMEM_ZBASE 16
126 #define KMEM_ZMASK (KMEM_ZBASE - 1)
128 #define KMEM_ZMAX PAGE_SIZE
129 #define KMEM_ZSIZE (KMEM_ZMAX >> KMEM_ZSHIFT)
132 #ifndef MALLOC_DEBUG_MAXZONES
133 #define MALLOC_DEBUG_MAXZONES 1
163 #if PAGE_SIZE > 16384
165 #if PAGE_SIZE > 32768
167 #if PAGE_SIZE > 65536
168 #error "Unsupported PAGE_SIZE"
189 "Size of kernel memory");
193 "Minimum size of kernel memory");
197 "Maximum size of kernel memory");
201 "Scale factor for kernel memory size");
205 CTLFLAG_RD | CTLTYPE_ULONG | CTLFLAG_MPSAFE, NULL, 0,
210 CTLFLAG_RD | CTLTYPE_ULONG | CTLFLAG_MPSAFE, NULL, 0,
218 #ifdef MALLOC_PROFILE
221 static int sysctl_kern_mprof(SYSCTL_HANDLER_ARGS);
231 #if defined(MALLOC_MAKE_FAILURES) || (MALLOC_DEBUG_MAXZONES > 1)
233 "Kernel malloc debugging options");
240 #ifdef MALLOC_MAKE_FAILURES
241 static int malloc_failure_rate;
242 static int malloc_nowait_count;
243 static int malloc_failure_count;
244 SYSCTL_INT(_debug_malloc, OID_AUTO, failure_rate, CTLFLAG_RW,
245 &malloc_failure_rate, 0,
"Every (n) mallocs with M_NOWAIT will fail");
246 TUNABLE_INT(
"debug.malloc.failure_rate", &malloc_failure_rate);
247 SYSCTL_INT(_debug_malloc, OID_AUTO, failure_count, CTLFLAG_RD,
248 &malloc_failure_count, 0,
"Number of imposed M_NOWAIT malloc failures");
256 size = kmem_map->size;
265 vm_map_lock_read(kmem_map);
266 size = kmem_map->root != NULL ? kmem_map->root->max_free :
267 kmem_map->max_offset - kmem_map->min_offset;
268 vm_map_unlock_read(kmem_map);
276 #if MALLOC_DEBUG_MAXZONES > 1
278 tunable_set_numzones(
void)
281 TUNABLE_INT_FETCH(
"debug.malloc.numzones",
290 SYSINIT(
numzones, SI_SUB_TUNABLES, SI_ORDER_ANY, tunable_set_numzones, NULL);
292 &
numzones, 0,
"Number of malloc uma subzones");
298 static u_int zone_offset = __BSDSUniX_version;
299 TUNABLE_INT(
"debug.malloc.zone_offset", &zone_offset);
300 SYSCTL_UINT(_debug_malloc, OID_AUTO, zone_offset, CTLFLAG_RDTUN,
301 &zone_offset, 0,
"Separate malloc types by examining the "
302 "Nth character in the malloc type short description.");
310 if (desc == NULL || (len = strlen(desc)) == 0)
312 val = desc[zone_offset % len];
315 #elif MALLOC_DEBUG_MAXZONES == 0
316 #error "MALLOC_DEBUG_MAXZONES must be positive."
343 struct malloc_type_internal *mtip;
344 struct malloc_type_stats *mtsp;
347 mtip = mtp->ks_handle;
348 mtsp = &mtip->mti_stats[curcpu];
350 mtsp->mts_memalloced += size;
351 mtsp->mts_numallocs++;
354 mtsp->mts_size |= 1 << zindx;
357 if (dtrace_malloc_probe != NULL) {
358 uint32_t probe_id = mtip->mti_probes[DTMALLOC_PROBE_MALLOC];
360 (dtrace_malloc_probe)(probe_id,
361 (uintptr_t) mtp, (uintptr_t) mtip,
362 (uintptr_t) mtsp, size, zindx);
386 struct malloc_type_internal *mtip;
387 struct malloc_type_stats *mtsp;
390 mtip = mtp->ks_handle;
391 mtsp = &mtip->mti_stats[curcpu];
392 mtsp->mts_memfreed += size;
393 mtsp->mts_numfrees++;
396 if (dtrace_malloc_probe != NULL) {
397 uint32_t probe_id = mtip->mti_probes[DTMALLOC_PROBE_FREE];
399 (dtrace_malloc_probe)(probe_id,
400 (uintptr_t) mtp, (uintptr_t) mtip,
401 (uintptr_t) mtsp, size, 0);
418 vm_paddr_t low, vm_paddr_t high,
unsigned long alignment,
419 unsigned long boundary)
423 ret = (
void *)kmem_alloc_contig(kernel_map, size, flags, low, high,
424 alignment, boundary, VM_MEMATTR_DEFAULT);
441 kmem_free(kernel_map, (vm_offset_t)addr, size);
454 malloc(
unsigned long size,
struct malloc_type *mtp,
int flags)
457 struct malloc_type_internal *mtip;
460 #if defined(DIAGNOSTIC) || defined(DEBUG_REDZONE)
461 unsigned long osize = size;
465 KASSERT(mtp->ks_magic == M_MAGIC, (
"malloc: bad malloc type magic"));
469 indx = flags & (M_WAITOK | M_NOWAIT);
470 if (indx != M_NOWAIT && indx != M_WAITOK) {
471 static struct timeval lasterr;
472 static int curerr, once;
474 printf(
"Bad malloc flags: %x\n", indx);
481 #ifdef MALLOC_MAKE_FAILURES
482 if ((flags & M_NOWAIT) && (malloc_failure_rate != 0)) {
483 atomic_add_int(&malloc_nowait_count, 1);
484 if ((malloc_nowait_count % malloc_failure_rate) == 0) {
485 atomic_add_int(&malloc_failure_count, 1);
491 if (flags & M_WAITOK)
492 KASSERT(curthread->td_intr_nesting_level == 0,
493 (
"malloc(M_WAITOK) in interrupt context"));
495 #ifdef DEBUG_MEMGUARD
496 if (memguard_cmp(mtp, size)) {
497 va = memguard_alloc(size, flags);
505 size = redzone_size_ntor(size);
509 mtip = mtp->ks_handle;
514 (
"mti_zone %u out of range %d",
516 zone =
kmemzones[indx].kz_zone[mtip->mti_zone];
517 #ifdef MALLOC_PROFILE
520 va = uma_zalloc(zone, flags);
522 size = zone->uz_size;
525 size = roundup(size, PAGE_SIZE);
527 va = uma_large_malloc(size, flags);
530 if (flags & M_WAITOK)
531 KASSERT(va != NULL, (
"malloc(M_WAITOK) returned NULL"));
535 if (va != NULL && !(flags & M_ZERO)) {
536 memset(va, 0x70, osize);
541 va = redzone_setup(va, osize);
543 return ((
void *) va);
554 free(
void *addr,
struct malloc_type *mtp)
559 KASSERT(mtp->ks_magic == M_MAGIC, (
"free: bad malloc type magic"));
565 #ifdef DEBUG_MEMGUARD
566 if (is_memguard_addr(addr)) {
574 addr = redzone_addr_ntor(addr);
577 slab = vtoslab((vm_offset_t)addr & (~UMA_SLAB_MASK));
580 panic(
"free: address %p(%p) has not been allocated.\n",
581 addr, (
void *)((u_long)addr & (~UMA_SLAB_MASK)));
584 if (!(slab->us_flags & UMA_SLAB_MALLOC)) {
586 struct malloc_type **mtpp = addr;
588 size = slab->us_keg->uk_size;
598 mtpp = (
struct malloc_type **)
599 ((
unsigned long)mtpp & ~UMA_ALIGN_PTR);
600 mtpp += (size -
sizeof(
struct malloc_type *)) /
601 sizeof(
struct malloc_type *);
604 uma_zfree_arg(LIST_FIRST(&slab->us_keg->uk_zones), addr, slab);
606 size = slab->us_size;
607 uma_large_free(slab);
616 realloc(
void *addr,
unsigned long size,
struct malloc_type *mtp,
int flags)
622 KASSERT(mtp->ks_magic == M_MAGIC,
623 (
"realloc: bad malloc type magic"));
627 return (
malloc(size, mtp, flags));
634 #ifdef DEBUG_MEMGUARD
635 if (is_memguard_addr(addr))
636 return (memguard_realloc(addr, size, mtp, flags));
641 alloc = redzone_get_size(addr);
643 slab = vtoslab((vm_offset_t)addr & ~(UMA_SLAB_MASK));
646 KASSERT(slab != NULL,
647 (
"realloc: address %p out of range", (
void *)addr));
650 if (!(slab->us_flags & UMA_SLAB_MALLOC))
651 alloc = slab->us_keg->uk_size;
653 alloc = slab->us_size;
662 if ((newaddr =
malloc(size, mtp, flags)) == NULL)
666 bcopy(addr, newaddr, min(size, alloc));
675 reallocf(
void *addr,
unsigned long size,
struct malloc_type *mtp,
int flags)
679 if ((mem =
realloc(addr, size, mtp, flags)) == NULL)
692 u_long mem_size, tmp;
707 mem_size = cnt.v_page_count;
709 #if defined(VM_KMEM_SIZE_SCALE)
717 #if defined(VM_KMEM_SIZE_MIN)
725 #if defined(VM_KMEM_SIZE_MAX)
744 #ifdef DEBUG_MEMGUARD
751 kmem_map->system_map = 1;
753 #ifdef DEBUG_MEMGUARD
759 memguard_init(kmem_map);
764 mt_zone = uma_zcreate(
"mt_zone",
sizeof(
struct malloc_type_internal),
766 mtrash_ctor, mtrash_dtor, mtrash_init, mtrash_fini,
768 NULL, NULL, NULL, NULL,
770 UMA_ALIGN_PTR, UMA_ZONE_MALLOC);
771 for (i = 0, indx = 0;
kmemzones[indx].kz_size != 0; indx++) {
776 for (subzone = 0; subzone <
numzones; subzone++) {
778 uma_zcreate(name, size,
780 mtrash_ctor, mtrash_dtor, mtrash_init, mtrash_fini,
782 NULL, NULL, NULL, NULL,
784 UMA_ALIGN_PTR, UMA_ZONE_MALLOC);
795 struct malloc_type_internal *mtip;
796 struct malloc_type *mtp;
798 KASSERT(cnt.v_page_count != 0, (
"malloc_register before vm_init"));
801 if (mtp->ks_magic != M_MAGIC)
802 panic(
"malloc_init: bad malloc type magic");
804 mtip = uma_zalloc(
mt_zone, M_WAITOK | M_ZERO);
805 mtp->ks_handle = mtip;
818 struct malloc_type_internal *mtip;
819 struct malloc_type_stats *mtsp;
820 struct malloc_type *mtp, *temp;
822 long temp_allocs, temp_bytes;
826 KASSERT(mtp->ks_magic == M_MAGIC,
827 (
"malloc_uninit: bad malloc type magic"));
828 KASSERT(mtp->ks_handle != NULL, (
"malloc_deregister: cookie NULL"));
831 mtip = mtp->ks_handle;
832 mtp->ks_handle = NULL;
835 temp = temp->ks_next) {
836 if (temp->ks_next == mtp) {
837 temp->ks_next = mtp->ks_next;
842 (
"malloc_uninit: type '%s' not found", mtp->ks_shortdesc));
851 temp_allocs = temp_bytes = 0;
852 for (i = 0; i < MAXCPU; i++) {
853 mtsp = &mtip->mti_stats[i];
854 temp_allocs += mtsp->mts_numallocs;
855 temp_allocs -= mtsp->mts_numfrees;
856 temp_bytes += mtsp->mts_memalloced;
857 temp_bytes -= mtsp->mts_memfreed;
859 if (temp_allocs > 0 || temp_bytes > 0) {
860 printf(
"Warning: memory type %s leaked memory on destroy "
861 "(%ld allocations, %ld bytes leaked).\n", mtp->ks_shortdesc,
862 temp_allocs, temp_bytes);
865 slab = vtoslab((vm_offset_t) mtip & (~UMA_SLAB_MASK));
866 uma_zfree_arg(
mt_zone, mtip, slab);
872 struct malloc_type *mtp;
876 if (strcmp(mtp->ks_shortdesc, desc) == 0)
885 struct malloc_type_stream_header mtsh;
886 struct malloc_type_internal *mtip;
887 struct malloc_type_header mth;
888 struct malloc_type *mtp;
901 bzero(&mtsh,
sizeof(mtsh));
902 mtsh.mtsh_version = MALLOC_TYPE_STREAM_VERSION;
903 mtsh.mtsh_maxcpus = MAXCPU;
905 (void)
sbuf_bcat(&sbuf, &mtsh,
sizeof(mtsh));
911 mtip = (
struct malloc_type_internal *)mtp->ks_handle;
916 bzero(&mth,
sizeof(mth));
917 strlcpy(mth.mth_name, mtp->ks_shortdesc, MALLOC_MAX_NAME);
918 (void)
sbuf_bcat(&sbuf, &mth,
sizeof(mth));
923 for (i = 0; i < MAXCPU; i++) {
924 (void)
sbuf_bcat(&sbuf, &mtip->mti_stats[i],
925 sizeof(mtip->mti_stats[i]));
934 SYSCTL_PROC(_kern, OID_AUTO, malloc_stats, CTLFLAG_RD|CTLTYPE_STRUCT,
936 "Return malloc types");
939 "Count of kernel malloc types");
944 struct malloc_type *mtp, **bufmtp;
954 buflen =
sizeof(
struct malloc_type *) * count;
955 bufmtp =
malloc(buflen, M_TEMP, M_WAITOK);
960 free(bufmtp, M_TEMP);
964 for (mtp =
kmemstatistics, i = 0; mtp != NULL; mtp = mtp->ks_next, i++)
969 for (i = 0; i <
count; i++)
970 (func)(bufmtp[i], arg);
972 free(bufmtp, M_TEMP);
976 DB_SHOW_COMMAND(
malloc, db_show_malloc)
978 struct malloc_type_internal *mtip;
979 struct malloc_type *mtp;
980 uint64_t allocs, frees;
981 uint64_t alloced, freed;
984 db_printf(
"%18s %12s %12s %12s\n",
"Type",
"InUse",
"MemUse",
987 mtip = (
struct malloc_type_internal *)mtp->ks_handle;
992 for (i = 0; i < MAXCPU; i++) {
993 allocs += mtip->mti_stats[i].mts_numallocs;
994 frees += mtip->mti_stats[i].mts_numfrees;
995 alloced += mtip->mti_stats[i].mts_memalloced;
996 freed += mtip->mti_stats[i].mts_memfreed;
998 db_printf(
"%18s %12ju %12juK %12ju\n",
999 mtp->ks_shortdesc, allocs - frees,
1000 (alloced - freed + 1023) / 1024, allocs);
1006 #if MALLOC_DEBUG_MAXZONES > 1
1007 DB_SHOW_COMMAND(multizone_matches, db_show_multizone_matches)
1009 struct malloc_type_internal *mtip;
1010 struct malloc_type *mtp;
1014 db_printf(
"Usage: show multizone_matches <malloc type/addr>\n");
1018 if (mtp->ks_magic != M_MAGIC) {
1019 db_printf(
"Magic %lx does not match expected %x\n",
1020 mtp->ks_magic, M_MAGIC);
1024 mtip = mtp->ks_handle;
1025 subzone = mtip->mti_zone;
1028 mtip = mtp->ks_handle;
1029 if (mtip->mti_zone != subzone)
1031 db_printf(
"%s\n", mtp->ks_shortdesc);
1039 #ifdef MALLOC_PROFILE
1042 sysctl_kern_mprof(SYSCTL_HANDLER_ARGS)
1061 "\n Size Requests Real Size\n");
1065 count = (
long long unsigned)krequests[i];
1068 (
unsigned long long)count, rsize);
1070 if ((rsize * count) > (size * count))
1071 waste += (rsize *
count) - (size * count);
1072 mem += (rsize *
count);
1075 "\nTotal memory used:\t%30llu\nTotal Memory wasted:\t%30llu\n",
1076 (
unsigned long long)mem, (
unsigned long long)waste);
1082 SYSCTL_OID(_kern, OID_AUTO, mprof, CTLTYPE_STRING|CTLFLAG_RD,
1083 NULL, 0, sysctl_kern_mprof,
"A",
"Malloc Profiling");
SYSCTL_ULONG(_vm, OID_AUTO, kmem_size, CTLFLAG_RDTUN,&vm_kmem_size, 0,"Size of kernel memory")
static int sysctl_kmem_map_free(SYSCTL_HANDLER_ARGS)
void * realloc(void *addr, unsigned long size, struct malloc_type *mtp, int flags)
TUNABLE_INT("kern.eventtimer.singlemul",&singlemul)
static SYSCTL_NODE(_debug, OID_AUTO, cpufreq, CTLFLAG_RD, NULL,"cpufreq debugging")
int ppsratecheck(struct timeval *lasttime, int *curpps, int maxpps)
static u_long vm_kmem_size_min
void malloc_uninit(void *data)
static u_int mtp_get_subzone(const char *desc)
void * malloc(unsigned long size, struct malloc_type *mtp, int flags)
static time_t t_malloc_fail
void contigfree(void *addr, unsigned long size, struct malloc_type *type)
void panic(const char *fmt,...)
static int sysctl_kern_malloc_stats(SYSCTL_HANDLER_ARGS)
int malloc_last_fail(void)
SYSINIT(kmem, SI_SUB_KMEM, SI_ORDER_FIRST, kmeminit, NULL)
void malloc_type_allocated(struct malloc_type *mtp, unsigned long size)
static void kmeminit(void *)
void * contigmalloc(unsigned long size, struct malloc_type *type, int flags, vm_paddr_t low, vm_paddr_t high, unsigned long alignment, unsigned long boundary)
static u_int vm_kmem_size_scale
struct malloc_type * malloc_desc2type(const char *desc)
static void malloc_type_zone_allocated(struct malloc_type *mtp, unsigned long size, int zindx)
SYSCTL_OID(_security_jail, OID_AUTO, list, CTLTYPE_STRUCT|CTLFLAG_RD|CTLFLAG_MPSAFE, NULL, 0, sysctl_jail_list,"S","List of active jails")
SYSCTL_PROC(_vm, OID_AUTO, kmem_map_size, CTLFLAG_RD|CTLTYPE_ULONG|CTLFLAG_MPSAFE, NULL, 0, sysctl_kmem_map_size,"LU","Current kmem_map allocation size")
int sbuf_printf(struct sbuf *s, const char *fmt,...)
static u_long vm_kmem_size_max
#define MALLOC_DEBUG_MAXZONES
static struct malloc_type * kmemstatistics
void malloc_type_list(malloc_type_list_func_t *func, void *arg)
static int sysctl_kmem_map_size(SYSCTL_HANDLER_ARGS)
static vm_offset_t kmembase
void free(void *addr, struct malloc_type *mtp)
int printf(const char *fmt,...)
uma_zone_t kz_zone[MALLOC_DEBUG_MAXZONES]
void sbuf_delete(struct sbuf *s)
SYSCTL_INT(_kern, OID_AUTO, malloc_count, CTLFLAG_RD,&kmemcount, 0,"Count of kernel malloc types")
int sysctl_wire_old_buffer(struct sysctl_req *req, size_t len)
void mtx_init(struct mtx *m, const char *name, const char *type, int opts)
int sbuf_bcat(struct sbuf *s, const void *buf, size_t len)
int sbuf_finish(struct sbuf *s)
static uint8_t kmemsize[KMEM_ZSIZE+1]
void malloc_init(void *data)
volatile time_t time_uptime
MALLOC_DEFINE(M_CACHE,"cache","Various Dynamically allocated caches")
int sysctl_handle_long(SYSCTL_HANDLER_ARGS)
void * reallocf(void *addr, unsigned long size, struct malloc_type *mtp, int flags)
void malloc_type_freed(struct malloc_type *mtp, unsigned long size)
static vm_offset_t kmemlimit
static uma_zone_t mt_zone
void critical_enter(void)
struct sbuf * sbuf_new_for_sysctl(struct sbuf *s, char *buf, int length, struct sysctl_req *req)
SYSCTL_UINT(_vm, OID_AUTO, kmem_size_scale, CTLFLAG_RDTUN,&vm_kmem_size_scale, 0,"Scale factor for kernel memory size")