aboutsummaryrefslogtreecommitdiffstats
path: root/vespamalloc
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2022-02-11 13:07:40 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2022-02-11 13:07:40 +0000
commit3adf32e361332b9207a627a9f8d19a57d970f4f0 (patch)
tree509f228dc13b212d6262b3fb5e7867eb119bd47a /vespamalloc
parent12b32cdca0a2e98633bd6cc9e83de4c84f926264 (diff)
- Use an unordered map.
- Add clarifying comments. - Cap mmaplimit in the range [1M, 1G].
Diffstat (limited to 'vespamalloc')
-rw-r--r--vespamalloc/src/vespamalloc/malloc/mmappool.h4
-rw-r--r--vespamalloc/src/vespamalloc/malloc/threadpool.hpp17
2 files changed, 15 insertions, 6 deletions
diff --git a/vespamalloc/src/vespamalloc/malloc/mmappool.h b/vespamalloc/src/vespamalloc/malloc/mmappool.h
index 32c00167c71..c07ef9dce15 100644
--- a/vespamalloc/src/vespamalloc/malloc/mmappool.h
+++ b/vespamalloc/src/vespamalloc/malloc/mmappool.h
@@ -2,7 +2,7 @@
#pragma once
#include <atomic>
-#include <map>
+#include <unordered_map>
namespace vespamalloc {
@@ -27,7 +27,7 @@ private:
std::atomic<size_t> _count;
std::atomic<bool> _has_hugepage_failure_just_happened;
mutable std::mutex _mutex;
- std::map<const void *, MMapInfo> _mappings;
+ std::unordered_map<const void *, MMapInfo> _mappings;
};
}
diff --git a/vespamalloc/src/vespamalloc/malloc/threadpool.hpp b/vespamalloc/src/vespamalloc/malloc/threadpool.hpp
index 202a6529c99..31ed1296a9e 100644
--- a/vespamalloc/src/vespamalloc/malloc/threadpool.hpp
+++ b/vespamalloc/src/vespamalloc/malloc/threadpool.hpp
@@ -6,11 +6,17 @@
namespace vespamalloc {
+namespace {
+ constexpr size_t MMAP_LIMIT_MIN = 0x100000; // 1M
+ constexpr size_t MMAP_LIMIT_MAX = 0x40000000; // 1G
+}
+
template <typename MemBlockPtrT, typename ThreadStatT>
size_t ThreadPoolT<MemBlockPtrT, ThreadStatT>::_threadCacheLimit __attribute__((visibility("hidden"))) = 0x10000;
template <typename MemBlockPtrT, typename ThreadStatT>
-void ThreadPoolT<MemBlockPtrT, ThreadStatT>::info(FILE * os, size_t level, const DataSegment<MemBlockPtrT> & ds) const {
+void
+ThreadPoolT<MemBlockPtrT, ThreadStatT>::info(FILE * os, size_t level, const DataSegment<MemBlockPtrT> & ds) const {
if (level > 0) {
for (size_t i=0; i < NELEMS(_stat); i++) {
const ThreadStatT & s = _stat[i];
@@ -50,7 +56,8 @@ void ThreadPoolT<MemBlockPtrT, ThreadStatT>::info(FILE * os, size_t level, const
}
template <typename MemBlockPtrT, typename ThreadStatT >
-void ThreadPoolT<MemBlockPtrT, ThreadStatT>::
+void
+ThreadPoolT<MemBlockPtrT, ThreadStatT>::
mallocHelper(size_t exactSize,
SizeClassT sc,
typename ThreadPoolT<MemBlockPtrT, ThreadStatT>::AllocFree & af,
@@ -73,6 +80,7 @@ mallocHelper(size_t exactSize,
} else {
if (exactSize > _mmapLimit) {
mem = MemBlockPtrT(_mmapPool->mmap(MemBlockPtrT::classSize(sc)), MemBlockPtrT::classSize(sc));
+ // The below settings are to allow the sanity checks conducted at the call site to succeed
mem.setExact(exactSize);
mem.free();
} else {
@@ -93,7 +101,7 @@ template <typename MemBlockPtrT, typename ThreadStatT >
ThreadPoolT<MemBlockPtrT, ThreadStatT>::ThreadPoolT() :
_allocPool(nullptr),
_mmapPool(nullptr),
- _mmapLimit(0x40000000),
+ _mmapLimit(MMAP_LIMIT_MAX),
_threadId(0),
_osThreadId(0)
{
@@ -104,8 +112,9 @@ ThreadPoolT<MemBlockPtrT, ThreadStatT>::~ThreadPoolT() = default;
template <typename MemBlockPtrT, typename ThreadStatT >
int ThreadPoolT<MemBlockPtrT, ThreadStatT>::mallopt(int param, int value) {
+ size_t limit = value;
if (param == M_MMAP_THRESHOLD) {
- _mmapLimit = value;
+ _mmapLimit = std::min(MMAP_LIMIT_MAX, std::max(MMAP_LIMIT_MIN, limit));
return 1;
}
return 0;