diff --git a/NEWS b/NEWS index bb4989ccc8e5afe3a38259fa433befacd2e26eb3..5b728bd1ae548b9b695cd5cc2f444aa42aada6fc 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,8 @@ documents those changes that are of interest to users and administrators. -- Add new RPC (REQUEST_EVENT_LOG) so that slurmd and slurmstepd can log events through the slurmctld daemon. -- Remove sbatch --bb option. That option was never supported. + -- Automically cleanup task/cgroup cpuset and devices cgroups after steps are + done. * Changes in Slurm 17.02.0pre1 ============================== diff --git a/src/plugins/task/cgroup/task_cgroup_cpuset.c b/src/plugins/task/cgroup/task_cgroup_cpuset.c index 0bcbb38ceac393320eb6cd65f336823541255500..5fa99f516b75cb462fb88ff4d105b75860ad44d9 100644 --- a/src/plugins/task/cgroup/task_cgroup_cpuset.c +++ b/src/plugins/task/cgroup/task_cgroup_cpuset.c @@ -1056,6 +1056,32 @@ extern int task_cgroup_cpuset_init(slurm_cgroup_conf_t *slurm_cgroup_conf) extern int task_cgroup_cpuset_fini(slurm_cgroup_conf_t *slurm_cgroup_conf) { + xcgroup_t cpuset_cg; + + /* Similarly to task_cgroup_memory_fini(), we must lock the + * root cgroup so we don't race with another job step that is + * being started. */ + if (xcgroup_create(&cpuset_ns, &cpuset_cg,"",0,0) == XCGROUP_SUCCESS) { + if (xcgroup_lock(&cpuset_cg) == XCGROUP_SUCCESS) { + /* First move slurmstepd to the root cpuset cg + * so we can remove the step/job/user cpuset + * cg's. */ + xcgroup_move_process(&cpuset_cg, getpid()); + if (xcgroup_delete(&step_cpuset_cg) != SLURM_SUCCESS) + debug2("task/cgroup: unable to remove step " + "cpuset : %m"); + if (xcgroup_delete(&job_cpuset_cg) != XCGROUP_SUCCESS) + debug2("task/cgroup: not removing " + "job cpuset : %m"); + if (xcgroup_delete(&user_cpuset_cg) != XCGROUP_SUCCESS) + debug2("task/cgroup: not removing " + "user cpuset : %m"); + xcgroup_unlock(&cpuset_cg); + } else + error("task/cgroup: unable to lock root cpuset : %m"); + xcgroup_destroy(&cpuset_cg); + } else + error("task/cgroup: unable to create root cpuset : %m"); if (user_cgroup_path[0] != '\0') xcgroup_destroy(&user_cpuset_cg); diff --git a/src/plugins/task/cgroup/task_cgroup_devices.c b/src/plugins/task/cgroup/task_cgroup_devices.c index 2a5c00e9e5461e331d7fef83999f15a9621c6af1..583721449eac9ba3d546159fb322e2cc18510c57 100644 --- a/src/plugins/task/cgroup/task_cgroup_devices.c +++ b/src/plugins/task/cgroup/task_cgroup_devices.c @@ -113,6 +113,34 @@ error: extern int task_cgroup_devices_fini(slurm_cgroup_conf_t *slurm_cgroup_conf) { + xcgroup_t devices_cg; + + /* Similarly to task_cgroup_{memory,cpuset}_fini(), we must lock the + * root cgroup so we don't race with another job step that is + * being started. */ + if (xcgroup_create(&devices_ns, &devices_cg,"",0,0) + == XCGROUP_SUCCESS) { + if (xcgroup_lock(&devices_cg) == XCGROUP_SUCCESS) { + /* First move slurmstepd to the root devices cg + * so we can remove the step/job/user devices + * cg's. */ + xcgroup_move_process(&devices_cg, getpid()); + if (xcgroup_delete(&step_devices_cg) != SLURM_SUCCESS) + debug2("task/cgroup: unable to remove step " + "devices : %m"); + if (xcgroup_delete(&job_devices_cg) != XCGROUP_SUCCESS) + debug2("task/cgroup: not removing " + "job devices : %m"); + if (xcgroup_delete(&user_devices_cg) + != XCGROUP_SUCCESS) + debug2("task/cgroup: not removing " + "user devices : %m"); + xcgroup_unlock(&devices_cg); + } else + error("task/cgroup: unable to lock root devices : %m"); + xcgroup_destroy(&devices_cg); + } else + error("task/cgroup: unable to create root devices : %m"); if ( user_cgroup_path[0] != '\0' ) xcgroup_destroy(&user_devices_cg);