/*****************************************************************************\
* jobacct_gather_cgroup_blkio.c - blkio cgroup subsystem for
* jobacct_gather/cgroup
*****************************************************************************
* Copyright (C) 2013 Bull
* Written by Martin Perry (martin.perry@bull.com) based on code from
* Matthieu Hautreux
*
* This file is part of Slurm, a resource management program.
* For details, see .
* Please also read the included file: DISCLAIMER.
*
* Slurm is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* In addition, as a special exception, the copyright holders give permission
* to link the code of portions of this program with the OpenSSL library under
* certain conditions as described in each individual source file, and
* distribute linked combinations including the two. You must obey the GNU
* General Public License in all respects for all of the code used other than
* OpenSSL. If you modify file(s) with this exception, you may extend this
* exception to your version of the file(s), but you are not obligated to do
* so. If you do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source files in
* the program, then also delete it here.
*
* Slurm is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along
* with Slurm; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
\*****************************************************************************/
/* FIXME: Enable when kernel support is ready. */
/* #include */
/* #include /\* getenv *\/ */
/* #include */
/* #include "slurm/slurm_errno.h" */
/* #include "slurm/slurm.h" */
/* #include "src/common/xstring.h" */
/* #include "src/plugins/jobacct_gather/cgroup/jobacct_gather_cgroup.h" */
/* #include "src/slurmd/slurmstepd/slurmstepd_job.h" */
/* #include "src/slurmd/slurmd/slurmd.h" */
/* static char user_cgroup_path[PATH_MAX]; */
/* static char job_cgroup_path[PATH_MAX]; */
/* static char jobstep_cgroup_path[PATH_MAX]; */
/* static char task_cgroup_path[PATH_MAX]; */
/* static xcgroup_ns_t blkio_ns; */
/* static xcgroup_t user_blkio_cg; */
/* static xcgroup_t job_blkio_cg; */
/* static xcgroup_t step_blkio_cg; */
/* xcgroup_t task_blkio_cg; */
/* extern int jobacct_gather_cgroup_blkio_init(void) */
/* { */
/* /\* initialize user/job/jobstep cgroup relative paths *\/ */
/* user_cgroup_path[0]='\0'; */
/* job_cgroup_path[0]='\0'; */
/* jobstep_cgroup_path[0]='\0'; */
/* /\* initialize blkio cgroup namespace *\/ */
/* if (xcgroup_ns_create(&blkio_ns, "", "blkio") */
/* != XCGROUP_SUCCESS) { */
/* error("jobacct_gather/cgroup: unable to create blkio " */
/* "namespace"); */
/* return SLURM_ERROR; */
/* } */
/* return SLURM_SUCCESS; */
/* } */
/* extern int jobacct_gather_cgroup_blkio_fini(void) */
/* { */
/* if (user_cgroup_path[0] == '\0' || */
/* job_cgroup_path[0] == '\0' || */
/* jobstep_cgroup_path[0] == '\0') */
/* return SLURM_SUCCESS; */
/* xcgroup_destroy(&user_blkio_cg); */
/* xcgroup_destroy(&job_blkio_cg); */
/* xcgroup_destroy(&step_blkio_cg); */
/* user_cgroup_path[0]='\0'; */
/* job_cgroup_path[0]='\0'; */
/* jobstep_cgroup_path[0]='\0'; */
/* xcgroup_ns_destroy(&blkio_ns); */
/* return SLURM_SUCCESS; */
/* } */
/* extern int jobacct_gather_cgroup_blkio_attach_task( */
/* pid_t pid, jobacct_id_t *jobacct_id) */
/* { */
/* xcgroup_t blkio_cg; */
/* stepd_step_rec_t *job; */
/* uid_t uid; */
/* gid_t gid; */
/* uint32_t jobid; */
/* uint32_t stepid; */
/* uint32_t taskid; */
/* int fstatus = SLURM_SUCCESS; */
/* int rc; */
/* char* slurm_cgpath; */
/* job = jobacct_id->job; */
/* uid = job->uid; */
/* gid = job->gid; */
/* stepid = job->stepid; */
/* taskid = jobacct_id->taskid; */
/* if (job->pack_jobid && (job->pack_jobid != NO_VAL)) */
/* jobid = job->pack_jobid; */
/* else */
/* jobid = job->jobid; */
/* /\* create slurm root cg in this cg namespace *\/ */
/* slurm_cgpath = jobacct_cgroup_create_slurm_cg(&blkio_ns); */
/* if (!slurm_cgpath) { */
/* return SLURM_ERROR; */
/* } */
/* /\* build user cgroup relative path if not set (should not be) *\/ */
/* if (*user_cgroup_path == '\0') { */
/* if (snprintf(user_cgroup_path, PATH_MAX, */
/* "%s/uid_%u", slurm_cgpath, uid) >= PATH_MAX) { */
/* error("unable to build uid %u cgroup relative " */
/* "path : %m", uid); */
/* xfree(slurm_cgpath); */
/* return SLURM_ERROR; */
/* } */
/* } */
/* /\* build job cgroup relative path if not set (may not be) *\/ */
/* if (*job_cgroup_path == '\0') { */
/* if (snprintf(job_cgroup_path, PATH_MAX, "%s/job_%u", */
/* user_cgroup_path, jobid) >= PATH_MAX) { */
/* error("jobacct_gather/cgroup: unable to build job %u " */
/* "blkio cg relative path : %m", jobid); */
/* return SLURM_ERROR; */
/* } */
/* } */
/* /\* build job step cgroup relative path if not set (may not be) *\/ */
/* if (*jobstep_cgroup_path == '\0') { */
/* int len; */
/* if (stepid == SLURM_BATCH_SCRIPT) { */
/* len = snprintf(jobstep_cgroup_path, PATH_MAX, */
/* "%s/step_batch", job_cgroup_path); */
/* } else if (stepid == SLURM_EXTERN_CONT) { */
/* len = snprintf(jobstep_cgroup_path, PATH_MAX, */
/* "%s/step_extern", job_cgroup_path); */
/* } else { */
/* len = snprintf(jobstep_cgroup_path, PATH_MAX, */
/* "%s/step_%u", */
/* job_cgroup_path, stepid); */
/* } */
/* if (len >= PATH_MAX) { */
/* error("jobacct_gather/cgroup: unable to build job step " */
/* "%u.%u blkio cg relative path : %m", */
/* jobid, stepid); */
/* return SLURM_ERROR; */
/* } */
/* } */
/* /\* build task cgroup relative path *\/ */
/* if (snprintf(task_cgroup_path, PATH_MAX, "%s/task_%u", */
/* jobstep_cgroup_path, taskid) >= PATH_MAX) { */
/* error("jobacct_gather/cgroup: unable to build task %u " */
/* "blkio cg relative path : %m", taskid); */
/* return SLURM_ERROR; */
/* } */
/* fstatus = SLURM_SUCCESS; */
/* /\* */
/* * create blkio root cg and lock it */
/* * */
/* * we will keep the lock until the end to avoid the effect of a release */
/* * agent that would remove an existing cgroup hierarchy while we are */
/* * setting it up. As soon as the step cgroup is created, we can release */
/* * the lock. */
/* * Indeed, consecutive slurm steps could result in cg being removed */
/* * between the next EEXIST instantiation and the first addition of */
/* * a task. The release_agent will have to lock the root blkio cgroup */
/* * to avoid this scenario. */
/* *\/ */
/* if (xcgroup_create(&blkio_ns, &blkio_cg, "", 0, 0) */
/* != XCGROUP_SUCCESS) { */
/* error("jobacct_gather/cgroup: unable to create root blkio " */
/* "xcgroup"); */
/* return SLURM_ERROR; */
/* } */
/* if (xcgroup_lock(&blkio_cg) != XCGROUP_SUCCESS) { */
/* xcgroup_destroy(&blkio_cg); */
/* error("jobacct_gather/cgroup: unable to lock root blkio cg"); */
/* return SLURM_ERROR; */
/* } */
/* /\* */
/* * Create user cgroup in the blkio ns (it could already exist) */
/* *\/ */
/* if (xcgroup_create(&blkio_ns, &user_blkio_cg, */
/* user_cgroup_path, */
/* uid, gid) != XCGROUP_SUCCESS) { */
/* error("jobacct_gather/cgroup: unable to create user %u blkio " */
/* "cgroup", uid); */
/* fstatus = SLURM_ERROR; */
/* goto error; */
/* } */
/* if (xcgroup_instantiate(&user_blkio_cg) != XCGROUP_SUCCESS) { */
/* xcgroup_destroy(&user_blkio_cg); */
/* error("jobacct_gather/cgroup: unable to instantiate user %u " */
/* "blkio cgroup", uid); */
/* fstatus = SLURM_ERROR; */
/* goto error; */
/* } */
/* /\* */
/* * Create job cgroup in the blkio ns (it could already exist) */
/* *\/ */
/* if (xcgroup_create(&blkio_ns, &job_blkio_cg, */
/* job_cgroup_path, */
/* uid, gid) != XCGROUP_SUCCESS) { */
/* xcgroup_destroy(&user_blkio_cg); */
/* error("jobacct_gather/cgroup: unable to create job %u blkio " */
/* "cgroup", jobid); */
/* fstatus = SLURM_ERROR; */
/* goto error; */
/* } */
/* if (xcgroup_instantiate(&job_blkio_cg) != XCGROUP_SUCCESS) { */
/* xcgroup_destroy(&user_blkio_cg); */
/* xcgroup_destroy(&job_blkio_cg); */
/* error("jobacct_gather/cgroup: unable to instantiate job %u " */
/* "blkio cgroup", jobid); */
/* fstatus = SLURM_ERROR; */
/* goto error; */
/* } */
/* /\* */
/* * Create step cgroup in the blkio ns (it could already exist) */
/* *\/ */
/* if (xcgroup_create(&blkio_ns, &step_blkio_cg, */
/* jobstep_cgroup_path, */
/* uid, gid) != XCGROUP_SUCCESS) { */
/* /\* do not delete user/job cgroup as they can exist for other */
/* * steps, but release cgroup structures *\/ */
/* xcgroup_destroy(&user_blkio_cg); */
/* xcgroup_destroy(&job_blkio_cg); */
/* error("jobacct_gather/cgroup: unable to create jobstep %u.%u " */
/* "blkio cgroup", jobid, stepid); */
/* fstatus = SLURM_ERROR; */
/* goto error; */
/* } */
/* if (xcgroup_instantiate(&step_blkio_cg) != XCGROUP_SUCCESS) { */
/* xcgroup_destroy(&user_blkio_cg); */
/* xcgroup_destroy(&job_blkio_cg); */
/* xcgroup_destroy(&step_blkio_cg); */
/* error("jobacct_gather/cgroup: unable to instantiate jobstep " */
/* "%u.%u blkio cgroup", jobid, stepid); */
/* fstatus = SLURM_ERROR; */
/* goto error; */
/* } */
/* /\* */
/* * Create task cgroup in the blkio ns */
/* *\/ */
/* if (xcgroup_create(&blkio_ns, &task_blkio_cg, */
/* task_cgroup_path, */
/* uid, gid) != XCGROUP_SUCCESS) { */
/* /\* do not delete user/job cgroup as they can exist for other */
/* * steps, but release cgroup structures *\/ */
/* xcgroup_destroy(&user_blkio_cg); */
/* xcgroup_destroy(&job_blkio_cg); */
/* error("jobacct_gather/cgroup: unable to create jobstep %u.%u " */
/* "task %u blkio cgroup", jobid, stepid, taskid); */
/* fstatus = SLURM_ERROR; */
/* goto error; */
/* } */
/* if (xcgroup_instantiate(&task_blkio_cg) != XCGROUP_SUCCESS) { */
/* xcgroup_destroy(&user_blkio_cg); */
/* xcgroup_destroy(&job_blkio_cg); */
/* xcgroup_destroy(&step_blkio_cg); */
/* error("jobacct_gather/cgroup: unable to instantiate jobstep " */
/* "%u.%u task %u blkio cgroup", jobid, stepid, taskid); */
/* fstatus = SLURM_ERROR; */
/* goto error; */
/* } */
/* /\* */
/* * Attach the slurmstepd to the task blkio cgroup */
/* *\/ */
/* rc = xcgroup_add_pids(&task_blkio_cg, &pid, 1); */
/* if (rc != XCGROUP_SUCCESS) { */
/* error("jobacct_gather/cgroup: unable to add slurmstepd to " */
/* "blkio cg '%s'", task_blkio_cg.path); */
/* fstatus = SLURM_ERROR; */
/* } else */
/* fstatus = SLURM_SUCCESS; */
/* error: */
/* xcgroup_unlock(&blkio_cg); */
/* xcgroup_destroy(&blkio_cg); */
/* return fstatus; */
/* } */