From ab57c86e3aa232e41d0bbf3ff1856960ae3ec174 Mon Sep 17 00:00:00 2001 From: Matthew Parkinson Date: Wed, 16 Jan 2019 17:03:15 +0000 Subject: [PATCH] Addressing CR feedback --- src/mem/alloc.h | 13 ++++++++++--- src/mem/pagemap.h | 19 ++++++++++++------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/mem/alloc.h b/src/mem/alloc.h index 096ad47..ab009e7 100644 --- a/src/mem/alloc.h +++ b/src/mem/alloc.h @@ -38,10 +38,17 @@ namespace snmalloc PMMediumslab = 2 }; +#ifndef SNMALLOC_MAX_FLATPAGEMAP_SIZE +// 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); + using SuperslabPagemap = std::conditional_t< - bits::is64(), - Pagemap, - FlatPagemap>; + USE_FLATPAGEMAP, + FlatPagemap, + Pagemap>; HEADER_GLOBAL SuperslabPagemap global_pagemap; /** diff --git a/src/mem/pagemap.h b/src/mem/pagemap.h index e0e73b1..b902199 100644 --- a/src/mem/pagemap.h +++ b/src/mem/pagemap.h @@ -7,13 +7,13 @@ namespace snmalloc { + static constexpr size_t PAGEMAP_NODE_BITS = 16; + static constexpr size_t PAGEMAP_NODE_SIZE = 1ULL << PAGEMAP_NODE_BITS; + template class Pagemap { private: - static constexpr size_t PAGEMAP_BITS = 16; - static constexpr size_t PAGEMAP_SIZE = 1 << PAGEMAP_BITS; - static constexpr size_t COVERED_BITS = bits::ADDRESS_BITS - GRANULARITY_BITS; static constexpr size_t POINTER_BITS = @@ -22,14 +22,15 @@ namespace snmalloc bits::next_pow2_bits_const(sizeof(T)); static_assert( - PAGEMAP_BITS - CONTENT_BITS < COVERED_BITS, + PAGEMAP_NODE_BITS - CONTENT_BITS < COVERED_BITS, "Should use the FlatPageMap as it does not require a tree"); - static constexpr size_t BITS_FOR_LEAF = PAGEMAP_BITS - CONTENT_BITS; + static constexpr size_t BITS_FOR_LEAF = PAGEMAP_NODE_BITS - CONTENT_BITS; static constexpr size_t ENTRIES_PER_LEAF = 1 << BITS_FOR_LEAF; static constexpr size_t LEAF_MASK = ENTRIES_PER_LEAF - 1; - static constexpr size_t BITS_PER_INDEX_LEVEL = PAGEMAP_BITS - POINTER_BITS; + static constexpr size_t BITS_PER_INDEX_LEVEL = + PAGEMAP_NODE_BITS - POINTER_BITS; static constexpr size_t ENTRIES_PER_INDEX_LEVEL = 1 << BITS_PER_INDEX_LEVEL; static constexpr size_t ENTRIES_MASK = ENTRIES_PER_INDEX_LEVEL - 1; @@ -85,7 +86,7 @@ namespace snmalloc value, (PagemapEntry*)LOCKED_ENTRY, std::memory_order_relaxed)) { auto& v = default_memory_provider; - value = (PagemapEntry*)v.alloc_chunk(PAGEMAP_SIZE); + value = (PagemapEntry*)v.alloc_chunk(PAGEMAP_NODE_SIZE); e->store(value, std::memory_order_release); } else @@ -229,6 +230,10 @@ namespace snmalloc } }; + /** + * Simple pagemap that for each GRANULARITY_BITS of the address range + * stores a T. + **/ template class FlatPagemap {