aboutsummaryrefslogtreecommitdiff
path: root/sys/kern
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/kern_malloc.c79
1 files changed, 68 insertions, 11 deletions
diff --git a/sys/kern/kern_malloc.c b/sys/kern/kern_malloc.c
index 592e066c077f..ac8ed513b251 100644
--- a/sys/kern/kern_malloc.c
+++ b/sys/kern/kern_malloc.c
@@ -90,15 +90,10 @@ static char *kmemlimit;
#define KMEM_ZBASE 16
#define KMEM_ZMASK (KMEM_ZBASE - 1)
-#define KMEM_ZMAX 65536
+#define KMEM_ZMAX 8192
#define KMEM_ZSIZE (KMEM_ZMAX >> KMEM_ZSHIFT)
static u_int8_t kmemsize[KMEM_ZSIZE + 1];
-#ifdef MALLOC_PROFILE
-uint64_t krequests[KMEM_ZSIZE + 1];
-#endif
-
-
/* These won't be powers of two for long */
struct {
int kz_size;
@@ -115,17 +110,19 @@ struct {
{2048, "2048", NULL},
{4096, "4096", NULL},
{8192, "8192", NULL},
- {16384, "16384", NULL},
- {32768, "32768", NULL},
- {65536, "65536", NULL},
{0, NULL},
};
u_int vm_kmem_size;
static struct mtx malloc_mtx;
-static int sysctl_kern_malloc(SYSCTL_HANDLER_ARGS);
+#ifdef MALLOC_PROFILE
+uint64_t krequests[KMEM_ZSIZE + 1];
+
+static int sysctl_kern_mprof(SYSCTL_HANDLER_ARGS);
+#endif
+static int sysctl_kern_malloc(SYSCTL_HANDLER_ARGS);
/*
* malloc:
@@ -481,7 +478,7 @@ sysctl_kern_malloc(SYSCTL_HANDLER_ARGS)
p += len;
first = 1;
- for (i = 0; i < 14/* 8 * sizeof(type->ks_size)*/; i++)
+ for (i = 0; i < 8 * sizeof(type->ks_size); i++)
if (type->ks_size & (1 << i)) {
if (first)
len = snprintf(p, curline, " ");
@@ -511,3 +508,63 @@ sysctl_kern_malloc(SYSCTL_HANDLER_ARGS)
SYSCTL_OID(_kern, OID_AUTO, malloc, CTLTYPE_STRING|CTLFLAG_RD,
NULL, 0, sysctl_kern_malloc, "A", "Malloc Stats");
+
+#ifdef MALLOC_PROFILE
+
+static int
+sysctl_kern_mprof(SYSCTL_HANDLER_ARGS)
+{
+ int linesize = 64;
+ uint64_t count;
+ uint64_t waste;
+ uint64_t mem;
+ int bufsize;
+ int error;
+ char *buf;
+ int rsize;
+ int size;
+ char *p;
+ int len;
+ int i;
+
+ bufsize = linesize * (KMEM_ZSIZE + 1);
+ bufsize += 128; /* For the stats line */
+ bufsize += 128; /* For the banner line */
+ waste = 0;
+ mem = 0;
+
+ p = buf = (char *)malloc(bufsize, M_TEMP, M_WAITOK|M_ZERO);
+ len = snprintf(p, bufsize,
+ "\n Size Requests Real Size\n");
+ bufsize -= len;
+ p += len;
+
+ for (i = 0; i < KMEM_ZSIZE; i++) {
+ size = i << KMEM_ZSHIFT;
+ rsize = kmemzones[kmemsize[i]].kz_size;
+ count = (long long unsigned)krequests[i];
+
+ len = snprintf(p, bufsize, "%6d%28llu%11d\n",
+ size, (unsigned long long)count, rsize);
+ bufsize -= len;
+ p += len;
+
+ if ((rsize * count) > (size * count))
+ waste += (rsize * count) - (size * count);
+ mem += (rsize * count);
+ }
+
+ len = snprintf(p, bufsize,
+ "\nTotal memory used:\t%30llu\nTotal Memory wasted:\t%30llu\n",
+ (unsigned long long)mem, (unsigned long long)waste);
+ p += len;
+
+ error = SYSCTL_OUT(req, buf, p - buf);
+
+ free(buf, M_TEMP);
+ return (error);
+}
+
+SYSCTL_OID(_kern, OID_AUTO, mprof, CTLTYPE_STRING|CTLFLAG_RD,
+ NULL, 0, sysctl_kern_mprof, "A", "Malloc Profiling");
+#endif /* MALLOC_PROFILE */