Bypass extent_dalloc when retain is enabled.
When retain is enabled, the default dalloc hook does nothing (since we avoid munmap). But the overhead preparing the call is high, specifically the extent de-register and re-register involve locking and extent / rtree modifications. Bypass the call with retain in this diff.
This commit is contained in:
parent
50b473c883
commit
8dabf81df1
18
src/extent.c
18
src/extent.c
@ -1695,6 +1695,12 @@ extent_dalloc_gap(tsdn_t *tsdn, arena_t *arena, extent_t *extent) {
|
|||||||
extent_dalloc_wrapper(tsdn, arena, &extent_hooks, extent);
|
extent_dalloc_wrapper(tsdn, arena, &extent_hooks, extent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
extent_may_dalloc(void) {
|
||||||
|
/* With retain enabled, the default dalloc always fails. */
|
||||||
|
return !opt_retain;
|
||||||
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
extent_dalloc_default_impl(void *addr, size_t size) {
|
extent_dalloc_default_impl(void *addr, size_t size) {
|
||||||
if (!have_dss || !extent_in_dss(addr)) {
|
if (!have_dss || !extent_in_dss(addr)) {
|
||||||
@ -1750,16 +1756,20 @@ extent_dalloc_wrapper(tsdn_t *tsdn, arena_t *arena,
|
|||||||
witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn),
|
witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn),
|
||||||
WITNESS_RANK_CORE, 0);
|
WITNESS_RANK_CORE, 0);
|
||||||
|
|
||||||
|
/* Avoid calling the default extent_dalloc unless have to. */
|
||||||
|
if (*r_extent_hooks != &extent_hooks_default || extent_may_dalloc()) {
|
||||||
/*
|
/*
|
||||||
* Deregister first to avoid a race with other allocating threads, and
|
* Deregister first to avoid a race with other allocating
|
||||||
* reregister if deallocation fails.
|
* threads, and reregister if deallocation fails.
|
||||||
*/
|
*/
|
||||||
extent_deregister(tsdn, extent);
|
extent_deregister(tsdn, extent);
|
||||||
if (!extent_dalloc_wrapper_try(tsdn, arena, r_extent_hooks, extent)) {
|
if (!extent_dalloc_wrapper_try(tsdn, arena, r_extent_hooks,
|
||||||
|
extent)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
extent_reregister(tsdn, extent);
|
extent_reregister(tsdn, extent);
|
||||||
|
}
|
||||||
|
|
||||||
if (*r_extent_hooks != &extent_hooks_default) {
|
if (*r_extent_hooks != &extent_hooks_default) {
|
||||||
extent_hook_pre_reentrancy(tsdn, arena);
|
extent_hook_pre_reentrancy(tsdn, arena);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user