From 39f22027248f658ade599e89c2fe6afae02ac9d7 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Fri, 4 Dec 2009 11:29:12 +0100 Subject: [PATCH] Better support for setting up and removing private cgroups Signed-off-by: Jens Axboe --- cgroup.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++---------- cgroup.h | 6 ++++ fio.c | 2 ++ fio.h | 1 - 4 files changed, 81 insertions(+), 17 deletions(-) diff --git a/cgroup.c b/cgroup.c index 548740a0..b0c7ea20 100644 --- a/cgroup.c +++ b/cgroup.c @@ -4,7 +4,59 @@ #include #include #include "fio.h" +#include "flist.h" #include "cgroup.h" +#include "smalloc.h" + +static struct flist_head *cgroup_list; +static struct fio_mutex *lock; + +struct cgroup_member { + struct flist_head list; + char *root; +}; + +static void add_cgroup(const char *name) +{ + struct cgroup_member *cm; + + cm = smalloc(sizeof(*cm)); + INIT_FLIST_HEAD(&cm->list); + cm->root = smalloc_strdup(name); + + fio_mutex_down(lock); + + if (!cgroup_list) { + cgroup_list = smalloc(sizeof(struct flist_head)); + INIT_FLIST_HEAD(cgroup_list); + } + + flist_add_tail(&cm->list, cgroup_list); + fio_mutex_up(lock); +} + +void cgroup_kill(void) +{ + struct flist_head *n, *tmp; + struct cgroup_member *cm; + + fio_mutex_down(lock); + if (!cgroup_list) + goto out; + + flist_for_each_safe(n, tmp, cgroup_list) { + cm = flist_entry(n, struct cgroup_member, list); + rmdir(cm->root); + flist_del(&cm->list); + sfree(cm->root); + sfree(cm); + } + + sfree(cgroup_list); + cgroup_list = NULL; +out: + fio_mutex_up(lock); +} /* * Check if the given root appears valid @@ -40,7 +92,6 @@ static int cgroup_add_pid(struct thread_data *td) root = get_cgroup_root(td); sprintf(tmp, "%s/tasks", root); - f = fopen(tmp, "w"); if (!f) { td_verror(td, errno, "cgroup open tasks"); @@ -97,17 +148,20 @@ int cgroup_setup(struct thread_data *td) return 1; } } else - td->o.cgroup_was_created = 1; + add_cgroup(root); - sprintf(tmp, "%s/blkio.weight", root); - f = fopen(tmp, "w"); - if (!f) { - td_verror(td, errno, "cgroup open weight"); - return 1; + if (td->o.cgroup_weight) { + sprintf(tmp, "%s/blkio.weight", root); + f = fopen(tmp, "w"); + if (!f) { + td_verror(td, errno, "cgroup open weight"); + return 1; + } + + fprintf(f, "%d", td->o.cgroup_weight); + fclose(f); } - fprintf(f, "%d", td->o.cgroup_weight); - fclose(f); free(root); if (cgroup_add_pid(td)) @@ -120,16 +174,19 @@ void cgroup_shutdown(struct thread_data *td) { if (cgroup_check_fs(td)) return; - if (!td->o.cgroup_weight) + if (!td->o.cgroup_weight && td->o.cgroup) return; cgroup_del_pid(td); +} - if (td->o.cgroup_was_created) { - char *root; - root = get_cgroup_root(td); - rmdir(root); - free(root); - } +static void fio_init cgroup_init(void) +{ + lock = fio_mutex_init(1); +} + +static void fio_exit cgroup_exit(void) +{ + fio_mutex_remove(lock); } diff --git a/cgroup.h b/cgroup.h index 65fa3ad1..1c67ba80 100644 --- a/cgroup.h +++ b/cgroup.h @@ -6,6 +6,8 @@ int cgroup_setup(struct thread_data *td); void cgroup_shutdown(struct thread_data *td); +void cgroup_kill(void); + #else static inline int cgroup_setup(struct thread_data *td) @@ -18,5 +20,9 @@ static inline void cgroup_shutdown(struct thread_data *td) { } +void cgroup_kill(void) +{ +} + #endif #endif diff --git a/fio.c b/fio.c index 4bbab5af..a18ca1b6 100644 --- a/fio.c +++ b/fio.c @@ -1668,6 +1668,8 @@ int main(int argc, char *argv[]) } } + cgroup_kill(); + fio_mutex_remove(startup_mutex); fio_mutex_remove(writeout_mutex); return exit_value; diff --git a/fio.h b/fio.h index aa5124cd..17aeaada 100644 --- a/fio.h +++ b/fio.h @@ -278,7 +278,6 @@ struct thread_options { char *cgroup_root; char *cgroup; unsigned int cgroup_weight; - unsigned int cgroup_was_created; }; #define FIO_VERROR_SIZE 128 -- 2.25.1