1*8e33eff8Schristos #ifndef JEMALLOC_INTERNAL_CTL_H 2*8e33eff8Schristos #define JEMALLOC_INTERNAL_CTL_H 3*8e33eff8Schristos 4*8e33eff8Schristos #include "jemalloc/internal/jemalloc_internal_types.h" 5*8e33eff8Schristos #include "jemalloc/internal/malloc_io.h" 6*8e33eff8Schristos #include "jemalloc/internal/mutex_prof.h" 7*8e33eff8Schristos #include "jemalloc/internal/ql.h" 8*8e33eff8Schristos #include "jemalloc/internal/size_classes.h" 9*8e33eff8Schristos #include "jemalloc/internal/stats.h" 10*8e33eff8Schristos 11*8e33eff8Schristos /* Maximum ctl tree depth. */ 12*8e33eff8Schristos #define CTL_MAX_DEPTH 7 13*8e33eff8Schristos 14*8e33eff8Schristos typedef struct ctl_node_s { 15*8e33eff8Schristos bool named; 16*8e33eff8Schristos } ctl_node_t; 17*8e33eff8Schristos 18*8e33eff8Schristos typedef struct ctl_named_node_s { 19*8e33eff8Schristos ctl_node_t node; 20*8e33eff8Schristos const char *name; 21*8e33eff8Schristos /* If (nchildren == 0), this is a terminal node. */ 22*8e33eff8Schristos size_t nchildren; 23*8e33eff8Schristos const ctl_node_t *children; 24*8e33eff8Schristos int (*ctl)(tsd_t *, const size_t *, size_t, void *, size_t *, void *, 25*8e33eff8Schristos size_t); 26*8e33eff8Schristos } ctl_named_node_t; 27*8e33eff8Schristos 28*8e33eff8Schristos typedef struct ctl_indexed_node_s { 29*8e33eff8Schristos struct ctl_node_s node; 30*8e33eff8Schristos const ctl_named_node_t *(*index)(tsdn_t *, const size_t *, size_t, 31*8e33eff8Schristos size_t); 32*8e33eff8Schristos } ctl_indexed_node_t; 33*8e33eff8Schristos 34*8e33eff8Schristos typedef struct ctl_arena_stats_s { 35*8e33eff8Schristos arena_stats_t astats; 36*8e33eff8Schristos 37*8e33eff8Schristos /* Aggregate stats for small size classes, based on bin stats. */ 38*8e33eff8Schristos size_t allocated_small; 39*8e33eff8Schristos uint64_t nmalloc_small; 40*8e33eff8Schristos uint64_t ndalloc_small; 41*8e33eff8Schristos uint64_t nrequests_small; 42*8e33eff8Schristos 43*8e33eff8Schristos bin_stats_t bstats[NBINS]; 44*8e33eff8Schristos arena_stats_large_t lstats[NSIZES - NBINS]; 45*8e33eff8Schristos } ctl_arena_stats_t; 46*8e33eff8Schristos 47*8e33eff8Schristos typedef struct ctl_stats_s { 48*8e33eff8Schristos size_t allocated; 49*8e33eff8Schristos size_t active; 50*8e33eff8Schristos size_t metadata; 51*8e33eff8Schristos size_t metadata_thp; 52*8e33eff8Schristos size_t resident; 53*8e33eff8Schristos size_t mapped; 54*8e33eff8Schristos size_t retained; 55*8e33eff8Schristos 56*8e33eff8Schristos background_thread_stats_t background_thread; 57*8e33eff8Schristos mutex_prof_data_t mutex_prof_data[mutex_prof_num_global_mutexes]; 58*8e33eff8Schristos } ctl_stats_t; 59*8e33eff8Schristos 60*8e33eff8Schristos typedef struct ctl_arena_s ctl_arena_t; 61*8e33eff8Schristos struct ctl_arena_s { 62*8e33eff8Schristos unsigned arena_ind; 63*8e33eff8Schristos bool initialized; 64*8e33eff8Schristos ql_elm(ctl_arena_t) destroyed_link; 65*8e33eff8Schristos 66*8e33eff8Schristos /* Basic stats, supported even if !config_stats. */ 67*8e33eff8Schristos unsigned nthreads; 68*8e33eff8Schristos const char *dss; 69*8e33eff8Schristos ssize_t dirty_decay_ms; 70*8e33eff8Schristos ssize_t muzzy_decay_ms; 71*8e33eff8Schristos size_t pactive; 72*8e33eff8Schristos size_t pdirty; 73*8e33eff8Schristos size_t pmuzzy; 74*8e33eff8Schristos 75*8e33eff8Schristos /* NULL if !config_stats. */ 76*8e33eff8Schristos ctl_arena_stats_t *astats; 77*8e33eff8Schristos }; 78*8e33eff8Schristos 79*8e33eff8Schristos typedef struct ctl_arenas_s { 80*8e33eff8Schristos uint64_t epoch; 81*8e33eff8Schristos unsigned narenas; 82*8e33eff8Schristos ql_head(ctl_arena_t) destroyed; 83*8e33eff8Schristos 84*8e33eff8Schristos /* 85*8e33eff8Schristos * Element 0 corresponds to merged stats for extant arenas (accessed via 86*8e33eff8Schristos * MALLCTL_ARENAS_ALL), element 1 corresponds to merged stats for 87*8e33eff8Schristos * destroyed arenas (accessed via MALLCTL_ARENAS_DESTROYED), and the 88*8e33eff8Schristos * remaining MALLOCX_ARENA_LIMIT elements correspond to arenas. 89*8e33eff8Schristos */ 90*8e33eff8Schristos ctl_arena_t *arenas[2 + MALLOCX_ARENA_LIMIT]; 91*8e33eff8Schristos } ctl_arenas_t; 92*8e33eff8Schristos 93*8e33eff8Schristos int ctl_byname(tsd_t *tsd, const char *name, void *oldp, size_t *oldlenp, 94*8e33eff8Schristos void *newp, size_t newlen); 95*8e33eff8Schristos int ctl_nametomib(tsd_t *tsd, const char *name, size_t *mibp, size_t *miblenp); 96*8e33eff8Schristos 97*8e33eff8Schristos int ctl_bymib(tsd_t *tsd, const size_t *mib, size_t miblen, void *oldp, 98*8e33eff8Schristos size_t *oldlenp, void *newp, size_t newlen); 99*8e33eff8Schristos bool ctl_boot(void); 100*8e33eff8Schristos void ctl_prefork(tsdn_t *tsdn); 101*8e33eff8Schristos void ctl_postfork_parent(tsdn_t *tsdn); 102*8e33eff8Schristos void ctl_postfork_child(tsdn_t *tsdn); 103*8e33eff8Schristos 104*8e33eff8Schristos #define xmallctl(name, oldp, oldlenp, newp, newlen) do { \ 105*8e33eff8Schristos if (je_mallctl(name, oldp, oldlenp, newp, newlen) \ 106*8e33eff8Schristos != 0) { \ 107*8e33eff8Schristos malloc_printf( \ 108*8e33eff8Schristos "<jemalloc>: Failure in xmallctl(\"%s\", ...)\n", \ 109*8e33eff8Schristos name); \ 110*8e33eff8Schristos abort(); \ 111*8e33eff8Schristos } \ 112*8e33eff8Schristos } while (0) 113*8e33eff8Schristos 114*8e33eff8Schristos #define xmallctlnametomib(name, mibp, miblenp) do { \ 115*8e33eff8Schristos if (je_mallctlnametomib(name, mibp, miblenp) != 0) { \ 116*8e33eff8Schristos malloc_printf("<jemalloc>: Failure in " \ 117*8e33eff8Schristos "xmallctlnametomib(\"%s\", ...)\n", name); \ 118*8e33eff8Schristos abort(); \ 119*8e33eff8Schristos } \ 120*8e33eff8Schristos } while (0) 121*8e33eff8Schristos 122*8e33eff8Schristos #define xmallctlbymib(mib, miblen, oldp, oldlenp, newp, newlen) do { \ 123*8e33eff8Schristos if (je_mallctlbymib(mib, miblen, oldp, oldlenp, newp, \ 124*8e33eff8Schristos newlen) != 0) { \ 125*8e33eff8Schristos malloc_write( \ 126*8e33eff8Schristos "<jemalloc>: Failure in xmallctlbymib()\n"); \ 127*8e33eff8Schristos abort(); \ 128*8e33eff8Schristos } \ 129*8e33eff8Schristos } while (0) 130*8e33eff8Schristos 131*8e33eff8Schristos #endif /* JEMALLOC_INTERNAL_CTL_H */ 132