hpdata: Return the number of pages to be purged.

We'll use this in the next commit.
This commit is contained in:
David Goldblatt 2020-12-06 13:16:51 -08:00 committed by David Goldblatt
parent 9fd9c876bb
commit dc886e5608
3 changed files with 13 additions and 5 deletions

View File

@ -363,8 +363,11 @@ struct hpdata_purge_state_s {
* Once you begin purging, you have to follow through and call hpdata_purge_next * Once you begin purging, you have to follow through and call hpdata_purge_next
* until you're done, and then end. Allocating out of an hpdata undergoing * until you're done, and then end. Allocating out of an hpdata undergoing
* purging is not allowed. * purging is not allowed.
*
* Returns the number of pages that will be purged.
*/ */
void hpdata_purge_begin(hpdata_t *hpdata, hpdata_purge_state_t *purge_state); size_t hpdata_purge_begin(hpdata_t *hpdata, hpdata_purge_state_t *purge_state);
/* /*
* If there are more extents to purge, sets *r_purge_addr and *r_purge_size to * If there are more extents to purge, sets *r_purge_addr and *r_purge_size to
* true, and returns true. Otherwise, returns false to indicate that we're * true, and returns true. Otherwise, returns false to indicate that we're

View File

@ -158,7 +158,7 @@ hpdata_unreserve(hpdata_t *hpdata, void *addr, size_t sz) {
hpdata_assert_consistent(hpdata); hpdata_assert_consistent(hpdata);
} }
void size_t
hpdata_purge_begin(hpdata_t *hpdata, hpdata_purge_state_t *purge_state) { hpdata_purge_begin(hpdata_t *hpdata, hpdata_purge_state_t *purge_state) {
hpdata_assert_consistent(hpdata); hpdata_assert_consistent(hpdata);
/* See the comment in reserve. */ /* See the comment in reserve. */
@ -181,10 +181,13 @@ hpdata_purge_begin(hpdata_t *hpdata, hpdata_purge_state_t *purge_state) {
hpdata->touched_pages, HUGEPAGE_PAGES); hpdata->touched_pages, HUGEPAGE_PAGES);
/* We purge everything we can. */ /* We purge everything we can. */
assert(hpdata->h_ntouched - hpdata->h_nactive == fb_scount( size_t to_purge = hpdata->h_ntouched - hpdata->h_nactive;
assert(to_purge == fb_scount(
purge_state->to_purge, HUGEPAGE_PAGES, 0, HUGEPAGE_PAGES)); purge_state->to_purge, HUGEPAGE_PAGES, 0, HUGEPAGE_PAGES));
hpdata_assert_consistent(hpdata); hpdata_assert_consistent(hpdata);
return to_purge;
} }
bool bool

View File

@ -68,7 +68,8 @@ TEST_BEGIN(test_purge_simple) {
expect_zu_eq(hpdata_ntouched_get(&hpdata), HUGEPAGE_PAGES / 2, ""); expect_zu_eq(hpdata_ntouched_get(&hpdata), HUGEPAGE_PAGES / 2, "");
hpdata_purge_state_t purge_state; hpdata_purge_state_t purge_state;
hpdata_purge_begin(&hpdata, &purge_state); size_t to_purge = hpdata_purge_begin(&hpdata, &purge_state);
expect_zu_eq(HUGEPAGE_PAGES / 4, to_purge, "");
void *purge_addr; void *purge_addr;
size_t purge_size; size_t purge_size;
@ -112,7 +113,8 @@ TEST_BEGIN(test_purge_intervening_dalloc) {
expect_zu_eq(hpdata_ntouched_get(&hpdata), 3 * HUGEPAGE_PAGES / 4, ""); expect_zu_eq(hpdata_ntouched_get(&hpdata), 3 * HUGEPAGE_PAGES / 4, "");
hpdata_purge_state_t purge_state; hpdata_purge_state_t purge_state;
hpdata_purge_begin(&hpdata, &purge_state); size_t to_purge = hpdata_purge_begin(&hpdata, &purge_state);
expect_zu_eq(HUGEPAGE_PAGES / 2, to_purge, "");
void *purge_addr; void *purge_addr;
size_t purge_size; size_t purge_size;