From 261d784c7b0e8c2b33ae8701b12397f2cc6e695b Mon Sep 17 00:00:00 2001 From: Jan Friesse Date: Mon, 16 Mar 2020 16:57:09 +0100 Subject: [PATCH 2/2] Add ability to move process into root cgroup Signed-off-by: Jan Friesse --- spausedd.8 | 8 +++++--- spausedd.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 53 insertions(+), 5 deletions(-) diff --git a/spausedd.8 b/spausedd.8 index 6c35666..b23e590 100644 --- a/spausedd.8 +++ b/spausedd.8 @@ -1,5 +1,5 @@ .\" -.\" Copyright (c) 2018-2019, Red Hat, Inc. +.\" Copyright (c) 2018-2020, Red Hat, Inc. .\" .\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above @@ -15,7 +15,7 @@ .\" .\" Author: Jan Friesse .\" -.Dd Mar 21, 2018 +.Dd Nov 11, 2020 .Dt SPAUSEDD 8 .Os .Sh NAME @@ -66,7 +66,9 @@ Run on foreground (do not demonize - default). Show help. .It Fl p Do not set RR scheduler. -.It Fl t Ar steal_threshold +.It Fl P +Do not move process to root cgroup. +.It Fl m Ar steal_threshold Set steal threshold percent. (default is 10 if kernel information is used and 100 if VMGuestLib is used). .It Fl t Ar timeout diff --git a/spausedd.c b/spausedd.c index 0a6fe65..6a194cd 100644 --- a/spausedd.c +++ b/spausedd.c @@ -273,6 +273,42 @@ utils_set_rr_scheduler(void) #endif } +static void +utils_move_to_root_cgroup(void) +{ + FILE *f; + + /* + * /sys/fs/cgroup is hardcoded, because most of Linux distributions are now + * using systemd and systemd uses hardcoded path of cgroup mount point. + * + * This feature is expected to be removed as soon as systemd gets support + * for managing RT configuration. + */ + f = fopen("/sys/fs/cgroup/cpu/cpu.rt_runtime_us", "rt"); + if (f == NULL) { + log_printf(LOG_DEBUG, "cpu.rt_runtime_us doesn't exists -> " + "system without cgroup or with disabled CONFIG_RT_GROUP_SCHED"); + return ; + } + (void)fclose(f); + + f = fopen("/sys/fs/cgroup/cpu/tasks", "w"); + if (f == NULL) { + log_printf(LOG_WARNING, "Can't open cgroups tasks file for writing"); + return ; + } + + if (fprintf(f, "%jd\n", (intmax_t)getpid()) <= 0) { + log_printf(LOG_WARNING, "Can't write spausedd pid into cgroups tasks file"); + } + + if (fclose(f) != 0) { + log_printf(LOG_WARNING, "Can't close cgroups tasks file"); + return ; + } +} + /* * Signal handlers */ @@ -603,13 +639,14 @@ poll_run(uint64_t timeout) static void usage(void) { - printf("usage: %s [-dDfhp] [-m steal_th] [-t timeout]\n", PROGRAM_NAME); + printf("usage: %s [-dDfhpP] [-m steal_th] [-t timeout]\n", PROGRAM_NAME); printf("\n"); printf(" -d Display debug messages\n"); printf(" -D Run on background - daemonize\n"); printf(" -f Run foreground - do not daemonize (default)\n"); printf(" -h Show help\n"); printf(" -p Do not set RR scheduler\n"); + printf(" -P Do not move process to root cgroup\n"); printf(" -m steal_th Steal percent threshold\n"); printf(" -t timeout Set timeout value (default: %u)\n", DEFAULT_TIMEOUT); } @@ -622,14 +659,16 @@ main(int argc, char **argv) long long int tmpll; uint64_t timeout; int set_prio; + int move_to_root_cgroup; foreground = 1; timeout = DEFAULT_TIMEOUT; set_prio = 1; + move_to_root_cgroup = 1; max_steal_threshold = DEFAULT_MAX_STEAL_THRESHOLD; max_steal_threshold_user_set = 0; - while ((ch = getopt(argc, argv, "dDfhpm:t:")) != -1) { + while ((ch = getopt(argc, argv, "dDfhpPm:t:")) != -1) { switch (ch) { case 'D': foreground = 0; @@ -659,6 +698,9 @@ main(int argc, char **argv) usage(); exit(1); break; + case 'P': + move_to_root_cgroup = 0; + break; case 'p': set_prio = 0; break; @@ -677,6 +719,10 @@ main(int argc, char **argv) utils_mlockall(); + if (move_to_root_cgroup) { + utils_move_to_root_cgroup(); + } + if (set_prio) { utils_set_rr_scheduler(); } -- 2.18.2