Set is_head in extent_alloc_wrapper w/ retain.
When retain is on, when extent_grow_retained failed (e.g. due to split hook failures), we'll try extent_alloc_wrapper as the last resort. Set the is_head bit in that case to be consistent. The allocated extent in that case will be retained properly, but not merged with other extents.
This commit is contained in:
parent
73ca4b8ef8
commit
22be724af4
@ -28,8 +28,6 @@ void ecache_dalloc(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
|
|||||||
edata_t *ecache_evict(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
|
edata_t *ecache_evict(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
|
||||||
ecache_t *ecache, size_t npages_min);
|
ecache_t *ecache, size_t npages_min);
|
||||||
|
|
||||||
edata_t *extent_alloc_wrapper(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
|
|
||||||
void *new_addr, size_t size, size_t alignment, bool zero, bool *commit);
|
|
||||||
void extent_dalloc_gap(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
|
void extent_dalloc_gap(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
|
||||||
edata_t *edata);
|
edata_t *edata);
|
||||||
void extent_dalloc_wrapper(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
|
void extent_dalloc_wrapper(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
|
||||||
|
@ -45,6 +45,8 @@ static void extent_record(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
|
|||||||
static edata_t *extent_alloc_retained(tsdn_t *tsdn, pac_t *pac,
|
static edata_t *extent_alloc_retained(tsdn_t *tsdn, pac_t *pac,
|
||||||
ehooks_t *ehooks, void *new_addr, size_t size, size_t alignment, bool zero,
|
ehooks_t *ehooks, void *new_addr, size_t size, size_t alignment, bool zero,
|
||||||
bool *commit);
|
bool *commit);
|
||||||
|
static edata_t *extent_alloc_wrapper(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
|
||||||
|
void *new_addr, size_t size, size_t alignment, bool zero, bool *commit);
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
@ -771,7 +773,7 @@ extent_alloc_retained(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
|
|||||||
return edata;
|
return edata;
|
||||||
}
|
}
|
||||||
|
|
||||||
edata_t *
|
static edata_t *
|
||||||
extent_alloc_wrapper(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
|
extent_alloc_wrapper(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
|
||||||
void *new_addr, size_t size, size_t alignment, bool zero, bool *commit) {
|
void *new_addr, size_t size, size_t alignment, bool zero, bool *commit) {
|
||||||
witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn),
|
witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn),
|
||||||
@ -791,7 +793,7 @@ extent_alloc_wrapper(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
|
|||||||
edata_init(edata, ecache_ind_get(&pac->ecache_dirty), addr,
|
edata_init(edata, ecache_ind_get(&pac->ecache_dirty), addr,
|
||||||
size, /* slab */ false, SC_NSIZES, extent_sn_next(pac),
|
size, /* slab */ false, SC_NSIZES, extent_sn_next(pac),
|
||||||
extent_state_active, zero, *commit, EXTENT_PAI_PAC,
|
extent_state_active, zero, *commit, EXTENT_PAI_PAC,
|
||||||
EXTENT_NOT_HEAD);
|
opt_retain ? EXTENT_IS_HEAD : EXTENT_NOT_HEAD);
|
||||||
if (extent_register(tsdn, pac, edata)) {
|
if (extent_register(tsdn, pac, edata)) {
|
||||||
edata_cache_put(tsdn, pac->edata_cache, edata);
|
edata_cache_put(tsdn, pac->edata_cache, edata);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user