aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEvan Klitzke <[email protected]>2018-03-06 12:50:20 -0500
committerEvan Klitzke <[email protected]>2018-03-26 15:59:41 -0700
commitd54874d795a523d7cad5f4a9f4270145e56238f8 (patch)
treef39d91af0b1506f87c94c75aebf8e901530c70bc /src
parentMerge #11962: [net] add seed.bitcoin.sprovoost.nl to DNS seeds (diff)
downloaddiscoin-d54874d795a523d7cad5f4a9f4270145e56238f8.tar.xz
discoin-d54874d795a523d7cad5f4a9f4270145e56238f8.zip
Set SCHED_BATCH priority on the loadblk thread.
While reading another PR I saw a mention of #6358. The use case for SCHED_BATCH is to hint to the kernel that the thread is running a non-interactive workload that consumes a lot of CPU time. This is helpful on desktop machines where the loadblk thread can interfere with interactive applications. More details can be found in the sched(7) man page.
Diffstat (limited to 'src')
-rw-r--r--src/init.cpp1
-rw-r--r--src/util.cpp15
-rw-r--r--src/util.h9
3 files changed, 25 insertions, 0 deletions
diff --git a/src/init.cpp b/src/init.cpp
index e5443eef0..62767edbf 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -625,6 +625,7 @@ void ThreadImport(std::vector<fs::path> vImportFiles)
{
const CChainParams& chainparams = Params();
RenameThread("bitcoin-loadblk");
+ ScheduleBatchPriority();
{
CImportingNow imp;
diff --git a/src/util.cpp b/src/util.cpp
index 494d5c4ea..842d4f6e1 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -31,6 +31,7 @@
#include <algorithm>
#include <fcntl.h>
+#include <sched.h>
#include <sys/resource.h>
#include <sys/stat.h>
@@ -966,3 +967,17 @@ fs::path AbsPathForConfigVal(const fs::path& path, bool net_specific)
{
return fs::absolute(path, GetDataDir(net_specific));
}
+
+int ScheduleBatchPriority(void)
+{
+#ifdef SCHED_BATCH
+ const static sched_param param{.sched_priority = 0};
+ if (int ret = pthread_setschedparam(0, SCHED_BATCH, &param)) {
+ LogPrintf("Failed to pthread_setschedparam: %s\n", strerror(errno));
+ return ret;
+ }
+ return 0;
+#else
+ return 1;
+#endif
+}
diff --git a/src/util.h b/src/util.h
index 04ff44f21..a9f64a056 100644
--- a/src/util.h
+++ b/src/util.h
@@ -357,4 +357,13 @@ std::unique_ptr<T> MakeUnique(Args&&... args)
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
+/**
+ * On platforms that support it, tell the kernel the calling thread is
+ * CPU-intensive and non-interactive. See SCHED_BATCH in sched(7) for details.
+ *
+ * @return The return value of sched_setschedule(), or 1 on systems without
+ * sched_setchedule().
+ */
+int ScheduleBatchPriority(void);
+
#endif // BITCOIN_UTIL_H