San: Create a function for committing and zeroing

Committing and zeroing an extent is usually done together, hence a new
function.
This commit is contained in:
Alex Lapenkou 2021-11-22 16:57:56 -08:00 committed by Alexander Lapenkov
parent 800ce49c19
commit d90655390f
3 changed files with 43 additions and 36 deletions

View File

@ -43,7 +43,7 @@ void extent_dalloc_wrapper(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
void extent_destroy_wrapper(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks, void extent_destroy_wrapper(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
edata_t *edata); edata_t *edata);
bool extent_commit_wrapper(tsdn_t *tsdn, ehooks_t *ehooks, edata_t *edata, bool extent_commit_wrapper(tsdn_t *tsdn, ehooks_t *ehooks, edata_t *edata,
size_t offset, size_t length, bool growing_retained); size_t offset, size_t length);
bool extent_decommit_wrapper(tsdn_t *tsdn, ehooks_t *ehooks, edata_t *edata, bool extent_decommit_wrapper(tsdn_t *tsdn, ehooks_t *ehooks, edata_t *edata,
size_t offset, size_t length); size_t offset, size_t length);
bool extent_purge_lazy_wrapper(tsdn_t *tsdn, ehooks_t *ehooks, edata_t *edata, bool extent_purge_lazy_wrapper(tsdn_t *tsdn, ehooks_t *ehooks, edata_t *edata,
@ -55,6 +55,8 @@ edata_t *extent_split_wrapper(tsdn_t *tsdn, pac_t *pac,
bool holding_core_locks); bool holding_core_locks);
bool extent_merge_wrapper(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks, bool extent_merge_wrapper(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
edata_t *a, edata_t *b); edata_t *a, edata_t *b);
bool extent_commit_zero(tsdn_t *tsdn, ehooks_t *ehooks, edata_t *edata,
bool commit, bool zero, bool growing_retained);
size_t extent_sn_next(pac_t *pac); size_t extent_sn_next(pac_t *pac);
bool extent_boot(void); bool extent_boot(void);

View File

@ -604,26 +604,20 @@ extent_recycle(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks, ecache_t *ecache,
return NULL; return NULL;
} }
if (*commit && !edata_committed_get(edata)) {
if (extent_commit_impl(tsdn, ehooks, edata, 0,
edata_size_get(edata), growing_retained)) {
extent_record(tsdn, pac, ehooks, ecache, edata);
return NULL;
}
}
if (edata_committed_get(edata)) {
*commit = true;
}
assert(edata_state_get(edata) == extent_state_active); assert(edata_state_get(edata) == extent_state_active);
if (extent_commit_zero(tsdn, ehooks, edata, *commit, zero,
if (zero) { growing_retained)) {
void *addr = edata_base_get(edata); extent_record(tsdn, pac, ehooks, ecache, edata);
if (!edata_zeroed_get(edata)) { return NULL;
size_t size = edata_size_get(edata); }
ehooks_zero(tsdn, ehooks, addr, size); if (edata_committed_get(edata)) {
} /*
* This reverses the purpose of this variable - previously it
* was treated as an input parameter, now it turns into an
* output parameter, reporting if the edata has actually been
* committed.
*/
*commit = true;
} }
return edata; return edata;
} }
@ -1106,9 +1100,9 @@ extent_commit_impl(tsdn_t *tsdn, ehooks_t *ehooks, edata_t *edata,
bool bool
extent_commit_wrapper(tsdn_t *tsdn, ehooks_t *ehooks, edata_t *edata, extent_commit_wrapper(tsdn_t *tsdn, ehooks_t *ehooks, edata_t *edata,
size_t offset, size_t length, bool growing_retained) { size_t offset, size_t length) {
return extent_commit_impl(tsdn, ehooks, edata, offset, length, return extent_commit_impl(tsdn, ehooks, edata, offset, length,
growing_retained); /* growing_retained */ false);
} }
bool bool
@ -1287,6 +1281,26 @@ extent_merge_wrapper(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
/* holding_core_locks */ false); /* holding_core_locks */ false);
} }
bool
extent_commit_zero(tsdn_t *tsdn, ehooks_t *ehooks, edata_t *edata,
bool commit, bool zero, bool growing_retained) {
witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn),
WITNESS_RANK_CORE, growing_retained ? 1 : 0);
if (commit && !edata_committed_get(edata)) {
if (extent_commit_impl(tsdn, ehooks, edata, 0,
edata_size_get(edata), growing_retained)) {
return true;
}
}
if (zero && !edata_zeroed_get(edata)) {
void *addr = edata_base_get(edata);
size_t size = edata_size_get(edata);
ehooks_zero(tsdn, ehooks, addr, size);
}
return false;
}
bool bool
extent_boot(void) { extent_boot(void) {
assert(sizeof(slab_data_t) >= sizeof(e_prof_info_t)); assert(sizeof(slab_data_t) >= sizeof(e_prof_info_t));

View File

@ -68,20 +68,11 @@ san_bump_alloc(tsdn_t *tsdn, san_bump_alloc_t* sba, pac_t *pac,
san_guard_pages(tsdn, ehooks, edata, pac->emap, /* left */ false, san_guard_pages(tsdn, ehooks, edata, pac->emap, /* left */ false,
/* right */ true, /* remap */ true); /* right */ true, /* remap */ true);
if (!edata_committed_get(edata)) { if (extent_commit_zero(tsdn, ehooks, edata, /* commit */ true, zero,
if (extent_commit_wrapper(tsdn, ehooks, edata, 0, /* growing_retained */ false)) {
edata_size_get(edata), true)) { extent_record(tsdn, pac, ehooks, &pac->ecache_retained,
extent_record(tsdn, pac, ehooks, &pac->ecache_retained, edata);
edata); return NULL;
return NULL;
}
edata_committed_set(edata, true);
}
if (zero && !edata_zeroed_get(edata)) {
void *addr = edata_base_get(edata);
size_t size = edata_size_get(edata);
ehooks_zero(tsdn, ehooks, addr, size);
edata_zeroed_set(edata, true);
} }
if (config_prof) { if (config_prof) {