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