malloc: Make # of calls statistic per-cpu. master
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Tue, 27 Jun 2017 23:13:22 +0000 (07:13 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Tue, 27 Jun 2017 23:14:34 +0000 (07:14 +0800)
While I'm here, remove unused fields from malloc_type.

Bump __DragonFly_version.

sys/kern/kern_slaballoc.c
sys/sys/malloc.h
sys/sys/param.h
usr.bin/vmstat/vmstat.c

index 32eb386..c99fd31 100644 (file)
@@ -666,7 +666,7 @@ kmalloc(unsigned long size, struct malloc_type *type, int flags)
        malloc_init(type);
        crit_exit();
     }
-    ++type->ks_calls;
+    ++type->ks_use[gd->gd_cpuid].calls;
 
     if (flags & M_POWEROF2)
        size = powerof2_size(size);
index 0c40961..0b961ac 100644 (file)
 struct malloc_use {
        size_t  memuse;
        size_t  inuse;
+       __int64_t calls;        /* total packets of this type ever allocated */
+       size_t  reserved;
 } __cachealign;
 
 struct malloc_type {
        struct malloc_type *ks_next;    /* next in list */
        size_t  ks_loosememuse;         /* (inaccurate) aggregate memuse */
        size_t  ks_limit;       /* most that are allowed to exist */
-       long    ks_size;        /* sizes of this thing that are allocated */
        struct malloc_use  ks_use[SMP_MAXCPU];
-       __int64_t ks_calls;     /* total packets of this type ever allocated */
-       long    ks_maxused;     /* maximum number ever used */
        __uint32_t ks_magic;    /* if it's not magic, don't touch it */
        const char *ks_shortdesc;       /* short description */
-       __uint16_t ks_limblocks; /* number of times blocked for hitting limit */
-       __uint16_t ks_mapblocks; /* number of times blocked for kernel map */
        long    ks_reserved[4]; /* future use (module compatibility) */
 };
 
@@ -126,17 +123,18 @@ typedef struct malloc_type        *malloc_type_t;
 #if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
 #define        MALLOC_DEFINE(type, shortdesc, longdesc)                        \
        struct malloc_type type[1] = {                                  \
-           { NULL, 0, 0, 0, { { 0, 0 } }, 0, 0, M_MAGIC, shortdesc,    \
-               0, 0, { 0 } }                                           \
+           { NULL, 0, 0, { { 0, 0, 0, 0 } }, M_MAGIC, shortdesc,       \
+               { 0 } }                                                 \
        };                                                              \
        SYSINIT(type##_init, SI_BOOT1_KMALLOC, SI_ORDER_ANY,            \
            malloc_init, type);                                         \
        SYSUNINIT(type##_uninit, SI_BOOT1_KMALLOC, SI_ORDER_ANY,        \
            malloc_uninit, type)
 #else
-#define        MALLOC_DEFINE(type, shortdesc, longdesc)        \
-       struct malloc_type type[1] = {                  \
-           { NULL, 0, 0, 0, { { 0, 0 } }, 0, 0, M_MAGIC, shortdesc, 0, 0 } \
+#define        MALLOC_DEFINE(type, shortdesc, longdesc)                        \
+       struct malloc_type type[1] = {                                  \
+           { NULL, 0, 0, { { 0, 0, 0, 0 } }, M_MAGIC, shortdesc,       \
+               { 0 } }                                                 \
        }
 #endif
 
index 60a2c37..6ce0753 100644 (file)
  * 400900 - 4.9 development
  * 400901 - moved sigtramp, NX protection + associated sysctls
  * 400902 - change CPU_SETSIZE to signed; allow proc to change self affinity
+ * 400903 - malloc_type cleanup
  */
 #undef __DragonFly_version
-#define __DragonFly_version 400902     /* propagated to newvers */
+#define __DragonFly_version 400903     /* propagated to newvers */
 
 #include <sys/_null.h>
 
index 8c36f4a..9a6ce84 100644 (file)
@@ -880,7 +880,7 @@ dointr(void)
 
 #define        MAX_KMSTATS     1024
 
-enum ksuse { KSINUSE, KSMEMUSE };
+enum ksuse { KSINUSE, KSMEMUSE, KSCALLS };
 
 static long
 cpuagg(struct malloc_type *ks, enum ksuse use)
@@ -899,6 +899,10 @@ cpuagg(struct malloc_type *ks, enum ksuse use)
        for (i = 0; i < SMP_MAXCPU; ++i)
            ttl += ks->ks_use[i].memuse;
        break;
+    case KSCALLS:
+       for (i = 0; i < SMP_MAXCPU; ++i)
+           ttl += ks->ks_use[i].calls;
+       break;
     }
     return(ttl);
 }
@@ -935,8 +939,10 @@ domem(void)
        for (i = 0, ks = &kmemstats[0]; i < nkms; i++, ks++) {
                long ks_inuse;
                long ks_memuse;
+               long ks_calls;
 
-               if (ks->ks_calls == 0)
+               ks_calls = cpuagg(ks, KSCALLS);
+               if (ks_calls == 0)
                        continue;
 
                ks_inuse = cpuagg(ks, KSINUSE);
@@ -947,10 +953,10 @@ domem(void)
                        formatnum(ks_inuse, 5),
                        formatnum(ks_memuse, 5),
                        formatnum(ks->ks_limit, 5),
-                       formatnum(ks->ks_calls, 5));
+                       formatnum(ks_calls, 5));
 
-               totuse += cpuagg(ks, KSMEMUSE);
-               totreq += ks->ks_calls;
+               totuse += ks_memuse;
+               totreq += ks_calls;
        }
        printf("\nMemory Totals:  In Use  Requests\n");
        printf("                 %s  %s\n",