HPA: Fix typos with big performance implications.

This fixes two simple but significant typos in the HPA:
- The conf string parsing accidentally set a min value of PAGE for
  hpa_sec_batch_fill_extra; i.e. allocating 4096 extra pages every time we
  attempted to allocate a single page.  This puts us over the SEC flush limit,
  so we then immediately flush all but one of them (probably triggering
  purging).
- The HPA was using the default PAI batch alloc implementation, which meant it
  did not actually get any locking advantages.

This snuck by because I did all the performance testing without using the PAI
interface or config settings.  When I cleaned it up and put everything behind
nice interfaces, I only did correctness checks, and didn't try any performance
ones.
This commit is contained in:
David Goldblatt 2021-06-03 17:14:43 -07:00 committed by David Goldblatt
parent de033f56c0
commit d202218e86
2 changed files with 3 additions and 3 deletions

View File

@ -92,7 +92,7 @@ hpa_shard_init(hpa_shard_t *shard, emap_t *emap, base_t *base,
* operating on corrupted data. * operating on corrupted data.
*/ */
shard->pai.alloc = &hpa_alloc; shard->pai.alloc = &hpa_alloc;
shard->pai.alloc_batch = &pai_alloc_batch_default; shard->pai.alloc_batch = &hpa_alloc_batch;
shard->pai.expand = &hpa_expand; shard->pai.expand = &hpa_expand;
shard->pai.shrink = &hpa_shrink; shard->pai.shrink = &hpa_shrink;
shard->pai.dalloc = &hpa_dalloc; shard->pai.dalloc = &hpa_dalloc;

View File

@ -1489,8 +1489,8 @@ malloc_conf_init_helper(sc_data_t *sc_data, unsigned bin_shard_sizes[SC_NBINS],
"hpa_sec_bytes_after_flush", PAGE, 0, "hpa_sec_bytes_after_flush", PAGE, 0,
CONF_CHECK_MIN, CONF_DONT_CHECK_MAX, true); CONF_CHECK_MIN, CONF_DONT_CHECK_MAX, true);
CONF_HANDLE_SIZE_T(opt_hpa_sec_opts.batch_fill_extra, CONF_HANDLE_SIZE_T(opt_hpa_sec_opts.batch_fill_extra,
"hpa_sec_batch_fill_extra", PAGE, 0, CONF_CHECK_MIN, "hpa_sec_batch_fill_extra", 0, HUGEPAGE_PAGES,
CONF_DONT_CHECK_MAX, true); CONF_CHECK_MIN, CONF_CHECK_MAX, true);
if (CONF_MATCH("slab_sizes")) { if (CONF_MATCH("slab_sizes")) {
if (CONF_MATCH_VALUE("default")) { if (CONF_MATCH_VALUE("default")) {