psset: Rename "bitmap" to "pageslab_bitmap".

It tracks pageslabs.  Soon, we'll have another bitmap (to track dirty pages)
that we want to disambiguate.

While we're here, fix an out-of-date comment.
This commit is contained in:
David Goldblatt 2021-02-08 11:26:56 -08:00 committed by David Goldblatt
parent 154aa5fcc1
commit 6bddb92ad6
2 changed files with 8 additions and 13 deletions

View File

@ -57,7 +57,7 @@ struct psset_s {
*/ */
hpdata_age_heap_t pageslabs[PSSET_NPSIZES]; hpdata_age_heap_t pageslabs[PSSET_NPSIZES];
/* Bitmap for which set bits correspond to non-empty heaps. */ /* Bitmap for which set bits correspond to non-empty heaps. */
fb_group_t bitmap[FB_NGROUPS(PSSET_NPSIZES)]; fb_group_t pageslab_bitmap[FB_NGROUPS(PSSET_NPSIZES)];
/* /*
* The sum of all bin stats in stats. This lets us quickly answer * The sum of all bin stats in stats. This lets us quickly answer
* queries for the number of dirty, active, and retained pages in the * queries for the number of dirty, active, and retained pages in the

View File

@ -10,7 +10,7 @@ psset_init(psset_t *psset) {
for (unsigned i = 0; i < PSSET_NPSIZES; i++) { for (unsigned i = 0; i < PSSET_NPSIZES; i++) {
hpdata_age_heap_new(&psset->pageslabs[i]); hpdata_age_heap_new(&psset->pageslabs[i]);
} }
fb_init(psset->bitmap, PSSET_NPSIZES); fb_init(psset->pageslab_bitmap, PSSET_NPSIZES);
memset(&psset->merged_stats, 0, sizeof(psset->merged_stats)); memset(&psset->merged_stats, 0, sizeof(psset->merged_stats));
memset(&psset->stats, 0, sizeof(psset->stats)); memset(&psset->stats, 0, sizeof(psset->stats));
hpdata_empty_list_init(&psset->empty); hpdata_empty_list_init(&psset->empty);
@ -40,14 +40,9 @@ psset_stats_accum(psset_stats_t *dst, psset_stats_t *src) {
} }
/* /*
* The stats maintenance strategy is simple, but not necessarily obvious. * The stats maintenance strategy is to remove a pageslab's contribution to the
* edata_nfree and the bitmap must remain consistent at all times. If they * stats when we call psset_update_begin, and re-add it (to a potentially new
* change while an edata is within an edata_heap (or full), then the associated * bin) when we call psset_update_end.
* stats bin (or the full bin) must also change. If they change while not in a
* bin (say, in between extraction and reinsertion), then the bin stats need not
* change. If a pageslab is removed from a bin (or becomes nonfull), it should
* no longer contribute to that bin's stats (or the full stats). These help
* ensure we don't miss any heap modification operations.
*/ */
JEMALLOC_ALWAYS_INLINE void JEMALLOC_ALWAYS_INLINE void
psset_bin_stats_insert_remove(psset_t *psset, psset_bin_stats_t *binstats, psset_bin_stats_insert_remove(psset_t *psset, psset_bin_stats_t *binstats,
@ -98,14 +93,14 @@ static void
psset_hpdata_heap_remove(psset_t *psset, pszind_t pind, hpdata_t *ps) { psset_hpdata_heap_remove(psset_t *psset, pszind_t pind, hpdata_t *ps) {
hpdata_age_heap_remove(&psset->pageslabs[pind], ps); hpdata_age_heap_remove(&psset->pageslabs[pind], ps);
if (hpdata_age_heap_empty(&psset->pageslabs[pind])) { if (hpdata_age_heap_empty(&psset->pageslabs[pind])) {
fb_unset(psset->bitmap, PSSET_NPSIZES, (size_t)pind); fb_unset(psset->pageslab_bitmap, PSSET_NPSIZES, (size_t)pind);
} }
} }
static void static void
psset_hpdata_heap_insert(psset_t *psset, pszind_t pind, hpdata_t *ps) { psset_hpdata_heap_insert(psset_t *psset, pszind_t pind, hpdata_t *ps) {
if (hpdata_age_heap_empty(&psset->pageslabs[pind])) { if (hpdata_age_heap_empty(&psset->pageslabs[pind])) {
fb_set(psset->bitmap, PSSET_NPSIZES, (size_t)pind); fb_set(psset->pageslab_bitmap, PSSET_NPSIZES, (size_t)pind);
} }
hpdata_age_heap_insert(&psset->pageslabs[pind], ps); hpdata_age_heap_insert(&psset->pageslabs[pind], ps);
} }
@ -263,7 +258,7 @@ psset_pick_alloc(psset_t *psset, size_t size) {
assert(size <= HUGEPAGE); assert(size <= HUGEPAGE);
pszind_t min_pind = sz_psz2ind(sz_psz_quantize_ceil(size)); pszind_t min_pind = sz_psz2ind(sz_psz_quantize_ceil(size));
pszind_t pind = (pszind_t)fb_ffs(psset->bitmap, PSSET_NPSIZES, pszind_t pind = (pszind_t)fb_ffs(psset->pageslab_bitmap, PSSET_NPSIZES,
(size_t)min_pind); (size_t)min_pind);
if (pind == PSSET_NPSIZES) { if (pind == PSSET_NPSIZES) {
return hpdata_empty_list_first(&psset->empty); return hpdata_empty_list_first(&psset->empty);