Optimize for prof_active off
Move the handling of `prof_active` off case completely to slow path, so as to reduce register pressure on malloc fast path.
This commit is contained in:
parent
49e6fbce78
commit
adce29c885
@ -2109,6 +2109,20 @@ imalloc_body(static_opts_t *sopts, dynamic_opts_t *dopts, tsd_t *tsd) {
|
|||||||
|
|
||||||
/* If profiling is on, get our profiling context. */
|
/* If profiling is on, get our profiling context. */
|
||||||
if (config_prof && opt_prof) {
|
if (config_prof && opt_prof) {
|
||||||
|
/*
|
||||||
|
* The fast path modifies bytes_until_sample regardless of
|
||||||
|
* prof_active. We reset it to be the sample interval, so that
|
||||||
|
* there won't be excessive routings to the slow path, and that
|
||||||
|
* when prof_active is turned on later, the counting for
|
||||||
|
* sampling can immediately resume as normal (though the very
|
||||||
|
* first sampling interval is not randomized).
|
||||||
|
*/
|
||||||
|
if (unlikely(tsd_bytes_until_sample_get(tsd) < 0) &&
|
||||||
|
!prof_active_get_unlocked()) {
|
||||||
|
tsd_bytes_until_sample_set(tsd,
|
||||||
|
(ssize_t)(1 << lg_prof_sample));
|
||||||
|
}
|
||||||
|
|
||||||
prof_tctx_t *tctx = prof_alloc_prep(
|
prof_tctx_t *tctx = prof_alloc_prep(
|
||||||
tsd, usize, prof_active_get_unlocked(), true);
|
tsd, usize, prof_active_get_unlocked(), true);
|
||||||
|
|
||||||
@ -2131,6 +2145,16 @@ imalloc_body(static_opts_t *sopts, dynamic_opts_t *dopts, tsd_t *tsd) {
|
|||||||
}
|
}
|
||||||
prof_malloc(tsd_tsdn(tsd), allocation, usize, &alloc_ctx, tctx);
|
prof_malloc(tsd_tsdn(tsd), allocation, usize, &alloc_ctx, tctx);
|
||||||
} else {
|
} else {
|
||||||
|
assert(!opt_prof);
|
||||||
|
/*
|
||||||
|
* The fast path modifies bytes_until_sample regardless of
|
||||||
|
* opt_prof. We reset it to a huge value here, so as to
|
||||||
|
* minimize the triggering for slow path.
|
||||||
|
*/
|
||||||
|
if (config_prof &&
|
||||||
|
unlikely(tsd_bytes_until_sample_get(tsd) < 0)) {
|
||||||
|
tsd_bytes_until_sample_set(tsd, SSIZE_MAX);
|
||||||
|
}
|
||||||
allocation = imalloc_no_sample(sopts, dopts, tsd, size, usize,
|
allocation = imalloc_no_sample(sopts, dopts, tsd, size, usize,
|
||||||
ind);
|
ind);
|
||||||
if (unlikely(allocation == NULL)) {
|
if (unlikely(allocation == NULL)) {
|
||||||
@ -2339,16 +2363,10 @@ je_malloc(size_t size) {
|
|||||||
if (unlikely(bytes_until_sample < 0)) {
|
if (unlikely(bytes_until_sample < 0)) {
|
||||||
/*
|
/*
|
||||||
* Avoid a prof_active check on the fastpath.
|
* Avoid a prof_active check on the fastpath.
|
||||||
* If prof_active is false, set bytes_until_sample to
|
* If prof_active is false, bytes_until_sample will be
|
||||||
* sampling interval. If prof_active is set to true,
|
* reset in slow path.
|
||||||
* bytes_until_sample will be reset.
|
|
||||||
*/
|
*/
|
||||||
if (!prof_active_get_unlocked()) {
|
return malloc_default(size);
|
||||||
tsd_bytes_until_sample_set(tsd,
|
|
||||||
((uint64_t)1U << lg_prof_sample));
|
|
||||||
} else {
|
|
||||||
return malloc_default(size);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user