From 9dce868fb90bc69e24447a631a6ec5028d4ce8c0 Mon Sep 17 00:00:00 2001 From: XMRig Date: Mon, 7 Oct 2019 23:38:01 +0700 Subject: [PATCH] Added "memory-pool" option. --- src/backend/cpu/CpuConfig.cpp | 26 +++++++++++++++++++++++--- src/backend/cpu/CpuConfig.h | 5 ++++- src/core/Controller.cpp | 2 +- src/crypto/common/VirtualMemory.cpp | 6 +++--- src/crypto/common/VirtualMemory.h | 2 +- 5 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/backend/cpu/CpuConfig.cpp b/src/backend/cpu/CpuConfig.cpp index 8a8a76c6..adda40dc 100644 --- a/src/backend/cpu/CpuConfig.cpp +++ b/src/backend/cpu/CpuConfig.cpp @@ -36,6 +36,7 @@ static const char *kEnabled = "enabled"; static const char *kHugePages = "huge-pages"; static const char *kHwAes = "hw-aes"; static const char *kMaxThreadsHint = "max-threads-hint"; +static const char *kMemoryPool = "memory-pool"; static const char *kPriority = "priority"; #ifdef XMRIG_FEATURE_ASM @@ -90,6 +91,7 @@ rapidjson::Value xmrig::CpuConfig::toJSON(rapidjson::Document &doc) const obj.AddMember(StringRef(kHugePages), m_hugePages, allocator); obj.AddMember(StringRef(kHwAes), m_aes == AES_AUTO ? Value(kNullType) : Value(m_aes == AES_HW), allocator); obj.AddMember(StringRef(kPriority), priority() != -1 ? Value(priority()) : Value(kNullType), allocator); + obj.AddMember(StringRef(kMemoryPool), m_memoryPool < 1 ? Value(m_memoryPool < 0) : Value(m_memoryPool), allocator); if (m_threads.isEmpty()) { obj.AddMember(StringRef(kMaxThreadsHint), m_limit, allocator); @@ -109,6 +111,12 @@ rapidjson::Value xmrig::CpuConfig::toJSON(rapidjson::Document &doc) const } +size_t xmrig::CpuConfig::memPoolSize() const +{ + return m_memoryPool < 0 ? Cpu::info()->threads() : m_memoryPool; +} + + std::vector xmrig::CpuConfig::get(const Miner *miner, const Algorithm &algorithm) const { std::vector out; @@ -137,6 +145,7 @@ void xmrig::CpuConfig::read(const rapidjson::Value &value, uint32_t version) setAesMode(Json::getValue(value, kHwAes)); setPriority(Json::getInt(value, kPriority, -1)); + setMemoryPool(Json::getValue(value, kMemoryPool)); # ifdef XMRIG_FEATURE_ASM m_assembly = Json::getValue(value, kAsm); @@ -205,12 +214,23 @@ void xmrig::CpuConfig::generateArgon2() } -void xmrig::CpuConfig::setAesMode(const rapidjson::Value &aesMode) +void xmrig::CpuConfig::setAesMode(const rapidjson::Value &value) { - if (aesMode.IsBool()) { - m_aes = aesMode.GetBool() ? AES_HW : AES_SOFT; + if (value.IsBool()) { + m_aes = value.GetBool() ? AES_HW : AES_SOFT; } else { m_aes = AES_AUTO; } } + + +void xmrig::CpuConfig::setMemoryPool(const rapidjson::Value &value) +{ + if (value.IsBool()) { + m_memoryPool = value.GetBool() ? -1 : 0; + } + else if (value.IsInt()) { + m_memoryPool = value.GetInt(); + } +} diff --git a/src/backend/cpu/CpuConfig.h b/src/backend/cpu/CpuConfig.h index 27075425..60d0a1c5 100644 --- a/src/backend/cpu/CpuConfig.h +++ b/src/backend/cpu/CpuConfig.h @@ -48,6 +48,7 @@ public: bool isHwAES() const; rapidjson::Value toJSON(rapidjson::Document &doc) const; + size_t memPoolSize() const; std::vector get(const Miner *miner, const Algorithm &algorithm) const; void read(const rapidjson::Value &value, uint32_t version); @@ -62,7 +63,8 @@ public: private: void generate(); void generateArgon2(); - void setAesMode(const rapidjson::Value &aesMode); + void setAesMode(const rapidjson::Value &value); + void setMemoryPool(const rapidjson::Value &value); inline void setPriority(int priority) { m_priority = (priority >= -1 && priority <= 5) ? priority : -1; } @@ -71,6 +73,7 @@ private: bool m_enabled = true; bool m_hugePages = true; bool m_shouldSave = false; + int m_memoryPool = 0; int m_priority = -1; String m_argon2Impl; Threads m_threads; diff --git a/src/core/Controller.cpp b/src/core/Controller.cpp index 75a3e51b..21570ea8 100644 --- a/src/core/Controller.cpp +++ b/src/core/Controller.cpp @@ -52,7 +52,7 @@ int xmrig::Controller::init() { Base::init(); - VirtualMemory::init(config()->cpu().isHugePages(), -1); + VirtualMemory::init(config()->cpu().memPoolSize(), config()->cpu().isHugePages()); m_network = new Network(this); diff --git a/src/crypto/common/VirtualMemory.cpp b/src/crypto/common/VirtualMemory.cpp index 95030846..08364a89 100644 --- a/src/crypto/common/VirtualMemory.cpp +++ b/src/crypto/common/VirtualMemory.cpp @@ -110,7 +110,7 @@ void xmrig::VirtualMemory::destroy() } -void xmrig::VirtualMemory::init(bool hugePages, int poolSize) +void xmrig::VirtualMemory::init(size_t poolSize, bool hugePages) { if (!pool) { osInit(); @@ -118,10 +118,10 @@ void xmrig::VirtualMemory::init(bool hugePages, int poolSize) # ifdef XMRIG_FEATURE_HWLOC if (Cpu::info()->nodes() > 1) { - pool = new NUMAMemoryPool(align(poolSize < 0 ? Cpu::info()->threads() : poolSize, Cpu::info()->nodes()), hugePages); + pool = new NUMAMemoryPool(align(poolSize, Cpu::info()->nodes()), hugePages); } else # endif { - pool = new MemoryPool(poolSize < 0 ? Cpu::info()->threads() : poolSize, hugePages); + pool = new MemoryPool(poolSize, hugePages); } } diff --git a/src/crypto/common/VirtualMemory.h b/src/crypto/common/VirtualMemory.h index 668ae907..3c983951 100644 --- a/src/crypto/common/VirtualMemory.h +++ b/src/crypto/common/VirtualMemory.h @@ -64,7 +64,7 @@ public: static void destroy(); static void flushInstructionCache(void *p, size_t size); static void freeLargePagesMemory(void *p, size_t size); - static void init(bool hugePages, int poolSize); + static void init(size_t poolSize, bool hugePages); static void protectExecutableMemory(void *p, size_t size); static void unprotectExecutableMemory(void *p, size_t size);