diff --git a/src/common/xcgroup_read_config.c b/src/common/xcgroup_read_config.c index 41386c93ad7458a944fdabfeb98447023a733f89..9a45dd40610c5d810bd53917498c49d840c5ad58 100644 --- a/src/common/xcgroup_read_config.c +++ b/src/common/xcgroup_read_config.c @@ -93,6 +93,34 @@ static void _clear_slurm_cgroup_conf(slurm_cgroup_conf_t *slurm_cgroup_conf) } } +/* + * Parse a floating point value in s and return in val + * Return -1 on error and leave *val unchanged. + */ +static int str_to_float (char *s, float *val) +{ + float f; + char *p; + + errno = 0; + f = strtof (s, &p); + + if ((*p != '\0') || (errno != 0)) + return (-1); + + *val = f; + return (0); +} + +static void conf_get_float (s_p_hashtbl_t *t, char *name, float *fp) +{ + char *str; + if (!s_p_get_string(&str, name, t)) + return; + if (str_to_float (str, fp) < 0) + fatal ("cgroup.conf: Invalid value '%s' for %s", str, name); +} + /* * read_slurm_cgroup_conf - load the Slurm cgroup configuration from the * cgroup.conf file. @@ -108,14 +136,14 @@ extern int read_slurm_cgroup_conf(slurm_cgroup_conf_t *slurm_cgroup_conf) {"ConstrainCores", S_P_BOOLEAN}, {"TaskAffinity", S_P_BOOLEAN}, {"ConstrainRAMSpace", S_P_BOOLEAN}, - {"AllowedRAMSpace", S_P_UINT32}, - {"MaxRAMPercent", S_P_UINT32}, + {"AllowedRAMSpace", S_P_STRING}, + {"MaxRAMPercent", S_P_STRING}, {"ConstrainSwapSpace", S_P_BOOLEAN}, - {"AllowedSwapSpace", S_P_UINT32}, - {"MaxSwapPercent", S_P_UINT32}, + {"AllowedSwapSpace", S_P_STRING}, + {"MaxSwapPercent", S_P_STRING}, {"ConstrainCores", S_P_BOOLEAN}, {"MemoryLimitEnforcement", S_P_BOOLEAN}, - {"MemoryLimitThreshold", S_P_UINT32}, + {"MemoryLimitThreshold", S_P_STRING}, {"ConstrainDevices", S_P_BOOLEAN}, {"AllowedDevicesFile", S_P_STRING}, {NULL} }; @@ -173,33 +201,35 @@ extern int read_slurm_cgroup_conf(slurm_cgroup_conf_t *slurm_cgroup_conf) if (!s_p_get_boolean(&slurm_cgroup_conf->constrain_ram_space, "ConstrainRAMSpace", tbl)) slurm_cgroup_conf->constrain_ram_space = false; - if (!s_p_get_uint32(&slurm_cgroup_conf->allowed_ram_space, - "AllowedRAMSpace", tbl)) - slurm_cgroup_conf->allowed_ram_space = 100; + + conf_get_float (tbl, + "AllowedRAMSpace", + &slurm_cgroup_conf->allowed_ram_space); + + conf_get_float (tbl, + "MaxRAMPercent", + &slurm_cgroup_conf->max_ram_percent); + if (!s_p_get_boolean(&slurm_cgroup_conf->constrain_swap_space, "ConstrainSwapSpace", tbl)) slurm_cgroup_conf->constrain_swap_space = false; - if (!s_p_get_uint32(&slurm_cgroup_conf->allowed_swap_space, - "AllowedSwapSpace", tbl)) - slurm_cgroup_conf->allowed_swap_space = 0; - if (s_p_get_uint32(&slurm_cgroup_conf->max_ram_percent, - "MaxRAMPercent", tbl) - && (slurm_cgroup_conf->max_ram_percent > 100)) - fatal ("%s: Invalid MaxRAMPercent\n", conf_path); + conf_get_float (tbl, + "AllowedSwapSpace", + &slurm_cgroup_conf->allowed_swap_space); - if (s_p_get_uint32(&slurm_cgroup_conf->max_swap_percent, - "MaxSwapPercent", tbl) - && (slurm_cgroup_conf->max_swap_percent > 100)) - fatal ("%s: Invalid MaxSwapPercent\n", conf_path); + conf_get_float (tbl, + "MaxSwapPercent", + &slurm_cgroup_conf->max_swap_percent); /* Memory limits */ if (!s_p_get_boolean(&slurm_cgroup_conf->memlimit_enforcement, "MemoryLimitEnforcement", tbl)) slurm_cgroup_conf->memlimit_enforcement = false; - if (!s_p_get_uint32(&slurm_cgroup_conf->memlimit_threshold, - "MemoryLimitThreshold", tbl)) - slurm_cgroup_conf->memlimit_threshold = 0; + + conf_get_float (tbl, + "MemoryLimitThreshold", + &slurm_cgroup_conf->memlimit_threshold); /* Devices constraint related conf items */ if (!s_p_get_boolean(&slurm_cgroup_conf->constrain_devices, diff --git a/src/common/xcgroup_read_config.h b/src/common/xcgroup_read_config.h index 032129b11e501eff2f8eafc572d92d906831d954..afdd4f054194322f7426dbd6c811afea895c1f95 100644 --- a/src/common/xcgroup_read_config.h +++ b/src/common/xcgroup_read_config.h @@ -63,15 +63,15 @@ typedef struct slurm_cgroup_conf { bool task_affinity; bool constrain_ram_space; - uint32_t allowed_ram_space; - uint32_t max_ram_percent; /* Upper bound on memory as % of RAM*/ + float allowed_ram_space; + float max_ram_percent; /* Upper bound on memory as % of RAM*/ bool constrain_swap_space; - uint32_t allowed_swap_space; - uint32_t max_swap_percent; /* Upper bound on swap as % of RAM */ + float allowed_swap_space; + float max_swap_percent; /* Upper bound on swap as % of RAM */ bool memlimit_enforcement; - uint32_t memlimit_threshold; + float memlimit_threshold; bool constrain_devices; char * allowed_devices_file; diff --git a/src/plugins/task/cgroup/task_cgroup_memory.c b/src/plugins/task/cgroup/task_cgroup_memory.c index 1db40e636c92ffdff4d100f4f407393f1c368f99..bb5de6e60a21eb6dcd75a2aad3b60a2386510a4b 100644 --- a/src/plugins/task/cgroup/task_cgroup_memory.c +++ b/src/plugins/task/cgroup/task_cgroup_memory.c @@ -66,14 +66,14 @@ static xcgroup_t user_memory_cg; static xcgroup_t job_memory_cg; static xcgroup_t step_memory_cg; -static int allowed_ram_space; -static int allowed_swap_space; +static float allowed_ram_space; /* Allowed RAM in percent */ +static float allowed_swap_space; /* Allowed Swap percent */ static uint64_t max_ram; /* Upper bound for memory.limit_in_bytes */ static uint64_t max_swap; /* Upper bound for swap */ static uint64_t totalram; /* Total real memory available on node */ -static uint64_t percent_in_bytes (uint64_t mb, uint32_t percent) +static uint64_t percent_in_bytes (uint64_t mb, float percent) { return ((mb * 1024 * 1024) * (percent / 100.0)); }