diff --git a/src/hw/msr/Msr_linux.cpp b/src/hw/msr/Msr_linux.cpp index 15e86fc35..29bb8ad1d 100644 --- a/src/hw/msr/Msr_linux.cpp +++ b/src/hw/msr/Msr_linux.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -48,7 +49,27 @@ static int msr_open(int32_t cpu, int flags) class MsrPrivate { public: - bool available = true; + inline MsrPrivate() : m_available(msr_allow_writes() || msr_modprobe()) {} + + inline bool isAvailable() const { return m_available; } + +private: + inline bool msr_allow_writes() + { + std::ofstream file("/sys/module/msr/parameters/allow_writes", std::ios::out | std::ios::binary | std::ios::trunc); + if (file.is_open()) { + file << "on"; + } + + return file.good(); + } + + inline bool msr_modprobe() + { + return system("/sbin/modprobe msr allow_writes=on > /dev/null 2>&1") == 0; + } + + const bool m_available; }; @@ -57,15 +78,8 @@ public: xmrig::Msr::Msr() : d_ptr(new MsrPrivate()) { - if(access("/sys/module/msr/parameters/allow_writes", F_OK) == 0) { - if(system("echo on > /sys/module/msr/parameters/allow_writes") != 0) { - d_ptr->available = false; - } - } - else if (system("/sbin/modprobe msr allow_writes=on > /dev/null 2>&1") != 0) { - LOG_WARN("%s " YELLOW_BOLD("msr kernel module is not available"), Msr::tag()); - - d_ptr->available = false; + if (!isAvailable()) { + LOG_WARN("%s " YELLOW_BOLD("msr kernel module is not available"), tag()); } } @@ -78,7 +92,7 @@ xmrig::Msr::~Msr() bool xmrig::Msr::isAvailable() const { - return d_ptr->available; + return d_ptr->isAvailable(); }