Skip to content

Commit

Permalink
Use FlatPageMap on OS with lazy commit
Browse files Browse the repository at this point in the history
If the operating system will allocate private pages on demand for the
pagemap then use the FlatPageMap by default as it generates better code
for deallocation.
  • Loading branch information
mjp41 committed Jul 10, 2019
1 parent 1e3f951 commit e240dd2
Show file tree
Hide file tree
Showing 5 changed files with 16 additions and 6 deletions.
8 changes: 6 additions & 2 deletions src/mem/alloc.h
Expand Up @@ -46,8 +46,10 @@ namespace snmalloc
// Use flat map is under a single node.
# define SNMALLOC_MAX_FLATPAGEMAP_SIZE PAGEMAP_NODE_SIZE
#endif
static constexpr bool USE_FLATPAGEMAP = SNMALLOC_MAX_FLATPAGEMAP_SIZE >=
sizeof(FlatPagemap<SUPERSLAB_BITS, uint8_t>);
static constexpr bool USE_FLATPAGEMAP =
(Pal::pal_features & PalFeatures::LazyCommit) ||
(SNMALLOC_MAX_FLATPAGEMAP_SIZE >=
sizeof(FlatPagemap<SUPERSLAB_BITS, uint8_t>));

using SuperslabPagemap = std::conditional_t<
USE_FLATPAGEMAP,
Expand Down Expand Up @@ -1152,6 +1154,8 @@ namespace snmalloc
SNMALLOC_SLOW_PATH void small_dealloc_offseted_slow(
Superslab* super, void* p, sizeclass_t sizeclass)
{
handle_message_queue();

bool was_full = super->is_full();
SlabList* sl = &small_classes[sizeclass];
Slab* slab = Slab::get(p);
Expand Down
2 changes: 1 addition & 1 deletion src/pal/pal_apple.h
Expand Up @@ -22,7 +22,7 @@ namespace snmalloc
* Bitmap of PalFeatures flags indicating the optional features that this
* PAL supports.
*/
static constexpr uint64_t pal_features = 0;
static constexpr uint64_t pal_features = LazyCommit;
static void error(const char* const str)
{
puts(str);
Expand Down
8 changes: 7 additions & 1 deletion src/pal/pal_consts.h
Expand Up @@ -25,7 +25,13 @@ namespace snmalloc
* a size and alignment. A PAL that does *not* support it must expose a
* `request()` method that takes only a size.
*/
AlignedAllocation = (1 << 1)
AlignedAllocation = (1 << 1),
/**
* This PAL natively supports lazy commit of pages. This means have large
* allocations and not touching them does not up memory usage. This is
* exposed in the P
*/
LazyCommit = (1 << 2),
};
/**
* Flag indicating whether requested memory should be zeroed.
Expand Down
2 changes: 1 addition & 1 deletion src/pal/pal_freebsd.h
Expand Up @@ -17,7 +17,7 @@ namespace snmalloc
* Bitmap of PalFeatures flags indicating the optional features that this
* PAL supports.
*/
static constexpr uint64_t pal_features = AlignedAllocation;
static constexpr uint64_t pal_features = AlignedAllocation | LazyCommit;
static void error(const char* const str)
{
puts(str);
Expand Down
2 changes: 1 addition & 1 deletion src/pal/pal_linux.h
Expand Up @@ -18,7 +18,7 @@ namespace snmalloc
* Bitmap of PalFeatures flags indicating the optional features that this
* PAL supports.
*/
static constexpr uint64_t pal_features = 0;
static constexpr uint64_t pal_features = LazyCommit;
static void error(const char* const str)
{
puts(str);
Expand Down

0 comments on commit e240dd2

Please sign in to comment.