X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=cgroup.c;h=29d89dd3e316c4ec8c6dfc385488129beb6f193a;hb=ed81ee199ec8f3cdfcdc78ff067a0397c3b02f5f;hp=b0c7ea2003ac1a78937c45d562a57809fdd4e739;hpb=39f22027248f658ade599e89c2fe6afae02ac9d7;p=fio.git diff --git a/cgroup.c b/cgroup.c index b0c7ea20..29d89dd3 100644 --- a/cgroup.c +++ b/cgroup.c @@ -8,7 +8,6 @@ #include "cgroup.h" #include "smalloc.h" -static struct flist_head *cgroup_list; static struct fio_mutex *lock; struct cgroup_member { @@ -16,7 +15,7 @@ struct cgroup_member { char *root; }; -static void add_cgroup(const char *name) +static void add_cgroup(const char *name, struct flist_head *clist) { struct cgroup_member *cm; @@ -25,26 +24,18 @@ static void add_cgroup(const char *name) 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); + flist_add_tail(&cm->list, clist); fio_mutex_up(lock); } -void cgroup_kill(void) +void cgroup_kill(struct flist_head *clist) { 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) { + flist_for_each_safe(n, tmp, clist) { cm = flist_entry(n, struct cgroup_member, list); rmdir(cm->root); flist_del(&cm->list); @@ -52,9 +43,6 @@ void cgroup_kill(void) sfree(cm); } - sfree(cgroup_list); - cgroup_list = NULL; -out: fio_mutex_up(lock); } @@ -82,26 +70,31 @@ static char *get_cgroup_root(struct thread_data *td) return str; } -/* - * Add pid to given class - */ -static int cgroup_add_pid(struct thread_data *td) +static int write_int_to_file(struct thread_data *td, const char *path, + const char *filename, unsigned int val, + const char *onerr) { - char *root, tmp[256]; + char tmp[256]; FILE *f; - - root = get_cgroup_root(td); - sprintf(tmp, "%s/tasks", root); + + sprintf(tmp, "%s/%s", path, filename); f = fopen(tmp, "w"); if (!f) { - td_verror(td, errno, "cgroup open tasks"); + td_verror(td, errno, onerr); return 1; } - fprintf(f, "%d", td->pid); + fprintf(f, "%u", val); fclose(f); - free(root); return 0; + +} + +static int cgroup_write_pid(struct thread_data *td, const char *root) +{ + unsigned int val = td->pid; + + return write_int_to_file(td, root, "tasks", val, "cgroup write pid"); } /* @@ -109,26 +102,12 @@ static int cgroup_add_pid(struct thread_data *td) */ static int cgroup_del_pid(struct thread_data *td) { - char tmp[256]; - FILE *f; - - sprintf(tmp, "%s/tasks", td->o.cgroup_root); - f = fopen(tmp, "w"); - if (!f) { - td_verror(td, errno, "cgroup open tasks"); - return 1; - } - - fprintf(f, "%d", td->pid); - fclose(f); - return 0; + return cgroup_write_pid(td, td->o.cgroup_root); } - -int cgroup_setup(struct thread_data *td) +int cgroup_setup(struct thread_data *td, struct flist_head *clist) { - char *root, tmp[256]; - FILE *f; + char *root; if (cgroup_check_fs(td)) { log_err("fio: blkio cgroup mount point %s not valid\n", @@ -145,42 +124,38 @@ int cgroup_setup(struct thread_data *td) if (__e != EEXIST) { td_verror(td, __e, "cgroup mkdir"); - return 1; + goto err; } } else - add_cgroup(root); + add_cgroup(root, clist); 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; - } + if (write_int_to_file(td, root, "blkio.weight", + td->o.cgroup_weight, + "cgroup open weight")) + goto err; + } - fprintf(f, "%d", td->o.cgroup_weight); - fclose(f); + if (!cgroup_write_pid(td, root)) { + free(root); + return 0; } +err: free(root); - - if (cgroup_add_pid(td)) - return 1; - - return 0; + return 1; } void cgroup_shutdown(struct thread_data *td) { if (cgroup_check_fs(td)) return; - if (!td->o.cgroup_weight && td->o.cgroup) + if (!td->o.cgroup_weight && !td->o.cgroup) return; cgroup_del_pid(td); } - static void fio_init cgroup_init(void) { lock = fio_mutex_init(1);