set nice/oom_adjust only when asked for

This commit is contained in:
Lennart Poettering 2010-01-28 02:53:56 +01:00
parent d46de8a1a2
commit fb33a393e2
3 changed files with 42 additions and 23 deletions

View File

@ -263,7 +263,6 @@ int exec_spawn(const ExecCommand *command, const ExecContext *context, int *fds,
if (pid == 0) { if (pid == 0) {
char **e, **f = NULL; char **e, **f = NULL;
int i, r; int i, r;
char t[16];
sigset_t ss; sigset_t ss;
/* child */ /* child */
@ -286,18 +285,23 @@ int exec_spawn(const ExecCommand *command, const ExecContext *context, int *fds,
goto fail; goto fail;
} }
snprintf(t, sizeof(t), "%i", context->oom_adjust); if (context->oom_adjust_set) {
char_array_0(t); char t[16];
if (write_one_line_file("/proc/self/oom_adj", t) < 0) { snprintf(t, sizeof(t), "%i", context->oom_adjust);
r = EXIT_OOM_ADJUST; char_array_0(t);
goto fail;
if (write_one_line_file("/proc/self/oom_adj", t) < 0) {
r = EXIT_OOM_ADJUST;
goto fail;
}
} }
if (setpriority(PRIO_PROCESS, 0, context->nice) < 0) { if (context->nice_set)
r = EXIT_NICE; if (setpriority(PRIO_PROCESS, 0, context->nice) < 0) {
goto fail; r = EXIT_NICE;
} goto fail;
}
if (close_fds(fds, n_fds) < 0 || if (close_fds(fds, n_fds) < 0 ||
shift_fds(fds, n_fds) < 0 || shift_fds(fds, n_fds) < 0 ||
@ -428,13 +432,19 @@ void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) {
fprintf(f, fprintf(f,
"%sUmask: %04o\n" "%sUmask: %04o\n"
"%sDirectory: %s\n" "%sDirectory: %s\n",
"%sNice: %i\n"
"%sOOMAdjust: %i\n",
prefix, c->umask, prefix, c->umask,
prefix, c->directory ? c->directory : "/", prefix, c->directory ? c->directory : "/");
prefix, c->nice,
prefix, c->oom_adjust); 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) { void exec_status_fill(ExecStatus *s, pid_t pid, int code, int status) {

View File

@ -44,9 +44,12 @@ struct ExecContext {
char **environment; char **environment;
mode_t umask; mode_t umask;
struct rlimit *rlimit[RLIMIT_NLIMITS]; /* FIXME: load-fragment parser missing */ struct rlimit *rlimit[RLIMIT_NLIMITS]; /* FIXME: load-fragment parser missing */
char *directory;
int oom_adjust; int oom_adjust;
int nice; int nice;
char *directory;
bool oom_adjust_set:1;
bool nice_set:1;
ExecOutput output; ExecOutput output;
int syslog_priority; int syslog_priority;

View File

@ -208,7 +208,8 @@ static int config_parse_nice(
void *data, void *data,
void *userdata) { void *userdata) {
int *i = data, priority, r; ExecContext *c = data;
int priority, r;
assert(filename); assert(filename);
assert(lvalue); assert(lvalue);
@ -225,7 +226,9 @@ static int config_parse_nice(
return -ERANGE; return -ERANGE;
} }
*i = priority; c->nice = priority;
c->nice_set = false;
return 0; return 0;
} }
@ -238,7 +241,8 @@ static int config_parse_oom_adjust(
void *data, void *data,
void *userdata) { void *userdata) {
int *i = data, oa, r; ExecContext *c = data;
int oa, r;
assert(filename); assert(filename);
assert(lvalue); assert(lvalue);
@ -255,7 +259,9 @@ static int config_parse_oom_adjust(
return -ERANGE; return -ERANGE;
} }
*i = oa; c->oom_adjust = oa;
c->oom_adjust_set = true;
return 0; return 0;
} }
@ -709,8 +715,8 @@ static int load_from_path(Unit *u, const char *path) {
{ "User", config_parse_string, &(context).user, section }, \ { "User", config_parse_string, &(context).user, section }, \
{ "Group", config_parse_string, &(context).group, section }, \ { "Group", config_parse_string, &(context).group, section }, \
{ "SupplementaryGroups", config_parse_strv, &(context).supplementary_groups, section }, \ { "SupplementaryGroups", config_parse_strv, &(context).supplementary_groups, section }, \
{ "Nice", config_parse_nice, &(context).nice, section }, \ { "Nice", config_parse_nice, &(context), section }, \
{ "OOMAdjust", config_parse_oom_adjust, &(context).oom_adjust, section }, \ { "OOMAdjust", config_parse_oom_adjust, &(context), section }, \
{ "UMask", config_parse_umask, &(context).umask, section }, \ { "UMask", config_parse_umask, &(context).umask, section }, \
{ "Environment", config_parse_strv, &(context).environment, section }, \ { "Environment", config_parse_strv, &(context).environment, section }, \
{ "Output", config_parse_output, &(context).output, section }, \ { "Output", config_parse_output, &(context).output, section }, \