From fb33a393e21a15ce3b4ac8c16d947fd9b6e77206 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 28 Jan 2010 02:53:56 +0100 Subject: [PATCH] set nice/oom_adjust only when asked for --- execute.c | 42 ++++++++++++++++++++++++++---------------- execute.h | 5 ++++- load-fragment.c | 18 ++++++++++++------ 3 files changed, 42 insertions(+), 23 deletions(-) diff --git a/execute.c b/execute.c index ccf951a25..cbefadfca 100644 --- a/execute.c +++ b/execute.c @@ -263,7 +263,6 @@ int exec_spawn(const ExecCommand *command, const ExecContext *context, int *fds, if (pid == 0) { char **e, **f = NULL; int i, r; - char t[16]; sigset_t ss; /* child */ @@ -286,19 +285,24 @@ int exec_spawn(const ExecCommand *command, const ExecContext *context, int *fds, goto fail; } - snprintf(t, sizeof(t), "%i", context->oom_adjust); - char_array_0(t); + if (context->oom_adjust_set) { + char t[16]; - if (write_one_line_file("/proc/self/oom_adj", t) < 0) { - r = EXIT_OOM_ADJUST; - goto fail; - } + snprintf(t, sizeof(t), "%i", context->oom_adjust); + char_array_0(t); - if (setpriority(PRIO_PROCESS, 0, context->nice) < 0) { - r = EXIT_NICE; - goto fail; + if (write_one_line_file("/proc/self/oom_adj", t) < 0) { + r = EXIT_OOM_ADJUST; + goto fail; + } } + if (context->nice_set) + if (setpriority(PRIO_PROCESS, 0, context->nice) < 0) { + r = EXIT_NICE; + goto fail; + } + if (close_fds(fds, n_fds) < 0 || shift_fds(fds, n_fds) < 0 || flags_fds(fds, n_fds) < 0) { @@ -428,13 +432,19 @@ void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) { fprintf(f, "%sUmask: %04o\n" - "%sDirectory: %s\n" - "%sNice: %i\n" - "%sOOMAdjust: %i\n", + "%sDirectory: %s\n", prefix, c->umask, - prefix, c->directory ? c->directory : "/", - prefix, c->nice, - prefix, c->oom_adjust); + prefix, c->directory ? c->directory : "/"); + + if (c->nice_set) + fprintf(f, + "%sNice: %i\n", + prefix, c->nice); + + if (c->oom_adjust_set) + fprintf(f, + "%sOOMAdjust: %i\n", + prefix, c->oom_adjust); } void exec_status_fill(ExecStatus *s, pid_t pid, int code, int status) { diff --git a/execute.h b/execute.h index 3283e1f81..04b9f6ef8 100644 --- a/execute.h +++ b/execute.h @@ -44,9 +44,12 @@ struct ExecContext { char **environment; mode_t umask; struct rlimit *rlimit[RLIMIT_NLIMITS]; /* FIXME: load-fragment parser missing */ + char *directory; int oom_adjust; int nice; - char *directory; + + bool oom_adjust_set:1; + bool nice_set:1; ExecOutput output; int syslog_priority; diff --git a/load-fragment.c b/load-fragment.c index 9273fc8b8..0db74b3ee 100644 --- a/load-fragment.c +++ b/load-fragment.c @@ -208,7 +208,8 @@ static int config_parse_nice( void *data, void *userdata) { - int *i = data, priority, r; + ExecContext *c = data; + int priority, r; assert(filename); assert(lvalue); @@ -225,7 +226,9 @@ static int config_parse_nice( return -ERANGE; } - *i = priority; + c->nice = priority; + c->nice_set = false; + return 0; } @@ -238,7 +241,8 @@ static int config_parse_oom_adjust( void *data, void *userdata) { - int *i = data, oa, r; + ExecContext *c = data; + int oa, r; assert(filename); assert(lvalue); @@ -255,7 +259,9 @@ static int config_parse_oom_adjust( return -ERANGE; } - *i = oa; + c->oom_adjust = oa; + c->oom_adjust_set = true; + return 0; } @@ -709,8 +715,8 @@ static int load_from_path(Unit *u, const char *path) { { "User", config_parse_string, &(context).user, section }, \ { "Group", config_parse_string, &(context).group, section }, \ { "SupplementaryGroups", config_parse_strv, &(context).supplementary_groups, section }, \ - { "Nice", config_parse_nice, &(context).nice, section }, \ - { "OOMAdjust", config_parse_oom_adjust, &(context).oom_adjust, section }, \ + { "Nice", config_parse_nice, &(context), section }, \ + { "OOMAdjust", config_parse_oom_adjust, &(context), section }, \ { "UMask", config_parse_umask, &(context).umask, section }, \ { "Environment", config_parse_strv, &(context).environment, section }, \ { "Output", config_parse_output, &(context).output, section }, \ -- 2.30.2