Skip to content

Commit 3c07f80

Browse files
committed
Fix stats.arenas.<i>.[...] for --disable-stats case.
Add missing stats.arenas.<i>.{dss,lg_dirty_mult,decay_time} initialization. Fix stats.arenas.<i>.{pactive,pdirty} to read under the protection of the arena mutex.
1 parent fd48582 commit 3c07f80

File tree

6 files changed

+120
-86
lines changed

6 files changed

+120
-86
lines changed

include/jemalloc/internal/arena.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -572,7 +572,10 @@ ssize_t arena_lg_dirty_mult_default_get(void);
572572
bool arena_lg_dirty_mult_default_set(ssize_t lg_dirty_mult);
573573
ssize_t arena_decay_time_default_get(void);
574574
bool arena_decay_time_default_set(ssize_t decay_time);
575-
void arena_stats_merge(arena_t *arena, const char **dss,
575+
void arena_basic_stats_merge(arena_t *arena, unsigned *nthreads,
576+
const char **dss, ssize_t *lg_dirty_mult, ssize_t *decay_time,
577+
size_t *nactive, size_t *ndirty);
578+
void arena_stats_merge(arena_t *arena, unsigned *nthreads, const char **dss,
576579
ssize_t *lg_dirty_mult, ssize_t *decay_time, size_t *nactive,
577580
size_t *ndirty, arena_stats_t *astats, malloc_bin_stats_t *bstats,
578581
malloc_large_stats_t *lstats, malloc_huge_stats_t *hstats);

include/jemalloc/internal/ctl.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ struct ctl_arena_stats_s {
3838
ssize_t decay_time;
3939
size_t pactive;
4040
size_t pdirty;
41+
42+
/* The remainder are only populated if config_stats is true. */
43+
4144
arena_stats_t astats;
4245

4346
/* Aggregate stats for small size classes, based on bin stats. */

include/jemalloc/internal/private_symbols.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ a0dalloc
22
a0malloc
33
arena_aalloc
44
arena_alloc_junk_small
5+
arena_basic_stats_merge
56
arena_bin_index
67
arena_bin_info
78
arena_bitselm_get

src/arena.c

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3202,20 +3202,45 @@ arena_decay_time_default_set(ssize_t decay_time)
32023202
return (false);
32033203
}
32043204

3205-
void
3206-
arena_stats_merge(arena_t *arena, const char **dss, ssize_t *lg_dirty_mult,
3207-
ssize_t *decay_time, size_t *nactive, size_t *ndirty, arena_stats_t *astats,
3208-
malloc_bin_stats_t *bstats, malloc_large_stats_t *lstats,
3209-
malloc_huge_stats_t *hstats)
3205+
static void
3206+
arena_basic_stats_merge_locked(arena_t *arena, unsigned *nthreads,
3207+
const char **dss, ssize_t *lg_dirty_mult, ssize_t *decay_time,
3208+
size_t *nactive, size_t *ndirty)
32103209
{
3211-
unsigned i;
32123210

3213-
malloc_mutex_lock(&arena->lock);
3211+
*nthreads += arena_nthreads_get(arena);
32143212
*dss = dss_prec_names[arena->dss_prec];
32153213
*lg_dirty_mult = arena->lg_dirty_mult;
32163214
*decay_time = arena->decay_time;
32173215
*nactive += arena->nactive;
32183216
*ndirty += arena->ndirty;
3217+
}
3218+
3219+
void
3220+
arena_basic_stats_merge(arena_t *arena, unsigned *nthreads, const char **dss,
3221+
ssize_t *lg_dirty_mult, ssize_t *decay_time, size_t *nactive,
3222+
size_t *ndirty)
3223+
{
3224+
3225+
malloc_mutex_lock(&arena->lock);
3226+
arena_basic_stats_merge_locked(arena, nthreads, dss, lg_dirty_mult,
3227+
decay_time, nactive, ndirty);
3228+
malloc_mutex_unlock(&arena->lock);
3229+
}
3230+
3231+
void
3232+
arena_stats_merge(arena_t *arena, unsigned *nthreads, const char **dss,
3233+
ssize_t *lg_dirty_mult, ssize_t *decay_time, size_t *nactive,
3234+
size_t *ndirty, arena_stats_t *astats, malloc_bin_stats_t *bstats,
3235+
malloc_large_stats_t *lstats, malloc_huge_stats_t *hstats)
3236+
{
3237+
unsigned i;
3238+
3239+
cassert(config_stats);
3240+
3241+
malloc_mutex_lock(&arena->lock);
3242+
arena_basic_stats_merge_locked(arena, nthreads, dss, lg_dirty_mult,
3243+
decay_time, nactive, ndirty);
32193244

32203245
astats->mapped += arena->stats.mapped;
32213246
astats->npurge += arena->stats.npurge;

src/ctl.c

Lines changed: 77 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,7 @@ static void
533533
ctl_arena_clear(ctl_arena_stats_t *astats)
534534
{
535535

536+
astats->nthreads = 0;
536537
astats->dss = dss_prec_names[dss_prec_limit];
537538
astats->lg_dirty_mult = -1;
538539
astats->decay_time = -1;
@@ -557,16 +558,23 @@ ctl_arena_stats_amerge(ctl_arena_stats_t *cstats, arena_t *arena)
557558
{
558559
unsigned i;
559560

560-
arena_stats_merge(arena, &cstats->dss, &cstats->lg_dirty_mult,
561-
&cstats->decay_time, &cstats->pactive, &cstats->pdirty,
562-
&cstats->astats, cstats->bstats, cstats->lstats, cstats->hstats);
563-
564-
for (i = 0; i < NBINS; i++) {
565-
cstats->allocated_small += cstats->bstats[i].curregs *
566-
index2size(i);
567-
cstats->nmalloc_small += cstats->bstats[i].nmalloc;
568-
cstats->ndalloc_small += cstats->bstats[i].ndalloc;
569-
cstats->nrequests_small += cstats->bstats[i].nrequests;
561+
if (config_stats) {
562+
arena_stats_merge(arena, &cstats->nthreads, &cstats->dss,
563+
&cstats->lg_dirty_mult, &cstats->decay_time,
564+
&cstats->pactive, &cstats->pdirty, &cstats->astats,
565+
cstats->bstats, cstats->lstats, cstats->hstats);
566+
567+
for (i = 0; i < NBINS; i++) {
568+
cstats->allocated_small += cstats->bstats[i].curregs *
569+
index2size(i);
570+
cstats->nmalloc_small += cstats->bstats[i].nmalloc;
571+
cstats->ndalloc_small += cstats->bstats[i].ndalloc;
572+
cstats->nrequests_small += cstats->bstats[i].nrequests;
573+
}
574+
} else {
575+
arena_basic_stats_merge(arena, &cstats->nthreads, &cstats->dss,
576+
&cstats->lg_dirty_mult, &cstats->decay_time,
577+
&cstats->pactive, &cstats->pdirty);
570578
}
571579
}
572580

@@ -575,57 +583,68 @@ ctl_arena_stats_smerge(ctl_arena_stats_t *sstats, ctl_arena_stats_t *astats)
575583
{
576584
unsigned i;
577585

586+
sstats->nthreads += astats->nthreads;
578587
sstats->pactive += astats->pactive;
579588
sstats->pdirty += astats->pdirty;
580589

581-
sstats->astats.mapped += astats->astats.mapped;
582-
sstats->astats.npurge += astats->astats.npurge;
583-
sstats->astats.nmadvise += astats->astats.nmadvise;
584-
sstats->astats.purged += astats->astats.purged;
585-
586-
sstats->astats.metadata_mapped += astats->astats.metadata_mapped;
587-
sstats->astats.metadata_allocated += astats->astats.metadata_allocated;
588-
589-
sstats->allocated_small += astats->allocated_small;
590-
sstats->nmalloc_small += astats->nmalloc_small;
591-
sstats->ndalloc_small += astats->ndalloc_small;
592-
sstats->nrequests_small += astats->nrequests_small;
593-
594-
sstats->astats.allocated_large += astats->astats.allocated_large;
595-
sstats->astats.nmalloc_large += astats->astats.nmalloc_large;
596-
sstats->astats.ndalloc_large += astats->astats.ndalloc_large;
597-
sstats->astats.nrequests_large += astats->astats.nrequests_large;
598-
599-
sstats->astats.allocated_huge += astats->astats.allocated_huge;
600-
sstats->astats.nmalloc_huge += astats->astats.nmalloc_huge;
601-
sstats->astats.ndalloc_huge += astats->astats.ndalloc_huge;
602-
603-
for (i = 0; i < NBINS; i++) {
604-
sstats->bstats[i].nmalloc += astats->bstats[i].nmalloc;
605-
sstats->bstats[i].ndalloc += astats->bstats[i].ndalloc;
606-
sstats->bstats[i].nrequests += astats->bstats[i].nrequests;
607-
sstats->bstats[i].curregs += astats->bstats[i].curregs;
608-
if (config_tcache) {
609-
sstats->bstats[i].nfills += astats->bstats[i].nfills;
610-
sstats->bstats[i].nflushes +=
611-
astats->bstats[i].nflushes;
590+
if (config_stats) {
591+
sstats->astats.mapped += astats->astats.mapped;
592+
sstats->astats.npurge += astats->astats.npurge;
593+
sstats->astats.nmadvise += astats->astats.nmadvise;
594+
sstats->astats.purged += astats->astats.purged;
595+
596+
sstats->astats.metadata_mapped +=
597+
astats->astats.metadata_mapped;
598+
sstats->astats.metadata_allocated +=
599+
astats->astats.metadata_allocated;
600+
601+
sstats->allocated_small += astats->allocated_small;
602+
sstats->nmalloc_small += astats->nmalloc_small;
603+
sstats->ndalloc_small += astats->ndalloc_small;
604+
sstats->nrequests_small += astats->nrequests_small;
605+
606+
sstats->astats.allocated_large +=
607+
astats->astats.allocated_large;
608+
sstats->astats.nmalloc_large += astats->astats.nmalloc_large;
609+
sstats->astats.ndalloc_large += astats->astats.ndalloc_large;
610+
sstats->astats.nrequests_large +=
611+
astats->astats.nrequests_large;
612+
613+
sstats->astats.allocated_huge += astats->astats.allocated_huge;
614+
sstats->astats.nmalloc_huge += astats->astats.nmalloc_huge;
615+
sstats->astats.ndalloc_huge += astats->astats.ndalloc_huge;
616+
617+
for (i = 0; i < NBINS; i++) {
618+
sstats->bstats[i].nmalloc += astats->bstats[i].nmalloc;
619+
sstats->bstats[i].ndalloc += astats->bstats[i].ndalloc;
620+
sstats->bstats[i].nrequests +=
621+
astats->bstats[i].nrequests;
622+
sstats->bstats[i].curregs += astats->bstats[i].curregs;
623+
if (config_tcache) {
624+
sstats->bstats[i].nfills +=
625+
astats->bstats[i].nfills;
626+
sstats->bstats[i].nflushes +=
627+
astats->bstats[i].nflushes;
628+
}
629+
sstats->bstats[i].nruns += astats->bstats[i].nruns;
630+
sstats->bstats[i].reruns += astats->bstats[i].reruns;
631+
sstats->bstats[i].curruns += astats->bstats[i].curruns;
612632
}
613-
sstats->bstats[i].nruns += astats->bstats[i].nruns;
614-
sstats->bstats[i].reruns += astats->bstats[i].reruns;
615-
sstats->bstats[i].curruns += astats->bstats[i].curruns;
616-
}
617633

618-
for (i = 0; i < nlclasses; i++) {
619-
sstats->lstats[i].nmalloc += astats->lstats[i].nmalloc;
620-
sstats->lstats[i].ndalloc += astats->lstats[i].ndalloc;
621-
sstats->lstats[i].nrequests += astats->lstats[i].nrequests;
622-
sstats->lstats[i].curruns += astats->lstats[i].curruns;
623-
}
634+
for (i = 0; i < nlclasses; i++) {
635+
sstats->lstats[i].nmalloc += astats->lstats[i].nmalloc;
636+
sstats->lstats[i].ndalloc += astats->lstats[i].ndalloc;
637+
sstats->lstats[i].nrequests +=
638+
astats->lstats[i].nrequests;
639+
sstats->lstats[i].curruns += astats->lstats[i].curruns;
640+
}
624641

625-
for (i = 0; i < nhclasses; i++) {
626-
sstats->hstats[i].nmalloc += astats->hstats[i].nmalloc;
627-
sstats->hstats[i].ndalloc += astats->hstats[i].ndalloc;
628-
sstats->hstats[i].curhchunks += astats->hstats[i].curhchunks;
642+
for (i = 0; i < nhclasses; i++) {
643+
sstats->hstats[i].nmalloc += astats->hstats[i].nmalloc;
644+
sstats->hstats[i].ndalloc += astats->hstats[i].ndalloc;
645+
sstats->hstats[i].curhchunks +=
646+
astats->hstats[i].curhchunks;
647+
}
629648
}
630649
}
631650

@@ -636,19 +655,9 @@ ctl_arena_refresh(arena_t *arena, unsigned i)
636655
ctl_arena_stats_t *sstats = &ctl_stats.arenas[ctl_stats.narenas];
637656

638657
ctl_arena_clear(astats);
639-
640-
sstats->nthreads += astats->nthreads;
641-
if (config_stats) {
642-
ctl_arena_stats_amerge(astats, arena);
643-
/* Merge into sum stats as well. */
644-
ctl_arena_stats_smerge(sstats, astats);
645-
} else {
646-
astats->pactive += arena->nactive;
647-
astats->pdirty += arena->ndirty;
648-
/* Merge into sum stats as well. */
649-
sstats->pactive += arena->nactive;
650-
sstats->pdirty += arena->ndirty;
651-
}
658+
ctl_arena_stats_amerge(astats, arena);
659+
/* Merge into sum stats as well. */
660+
ctl_arena_stats_smerge(sstats, astats);
652661
}
653662

654663
static bool
@@ -701,20 +710,11 @@ ctl_refresh(void)
701710
* Clear sum stats, since they will be merged into by
702711
* ctl_arena_refresh().
703712
*/
704-
ctl_stats.arenas[ctl_stats.narenas].nthreads = 0;
705713
ctl_arena_clear(&ctl_stats.arenas[ctl_stats.narenas]);
706714

707715
for (i = 0; i < ctl_stats.narenas; i++)
708716
tarenas[i] = arena_get(i, false);
709717

710-
for (i = 0; i < ctl_stats.narenas; i++) {
711-
if (tarenas[i] != NULL) {
712-
ctl_stats.arenas[i].nthreads =
713-
arena_nthreads_get(arena_get(i, false));
714-
} else
715-
ctl_stats.arenas[i].nthreads = 0;
716-
}
717-
718718
for (i = 0; i < ctl_stats.narenas; i++) {
719719
bool initialized = (tarenas[i] != NULL);
720720

test/unit/mallctl.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -687,8 +687,10 @@ TEST_BEGIN(test_stats_arenas)
687687
0), 0, "Unexpected mallctl() failure"); \
688688
} while (0)
689689

690-
TEST_STATS_ARENAS(const char *, dss);
691690
TEST_STATS_ARENAS(unsigned, nthreads);
691+
TEST_STATS_ARENAS(const char *, dss);
692+
TEST_STATS_ARENAS(ssize_t, lg_dirty_mult);
693+
TEST_STATS_ARENAS(ssize_t, decay_time);
692694
TEST_STATS_ARENAS(size_t, pactive);
693695
TEST_STATS_ARENAS(size_t, pdirty);
694696

0 commit comments

Comments
 (0)