From 83ac7c691e643160720cf5e3899bd7ef0dd44bd1 Mon Sep 17 00:00:00 2001 From: Nathaniel Wesley Filardo Date: Tue, 31 May 2022 09:29:28 +0100 Subject: [PATCH] backend ranges: hide object_range behind accessor This allows us to have a single Pipe-line of ranges where we can, nevertheless, jump over the small buddy allocator when making large allocations. This, in turn, will let us differentiate the types coming from the small end and the large "tap" on this Pipe-line. --- src/snmalloc/backend/backend.h | 4 ++-- src/snmalloc/backend/meta_protected_range.h | 11 ++++++++--- src/snmalloc/backend/standard_range.h | 16 ++++++++++++---- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/snmalloc/backend/backend.h b/src/snmalloc/backend/backend.h index ae39ca1..cb399aa 100644 --- a/src/snmalloc/backend/backend.h +++ b/src/snmalloc/backend/backend.h @@ -84,7 +84,7 @@ namespace snmalloc return {nullptr, nullptr}; } - auto p = local_state.object_range.alloc_range(size); + auto p = local_state.get_object_range()->alloc_range(size); #ifdef SNMALLOC_TRACING message<1024>("Alloc chunk: {} ({})", p.unsafe_ptr(), size); @@ -146,7 +146,7 @@ namespace snmalloc // the chunk. On CHERI platforms this will need to be stored in the // SlabMetadata or similar. auto chunk = capptr::Chunk::unsafe_from(alloc.unsafe_ptr()); - local_state.object_range.dealloc_range(chunk, size); + local_state.get_object_range()->dealloc_range(chunk, size); } template diff --git a/src/snmalloc/backend/meta_protected_range.h b/src/snmalloc/backend/meta_protected_range.h index 46cdbc5..5c5795c 100644 --- a/src/snmalloc/backend/meta_protected_range.h +++ b/src/snmalloc/backend/meta_protected_range.h @@ -103,13 +103,18 @@ namespace snmalloc Pagemap>, SmallBuddyRange>; - public: - using Stats = StatsCombiner; - ObjectRange object_range; MetaRange meta_range; + public: + using Stats = StatsCombiner; + + ObjectRange* get_object_range() + { + return &object_range; + } + MetaRange& get_meta_range() { return meta_range; diff --git a/src/snmalloc/backend/standard_range.h b/src/snmalloc/backend/standard_range.h index b9a2d5b..225a9a3 100644 --- a/src/snmalloc/backend/standard_range.h +++ b/src/snmalloc/backend/standard_range.h @@ -44,23 +44,31 @@ namespace snmalloc static constexpr size_t page_size_bits = bits::next_pow2_bits_const(PAL::page_size); + public: // Source for object allocations and metadata // Use buddy allocators to cache locally. - using ObjectRange = Pipe< + using LargeObjectRange = Pipe< Stats, LargeBuddyRange< LocalCacheSizeBits, LocalCacheSizeBits, Pagemap, - page_size_bits>, - SmallBuddyRange>; + page_size_bits>>; + + private: + using ObjectRange = Pipe; + + ObjectRange object_range; public: // Expose a global range for the initial allocation of meta-data. using GlobalMetaRange = Pipe; // Where we get user allocations from. - ObjectRange object_range; + LargeObjectRange* get_object_range() + { + return object_range.template ancestor(); + } // Where we get meta-data allocations from. ObjectRange& get_meta_range()