1
+ diff --git include/jemalloc/internal/arena_externs.h include/jemalloc/internal/arena_externs.h
2
+ index e6fceaaf..0feeb051 100644
3
+ --- include/jemalloc/internal/arena_externs.h
4
+ +++ include/jemalloc/internal/arena_externs.h
5
+ @@ -60,6 +60,7 @@ uint64_t arena_time_until_deferred(tsdn_t *tsdn, arena_t *arena);
6
+ void arena_do_deferred_work(tsdn_t *tsdn, arena_t *arena);
7
+ void arena_reset(tsd_t *tsd, arena_t *arena);
8
+ void arena_destroy(tsd_t *tsd, arena_t *arena);
9
+ + void arena_dontdump(tsdn_t *tsdn, arena_t *arena);
10
+ void arena_cache_bin_fill_small(tsdn_t *tsdn, arena_t *arena,
11
+ cache_bin_t *cache_bin, cache_bin_info_t *cache_bin_info, szind_t binind,
12
+ const unsigned nfill);
13
+ diff --git include/jemalloc/internal/extent.h include/jemalloc/internal/extent.h
14
+ index 1d51d410..1e77caa4 100644
15
+ --- include/jemalloc/internal/extent.h
16
+ +++ include/jemalloc/internal/extent.h
17
+ @@ -29,6 +29,7 @@ void ecache_dalloc(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
18
+ ecache_t *ecache, edata_t *edata);
19
+ edata_t *ecache_evict(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
20
+ ecache_t *ecache, size_t npages_min);
21
+ + void ecache_dontdump(tsdn_t *tsdn, ecache_t *ecache);
22
+
23
+ void extent_gdump_add(tsdn_t *tsdn, const edata_t *edata);
24
+ void extent_record(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks, ecache_t *ecache,
25
+ diff --git include/jemalloc/internal/pa.h include/jemalloc/internal/pa.h
26
+ index 4748a05b..41fefafb 100644
27
+ --- include/jemalloc/internal/pa.h
28
+ +++ include/jemalloc/internal/pa.h
29
+ @@ -164,6 +164,7 @@ void pa_shard_reset(tsdn_t *tsdn, pa_shard_t *shard);
30
+ * last step in destroying the shard.
31
+ */
32
+ void pa_shard_destroy(tsdn_t *tsdn, pa_shard_t *shard);
33
+ + void pa_shard_dontdump_retain(tsdn_t *tsdn, pa_shard_t *shard);
34
+
35
+ /* Gets an edata for the given allocation. */
36
+ edata_t *pa_alloc(tsdn_t *tsdn, pa_shard_t *shard, size_t size,
37
+ diff --git include/jemalloc/internal/pac.h include/jemalloc/internal/pac.h
38
+ index 01c4e6af..c5103fec 100644
39
+ --- include/jemalloc/internal/pac.h
40
+ +++ include/jemalloc/internal/pac.h
41
+ @@ -175,5 +175,6 @@ ssize_t pac_decay_ms_get(pac_t *pac, extent_state_t state);
42
+
43
+ void pac_reset(tsdn_t *tsdn, pac_t *pac);
44
+ void pac_destroy(tsdn_t *tsdn, pac_t *pac);
45
+ + void pac_dontdump_retain(tsdn_t *tsdn, pac_t *pac);
46
+
47
+ #endif /* JEMALLOC_INTERNAL_PAC_H */
48
+ diff --git include/jemalloc/internal/typed_list.h include/jemalloc/internal/typed_list.h
49
+ index 6535055a..77c019ce 100644
50
+ --- include/jemalloc/internal/typed_list.h
51
+ +++ include/jemalloc/internal/typed_list.h
52
+ @@ -50,6 +50,10 @@ list_type##_empty(list_type##_t *list) { \
53
+ static inline void \
54
+ list_type##_concat(list_type##_t *list_a, list_type##_t *list_b) { \
55
+ ql_concat(&list_a->head, &list_b->head, linkage); \
56
+ + } \
57
+ + static inline el_type* \
58
+ + list_type##_next(list_type##_t *list, el_type *item) { \
59
+ + return ql_next(&list->head, item, linkage) ; \
60
+ }
61
+
62
+ #endif /* JEMALLOC_INTERNAL_TYPED_LIST_H */
63
+ diff --git src/arena.c src/arena.c
64
+ index 857b27c5..fba416f6 100644
65
+ --- src/arena.c
66
+ +++ src/arena.c
67
+ @@ -792,6 +792,12 @@ arena_prepare_base_deletion(tsd_t *tsd, base_t *base_to_destroy) {
68
+ }
69
+ #undef ARENA_DESTROY_MAX_DELAYED_MTX
70
+
71
+ + void
72
+ + arena_dontdump(tsdn_t *tsdn, arena_t *arena) {
73
+ + pa_shard_dontdump_retain(tsdn, &arena->pa_shard);
74
+ + // TODO: dontdump dirty or muzzy?
75
+ + }
76
+ +
77
+ void
78
+ arena_destroy(tsd_t *tsd, arena_t *arena) {
79
+ assert(base_ind_get(arena->base) >= narenas_auto);
80
+ diff --git src/ctl.c src/ctl.c
81
+ index 135271ba..cd6f8e9f 100644
82
+ --- src/ctl.c
83
+ +++ src/ctl.c
84
+ @@ -162,6 +162,7 @@ CTL_PROTO(arena_i_decay)
85
+ CTL_PROTO(arena_i_purge)
86
+ CTL_PROTO(arena_i_reset)
87
+ CTL_PROTO(arena_i_destroy)
88
+ + CTL_PROTO(arena_i_dontdump)
89
+ CTL_PROTO(arena_i_dss)
90
+ CTL_PROTO(arena_i_oversize_threshold)
91
+ CTL_PROTO(arena_i_dirty_decay_ms)
92
+ @@ -494,6 +495,7 @@ static const ctl_named_node_t arena_i_node[] = {
93
+ {NAME("purge"), CTL(arena_i_purge)},
94
+ {NAME("reset"), CTL(arena_i_reset)},
95
+ {NAME("destroy"), CTL(arena_i_destroy)},
96
+ + {NAME("dontdump"), CTL(arena_i_dontdump)},
97
+ {NAME("dss"), CTL(arena_i_dss)},
98
+ /*
99
+ * Undocumented for now, since we anticipate an arena API in flux after
100
+ @@ -2678,6 +2680,67 @@ arena_i_reset_ctl(tsd_t *tsd, const size_t *mib, size_t miblen, void *oldp,
101
+ return ret;
102
+ }
103
+
104
+ + static void
105
+ + arena_i_dontdump(tsdn_t *tsdn, unsigned arena_ind) {
106
+ + malloc_mutex_lock(tsdn, &ctl_mtx);
107
+ + {
108
+ + unsigned narenas = ctl_arenas->narenas;
109
+ + /*
110
+ + * Access via index narenas is deprecated, and scheduled for
111
+ + * removal in 6.0.0.
112
+ + */
113
+ + if (arena_ind == MALLCTL_ARENAS_ALL || arena_ind == narenas) {
114
+ + unsigned i;
115
+ + VARIABLE_ARRAY(arena_t *, tarenas, narenas);
116
+ + for (i = 0; i < narenas; i++) {
117
+ + tarenas[i] = arena_get(tsdn, i, false);
118
+ + }
119
+ +
120
+ + /*
121
+ + * No further need to hold ctl_mtx, since narenas and
122
+ + * tarenas contain everything needed below.
123
+ + */
124
+ + malloc_mutex_unlock(tsdn, &ctl_mtx);
125
+ +
126
+ + for (i = 0; i < narenas; i++) {
127
+ + if (tarenas[i] != NULL) {
128
+ + arena_dontdump(tsdn, tarenas[i]);
129
+ + }
130
+ + }
131
+ + } else {
132
+ + arena_t *tarena;
133
+ +
134
+ + assert(arena_ind < narenas);
135
+ +
136
+ + tarena = arena_get(tsdn, arena_ind, false);
137
+ +
138
+ + /* No further need to hold ctl_mtx. */
139
+ + malloc_mutex_unlock(tsdn, &ctl_mtx);
140
+ +
141
+ + if (tarena != NULL) {
142
+ + arena_dontdump(tsdn, tarena);
143
+ + }
144
+ + }
145
+ + }
146
+ +
147
+ + }
148
+ +
149
+ + static int
150
+ + arena_i_dontdump_ctl(tsd_t *tsd, const size_t *mib, size_t miblen, void *oldp,
151
+ + size_t *oldlenp, void *newp, size_t newlen) {
152
+ +
153
+ + int ret = 0;
154
+ + unsigned arena_ind;
155
+ + NEITHER_READ_NOR_WRITE();
156
+ + MIB_UNSIGNED(arena_ind, 1);
157
+ +
158
+ + arena_i_dontdump(tsd_tsdn(tsd), arena_ind);
159
+ +
160
+ + label_return:
161
+ + return ret;
162
+ + }
163
+ +
164
+ +
165
+ static int
166
+ arena_i_destroy_ctl(tsd_t *tsd, const size_t *mib, size_t miblen, void *oldp,
167
+ size_t *oldlenp, void *newp, size_t newlen) {
168
+ diff --git src/extent.c src/extent.c
169
+ index cf3d1f31..adf0d574 100644
170
+ --- src/extent.c
171
+ +++ src/extent.c
172
+ @@ -147,6 +147,21 @@ ecache_dalloc(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks, ecache_t *ecache,
173
+ extent_record(tsdn, pac, ehooks, ecache, edata);
174
+ }
175
+
176
+ + void
177
+ + ecache_dontdump(tsdn_t *tsdn, ecache_t *ecache) {
178
+ + malloc_mutex_lock(tsdn, &ecache->mtx);
179
+ +
180
+ + eset_t *eset = &ecache->eset;
181
+ + edata_t *edata = edata_list_inactive_first(&eset->lru);
182
+ +
183
+ + while (edata != NULL) {
184
+ + pages_dontdump(edata_base_get(edata), edata_size_get(edata));
185
+ + edata = edata_list_inactive_next(&eset->lru, edata);
186
+ + }
187
+ +
188
+ + malloc_mutex_unlock(tsdn, &ecache->mtx);
189
+ + }
190
+ +
191
+ edata_t *
192
+ ecache_evict(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
193
+ ecache_t *ecache, size_t npages_min) {
194
+ diff --git src/pa.c src/pa.c
195
+ index eb7e4620..40555a2f 100644
196
+ --- src/pa.c
197
+ +++ src/pa.c
198
+ @@ -112,6 +112,10 @@ pa_shard_destroy(tsdn_t *tsdn, pa_shard_t *shard) {
199
+ }
200
+ }
201
+
202
+ + void pa_shard_dontdump_retain(tsdn_t *tsdn, pa_shard_t *shard) {
203
+ + pac_dontdump_retain(tsdn, &shard->pac);
204
+ + }
205
+ +
206
+ static pai_t *
207
+ pa_get_pai(pa_shard_t *shard, edata_t *edata) {
208
+ return (edata_pai_get(edata) == EXTENT_PAI_PAC
209
+ diff --git src/pac.c src/pac.c
210
+ index 53e3d823..f843d5a7 100644
211
+ --- src/pac.c
212
+ +++ src/pac.c
213
+ @@ -585,3 +585,8 @@ pac_destroy(tsdn_t *tsdn, pac_t *pac) {
214
+ extent_destroy_wrapper(tsdn, pac, ehooks, edata);
215
+ }
216
+ }
217
+ +
218
+ + void
219
+ + pac_dontdump_retain(tsdn_t *tsdn, pac_t *pac) {
220
+ + ecache_dontdump(tsdn, &pac->ecache_retained);
221
+ + }
222
+ +
0 commit comments