diff --git a/sys/kern/kern_slaballoc.c b/sys/kern/kern_slaballoc.c index 747ecc3..e65ee7e 100644 --- a/sys/kern/kern_slaballoc.c +++ b/sys/kern/kern_slaballoc.c @@ -160,6 +160,7 @@ static int32_t weirdary[16]; static void *kmem_slab_alloc(vm_size_t bytes, vm_offset_t align, int flags); static void kmem_slab_free(void *ptr, vm_size_t bytes); +static int sysctl_kern_kmemstats(SYSCTL_HANDLER_ARGS); #if defined(INVARIANTS) static void chunk_mark_allocated(SLZone *z, void *chunk); @@ -222,11 +223,50 @@ SYSCTL_INT(_debug, OID_AUTO, use_malloc_pattern, CTLFLAG_RW, "Initialize memory to -1 if M_ZERO not specified"); #endif +SYSCTL_OID(_kern, OID_AUTO, kmemstats, CTLTYPE_STRING|CTLFLAG_RD, \ + NULL, 0, sysctl_kern_kmemstats, "A", "Malloc types info"); + static int ZoneRelsThresh = ZONE_RELS_THRESH; SYSCTL_INT(_kern, OID_AUTO, zone_big_alloc, CTLFLAG_RD, &ZoneBigAlloc, 0, ""); SYSCTL_INT(_kern, OID_AUTO, zone_gen_alloc, CTLFLAG_RD, &ZoneGenAlloc, 0, ""); SYSCTL_INT(_kern, OID_AUTO, zone_cache, CTLFLAG_RW, &ZoneRelsThresh, 0, ""); +static int +sysctl_kern_kmemstats(SYSCTL_HANDLER_ARGS) +{ + struct malloc_type *cur; + char tmpbuf[128]; + long allocs; + long meminuse; + int error; + int i; + + ksnprintf(tmpbuf, sizeof(tmpbuf), + "\n Type InUse MemUse HighUse Limit Requests Limit Limit\n"); + error = SYSCTL_OUT(req, tmpbuf, strlen(tmpbuf)); + if (error) + return (error); + + for (cur = kmemstatistics; cur != NULL; cur = cur->ks_next) { + for (i = allocs = meminuse = 0; i < SMP_MAXCPU; i++) { + allocs += cur->ks_inuse[i]; + meminuse += cur->ks_memuse[i]; + } + + ksnprintf(tmpbuf, sizeof(tmpbuf), "%19s%7ld%7ldK%7ldK%11zdK%10jd%5u%6u\n", + cur->ks_shortdesc, allocs, (meminuse + 1023) / 1024, + (cur->ks_maxused + 1023) / 1024, + (cur->ks_limit + 1023) / 1024, (intmax_t)cur->ks_calls, + cur->ks_limblocks, cur->ks_mapblocks); + + error = SYSCTL_OUT(req, tmpbuf, strlen(tmpbuf)); + if (error) + return (error); + } + + return 0; +} + /* * Returns the kernel memory size limit for the purposes of initializing * various subsystem caches. The smaller of available memory and the KVM @@ -1565,4 +1605,3 @@ kmem_slab_free(void *ptr, vm_size_t size) vm_map_remove(&kernel_map, (vm_offset_t)ptr, (vm_offset_t)ptr + size); crit_exit(); } -