diff --git a/src/slurmd/ulimits.c b/src/slurmd/ulimits.c index 28566dfd8d5d8f440c211d451c385d4af713ffd5..f727f2ac0de86960c6d930dac765d20c9d944c94 100644 --- a/src/slurmd/ulimits.c +++ b/src/slurmd/ulimits.c @@ -43,12 +43,18 @@ struct userlim { int resource; }; +/* + * This is a list of SLURM environment variables that contain the + * desired user limits for this node, along with the corresponding + * get/setrlimit resource number. + */ static struct userlim ulims[] = { { "SLURM_RLIMIT_CORE" , RLIMIT_CORE }, { "SLURM_RLIMIT_FSIZE" , RLIMIT_FSIZE }, { "SLURM_RLIMIT_NPROC" , RLIMIT_NPROC }, { "SLURM_RLIMIT_NOFILE", RLIMIT_NOFILE}, - { NULL, 0 } }; + { NULL, 0 } + }; /* * Prototypes: @@ -84,12 +90,23 @@ _set_limit(char **env, struct userlim *u) struct rlimit r; if ((val = _get_env_val(env, u->var)) > -2L) { - getrlimit(u->resource, &r); + if (getrlimit(u->resource, &r) < 0) + error("getrlimit(%s,%ld): %m", u->var+6, val); + + debug2("%s: max:%ld cur:%ld", u->var+6, + r.rlim_max, r.rlim_cur); + + /* + * If resource limit is already set equal to value + * no need to call setrlimit + */ + if (r.rlim_cur == (rlim_t) val) + return SLURM_SUCCESS; r.rlim_cur = (val == -1L) ? RLIM_INFINITY : (rlim_t) val; if ((retval = setrlimit(u->resource, &r)) < 0) - error("setrlimit(%s, %ld): %m", u->var+5, val); + error("setrlimit(%s,%ld): %m", u->var+6, r.rlim_cur); } return retval;