mirror of
https://github.com/jemalloc/jemalloc.git
synced 2026-07-23 21:23:06 +00:00
Store edata->state in rtree leaf and make edata_t 128B aligned.
Verified that this doesn't result in any real increase of edata_t bytes allocated.
This commit is contained in:
@@ -472,7 +472,7 @@ edata_t *
|
||||
base_alloc_edata(tsdn_t *tsdn, base_t *base) {
|
||||
size_t esn;
|
||||
edata_t *edata = base_alloc_impl(tsdn, base, sizeof(edata_t),
|
||||
CACHELINE, &esn);
|
||||
EDATA_ALIGNMENT, &esn);
|
||||
if (edata == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -143,6 +143,7 @@ emap_rtree_write_acquired(tsdn_t *tsdn, emap_t *emap, rtree_leaf_elm_t *elm_a,
|
||||
contents.metadata.slab = slab;
|
||||
contents.metadata.is_head = (edata == NULL) ? false :
|
||||
edata_is_head_get(edata);
|
||||
contents.metadata.state = (edata == NULL) ? 0 : edata_state_get(edata);
|
||||
rtree_leaf_elm_write(tsdn, &emap->rtree, elm_a, contents);
|
||||
if (elm_b != NULL) {
|
||||
rtree_leaf_elm_write(tsdn, &emap->rtree, elm_b, contents);
|
||||
@@ -170,11 +171,13 @@ emap_register_interior(tsdn_t *tsdn, emap_t *emap, edata_t *edata,
|
||||
EMAP_DECLARE_RTREE_CTX;
|
||||
|
||||
assert(edata_slab_get(edata));
|
||||
assert(edata_state_get(edata) == extent_state_active);
|
||||
|
||||
rtree_contents_t contents;
|
||||
contents.edata = edata;
|
||||
contents.metadata.szind = szind;
|
||||
contents.metadata.slab = true;
|
||||
contents.metadata.state = extent_state_active;
|
||||
contents.metadata.is_head = false; /* Not allowed to access. */
|
||||
|
||||
/* Register interior. */
|
||||
@@ -219,6 +222,7 @@ emap_remap(tsdn_t *tsdn, emap_t *emap, edata_t *edata, szind_t szind,
|
||||
contents.metadata.szind = szind;
|
||||
contents.metadata.slab = slab;
|
||||
contents.metadata.is_head = edata_is_head_get(edata);
|
||||
contents.metadata.state = edata_state_get(edata);
|
||||
|
||||
rtree_write(tsdn, &emap->rtree, rtree_ctx,
|
||||
(uintptr_t)edata_addr_get(edata), contents);
|
||||
@@ -304,6 +308,7 @@ emap_merge_commit(tsdn_t *tsdn, emap_t *emap, emap_prepare_t *prepare,
|
||||
clear_contents.metadata.szind = SC_NSIZES;
|
||||
clear_contents.metadata.slab = false;
|
||||
clear_contents.metadata.is_head = false;
|
||||
clear_contents.metadata.state = (extent_state_t)0;
|
||||
|
||||
if (prepare->lead_elm_b != NULL) {
|
||||
rtree_leaf_elm_write(tsdn, &emap->rtree,
|
||||
@@ -331,6 +336,7 @@ emap_do_assert_mapped(tsdn_t *tsdn, emap_t *emap, edata_t *edata) {
|
||||
(uintptr_t)edata_base_get(edata));
|
||||
assert(contents.edata == edata);
|
||||
assert(contents.metadata.is_head == edata_is_head_get(edata));
|
||||
assert(contents.metadata.state == edata_state_get(edata));
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
36
src/extent.c
36
src/extent.c
@@ -64,11 +64,12 @@ extent_may_force_decay(pac_t *pac) {
|
||||
static bool
|
||||
extent_try_delayed_coalesce(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
|
||||
ecache_t *ecache, edata_t *edata) {
|
||||
edata_state_set(edata, extent_state_active);
|
||||
emap_edata_state_update(tsdn, pac->emap, edata, extent_state_active);
|
||||
|
||||
bool coalesced;
|
||||
edata = extent_try_coalesce(tsdn, pac, ehooks, ecache,
|
||||
edata, &coalesced, false);
|
||||
edata_state_set(edata, ecache->state);
|
||||
emap_edata_state_update(tsdn, pac->emap, edata, ecache->state);
|
||||
|
||||
if (!coalesced) {
|
||||
return true;
|
||||
@@ -182,7 +183,8 @@ ecache_evict(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
|
||||
not_reached();
|
||||
case extent_state_dirty:
|
||||
case extent_state_muzzy:
|
||||
edata_state_set(edata, extent_state_active);
|
||||
emap_edata_state_update(tsdn, pac->emap, edata,
|
||||
extent_state_active);
|
||||
break;
|
||||
case extent_state_retained:
|
||||
extent_deregister(tsdn, pac, edata);
|
||||
@@ -223,28 +225,30 @@ extents_abandon_vm(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks, ecache_t *ecache,
|
||||
}
|
||||
|
||||
static void
|
||||
extent_deactivate_locked(tsdn_t *tsdn, ecache_t *ecache, edata_t *edata) {
|
||||
extent_deactivate_locked(tsdn_t *tsdn, pac_t *pac, ecache_t *ecache,
|
||||
edata_t *edata) {
|
||||
assert(edata_arena_ind_get(edata) == ecache_ind_get(ecache));
|
||||
assert(edata_state_get(edata) == extent_state_active);
|
||||
|
||||
edata_state_set(edata, ecache->state);
|
||||
emap_edata_state_update(tsdn, pac->emap, edata, ecache->state);
|
||||
eset_insert(&ecache->eset, edata);
|
||||
}
|
||||
|
||||
static void
|
||||
extent_deactivate(tsdn_t *tsdn, ecache_t *ecache, edata_t *edata) {
|
||||
extent_deactivate(tsdn_t *tsdn, pac_t *pac, ecache_t *ecache, edata_t *edata) {
|
||||
malloc_mutex_lock(tsdn, &ecache->mtx);
|
||||
extent_deactivate_locked(tsdn, ecache, edata);
|
||||
extent_deactivate_locked(tsdn, pac, ecache, edata);
|
||||
malloc_mutex_unlock(tsdn, &ecache->mtx);
|
||||
}
|
||||
|
||||
static void
|
||||
extent_activate_locked(tsdn_t *tsdn, ecache_t *ecache, edata_t *edata) {
|
||||
extent_activate_locked(tsdn_t *tsdn, pac_t *pac, ecache_t *ecache,
|
||||
edata_t *edata) {
|
||||
assert(edata_arena_ind_get(edata) == ecache_ind_get(ecache));
|
||||
assert(edata_state_get(edata) == ecache->state);
|
||||
|
||||
eset_remove(&ecache->eset, edata);
|
||||
edata_state_set(edata, extent_state_active);
|
||||
emap_edata_state_update(tsdn, pac->emap, edata, extent_state_active);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -421,7 +425,7 @@ extent_recycle_extract(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
extent_activate_locked(tsdn, ecache, edata);
|
||||
extent_activate_locked(tsdn, pac, ecache, edata);
|
||||
malloc_mutex_unlock(tsdn, &ecache->mtx);
|
||||
|
||||
return edata;
|
||||
@@ -527,16 +531,16 @@ extent_recycle_split(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
|
||||
* leaking the extent.
|
||||
*/
|
||||
assert(to_leak != NULL && lead == NULL && trail == NULL);
|
||||
extent_deactivate(tsdn, ecache, to_leak);
|
||||
extent_deactivate(tsdn, pac, ecache, to_leak);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (result == extent_split_interior_ok) {
|
||||
if (lead != NULL) {
|
||||
extent_deactivate(tsdn, ecache, lead);
|
||||
extent_deactivate(tsdn, pac, ecache, lead);
|
||||
}
|
||||
if (trail != NULL) {
|
||||
extent_deactivate(tsdn, ecache, trail);
|
||||
extent_deactivate(tsdn, pac, ecache, trail);
|
||||
}
|
||||
return edata;
|
||||
} else {
|
||||
@@ -837,7 +841,7 @@ extent_coalesce(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks, ecache_t *ecache,
|
||||
edata_t *inner, edata_t *outer, bool forward, bool growing_retained) {
|
||||
assert(extent_can_coalesce(ecache, inner, outer));
|
||||
|
||||
extent_activate_locked(tsdn, ecache, outer);
|
||||
extent_activate_locked(tsdn, pac, ecache, outer);
|
||||
|
||||
malloc_mutex_unlock(tsdn, &ecache->mtx);
|
||||
bool err = extent_merge_impl(tsdn, pac, ehooks,
|
||||
@@ -845,7 +849,7 @@ extent_coalesce(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks, ecache_t *ecache,
|
||||
malloc_mutex_lock(tsdn, &ecache->mtx);
|
||||
|
||||
if (err) {
|
||||
extent_deactivate_locked(tsdn, ecache, outer);
|
||||
extent_deactivate_locked(tsdn, pac, ecache, outer);
|
||||
}
|
||||
|
||||
return err;
|
||||
@@ -1008,7 +1012,7 @@ extent_record(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
|
||||
return;
|
||||
}
|
||||
}
|
||||
extent_deactivate_locked(tsdn, ecache, edata);
|
||||
extent_deactivate_locked(tsdn, pac, ecache, edata);
|
||||
|
||||
malloc_mutex_unlock(tsdn, &ecache->mtx);
|
||||
}
|
||||
|
||||
@@ -91,7 +91,8 @@ label_success:
|
||||
*/
|
||||
assert(edata_state_get(edata) == extent_state_dirty);
|
||||
assert(edata_base_get(edata) == edata_addr_get(edata));
|
||||
edata_state_set(edata, extent_state_active);
|
||||
emap_edata_state_update(tsdn, central->emap, edata,
|
||||
extent_state_active);
|
||||
return edata;
|
||||
}
|
||||
|
||||
@@ -136,7 +137,7 @@ hpa_central_alloc_grow(tsdn_t *tsdn, hpa_central_t *central,
|
||||
edata_sn_set(edata, sn);
|
||||
edata_sn_set(trail, sn);
|
||||
|
||||
edata_state_set(trail, extent_state_dirty);
|
||||
emap_edata_state_update(tsdn, central->emap, trail, extent_state_dirty);
|
||||
eset_insert(¢ral->eset, trail);
|
||||
return false;
|
||||
}
|
||||
@@ -203,6 +204,6 @@ hpa_central_dalloc(tsdn_t *tsdn, hpa_central_t *central, edata_t *edata) {
|
||||
eset_remove(¢ral->eset, trail);
|
||||
hpa_central_dalloc_merge(tsdn, central, edata, trail);
|
||||
}
|
||||
edata_state_set(edata, extent_state_dirty);
|
||||
emap_edata_state_update(tsdn, central->emap, edata, extent_state_dirty);
|
||||
eset_insert(¢ral->eset, edata);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user