diff options
author | Lennart Poettering <lennart@poettering.net> | 2018-05-07 21:47:15 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2018-05-17 20:48:54 +0200 |
commit | d107bb7d63a641d003ad513c9d3b6306743a424e (patch) | |
tree | 9b3cf6bf43fd3b4885fecf2d47880aa55c126ed7 /src/nspawn/nspawn-settings.c | |
parent | 50ebcf6cb79f709cc08c8a797df128a4a79fc8fd (diff) | |
download | systemd-d107bb7d63a641d003ad513c9d3b6306743a424e.tar.gz |
nspawn: add a new --cpu-affinity= switch
Similar as the other options added before, this is primarily useful to
provide comprehensive OCI runtime compatbility, but might be useful
otherwise, too.
Diffstat (limited to 'src/nspawn/nspawn-settings.c')
-rw-r--r-- | src/nspawn/nspawn-settings.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/nspawn/nspawn-settings.c b/src/nspawn/nspawn-settings.c index c91ac73e2e..0acf718456 100644 --- a/src/nspawn/nspawn-settings.c +++ b/src/nspawn/nspawn-settings.c @@ -8,6 +8,7 @@ #include "alloc-util.h" #include "cap-list.h" #include "conf-parser.h" +#include "cpu-set-util.h" #include "hostname-util.h" #include "nspawn-network.h" #include "nspawn-settings.h" @@ -85,6 +86,7 @@ Settings* settings_free(Settings *s) { strv_free(s->syscall_blacklist); rlimit_free_all(s->rlimit); free(s->hostname); + s->cpuset = cpu_set_mfree(s->cpuset); strv_free(s->network_interfaces); strv_free(s->network_macvlan); @@ -673,3 +675,52 @@ int config_parse_oom_score_adjust( return 0; } + +int config_parse_cpu_affinity( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + + _cleanup_cpu_free_ cpu_set_t *cpuset = NULL; + Settings *settings = data; + int ncpus; + + assert(rvalue); + assert(settings); + + ncpus = parse_cpu_set_and_warn(rvalue, &cpuset, unit, filename, line, lvalue); + if (ncpus < 0) + return ncpus; + + if (ncpus == 0) { + /* An empty assignment resets the CPU list */ + settings->cpuset = cpu_set_mfree(settings->cpuset); + settings->cpuset_ncpus = 0; + return 0; + } + + if (!settings->cpuset) { + settings->cpuset = TAKE_PTR(cpuset); + settings->cpuset_ncpus = (unsigned) ncpus; + return 0; + } + + if (settings->cpuset_ncpus < (unsigned) ncpus) { + CPU_OR_S(CPU_ALLOC_SIZE(settings->cpuset_ncpus), cpuset, settings->cpuset, cpuset); + CPU_FREE(settings->cpuset); + settings->cpuset = TAKE_PTR(cpuset); + settings->cpuset_ncpus = (unsigned) ncpus; + return 0; + } + + CPU_OR_S(CPU_ALLOC_SIZE((unsigned) ncpus), settings->cpuset, settings->cpuset, cpuset); + + return 0; +} |