diff options
author | Lennart Poettering <lennart@poettering.net> | 2019-03-18 17:41:27 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2019-03-19 15:55:07 +0100 |
commit | 20ee849d57e141e03a577554803da00d84b8f5ac (patch) | |
tree | 82b2866dd5f9d23d4743bb69ead7eaa83a1596ae /src/basic | |
parent | ba22ff13a07a9478921c5342ef07dd5dcdd0e7d1 (diff) | |
download | systemd-20ee849d57e141e03a577554803da00d84b8f5ac.tar.gz |
process-util: add new helper cpus_in_affinity_mask()
Let's add a new helper for determining how many CPUs are configured for
us
Diffstat (limited to 'src/basic')
-rw-r--r-- | src/basic/process-util.c | 34 | ||||
-rw-r--r-- | src/basic/process-util.h | 2 |
2 files changed, 36 insertions, 0 deletions
diff --git a/src/basic/process-util.c b/src/basic/process-util.c index c41a2aa5c9..1f228be5d3 100644 --- a/src/basic/process-util.c +++ b/src/basic/process-util.c @@ -1535,6 +1535,40 @@ int set_oom_score_adjust(int value) { WRITE_STRING_FILE_VERIFY_ON_FAILURE|WRITE_STRING_FILE_DISABLE_BUFFER); } +int cpus_in_affinity_mask(void) { + size_t n = 16; + int r; + + for (;;) { + cpu_set_t *c; + + c = CPU_ALLOC(n); + if (!c) + return -ENOMEM; + + if (sched_getaffinity(0, CPU_ALLOC_SIZE(n), c) >= 0) { + int k; + + k = CPU_COUNT_S(CPU_ALLOC_SIZE(n), c); + CPU_FREE(c); + + if (k <= 0) + return -EINVAL; + + return k; + } + + r = -errno; + CPU_FREE(c); + + if (r != -EINVAL) + return r; + if (n > SIZE_MAX/2) + return -ENOMEM; + n *= 2; + } +} + static const char *const ioprio_class_table[] = { [IOPRIO_CLASS_NONE] = "none", [IOPRIO_CLASS_RT] = "realtime", diff --git a/src/basic/process-util.h b/src/basic/process-util.h index 9950723996..f6eb82d6b6 100644 --- a/src/basic/process-util.h +++ b/src/basic/process-util.h @@ -193,3 +193,5 @@ assert_cc(TASKS_MAX <= (unsigned long) PID_T_MAX) (pid) = 0; \ _pid_; \ }) + +int cpus_in_affinity_mask(void); |