xref: /netbsd-src/external/bsd/jemalloc.old/include/jemalloc/internal/ctl.h (revision 8e33eff89e26cf71871ead62f0d5063e1313c33a)
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