X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=cgroup.c;h=34b61ded08d0fa5e22527012c979e31163b1b8ec;hp=14bbc57bd0862a46cac3ea0fbd9162288c77341f;hb=f6cbf8ac4f70c800bbbfc23c5dcf44ed619c0acc;hpb=6adb38a1a1cbe95f7131815416c8bb31683c3f47 diff --git a/cgroup.c b/cgroup.c index 14bbc57b..34b61ded 100644 --- a/cgroup.c +++ b/cgroup.c @@ -4,6 +4,8 @@ #include #include #include +#include +#include #include "fio.h" #include "flist.h" #include "cgroup.h" @@ -14,12 +16,14 @@ static struct fio_mutex *lock; struct cgroup_member { struct flist_head list; char *root; + unsigned int cgroup_nodelete; }; static char *find_cgroup_mnt(struct thread_data *td) { char *mntpoint = NULL; - struct mntent *mnt; + struct mntent *mnt, dummy; + char buf[256] = {0}; FILE *f; f = setmntent("/proc/mounts", "r"); @@ -28,7 +32,7 @@ static char *find_cgroup_mnt(struct thread_data *td) return NULL; } - while ((mnt = getmntent(f)) != NULL) { + while ((mnt = getmntent_r(f, &dummy, buf, sizeof(buf))) != NULL) { if (!strcmp(mnt->mnt_type, "cgroup") && strstr(mnt->mnt_opts, "blkio")) break; @@ -43,14 +47,29 @@ static char *find_cgroup_mnt(struct thread_data *td) return mntpoint; } -static void add_cgroup(const char *name, struct flist_head *clist) +static void add_cgroup(struct thread_data *td, const char *name, + struct flist_head *clist) { struct cgroup_member *cm; + if (!lock) + return; + cm = smalloc(sizeof(*cm)); + if (!cm) { +err: + log_err("fio: failed to allocate cgroup member\n"); + return; + } + INIT_FLIST_HEAD(&cm->list); cm->root = smalloc_strdup(name); - + if (!cm->root) { + sfree(cm); + goto err; + } + if (td->o.cgroup_nodelete) + cm->cgroup_nodelete = 1; fio_mutex_down(lock); flist_add_tail(&cm->list, clist); fio_mutex_up(lock); @@ -61,11 +80,15 @@ void cgroup_kill(struct flist_head *clist) struct flist_head *n, *tmp; struct cgroup_member *cm; + if (!lock) + return; + fio_mutex_down(lock); flist_for_each_safe(n, tmp, clist) { cm = flist_entry(n, struct cgroup_member, list); - rmdir(cm->root); + if (!cm->cgroup_nodelete) + rmdir(cm->root); flist_del(&cm->list); sfree(cm->root); sfree(cm); @@ -79,9 +102,9 @@ static char *get_cgroup_root(struct thread_data *td, char *mnt) char *str = malloc(64); if (td->o.cgroup) - sprintf(str, "%s/%s", mnt, td->o.cgroup); + sprintf(str, "%s%s%s", mnt, FIO_OS_PATH_SEPARATOR, td->o.cgroup); else - sprintf(str, "%s/%s", mnt, td->o.name); + sprintf(str, "%s%s%s", mnt, FIO_OS_PATH_SEPARATOR, td->o.name); return str; } @@ -92,8 +115,8 @@ static int write_int_to_file(struct thread_data *td, const char *path, { char tmp[256]; FILE *f; - - sprintf(tmp, "%s/%s", path, filename); + + sprintf(tmp, "%s%s%s", path, FIO_OS_PATH_SEPARATOR, filename); f = fopen(tmp, "w"); if (!f) { td_verror(td, errno, onerr); @@ -144,7 +167,7 @@ int cgroup_setup(struct thread_data *td, struct flist_head *clist, char **mnt) goto err; } } else - add_cgroup(root, clist); + add_cgroup(td, root, clist); if (td->o.cgroup_weight) { if (write_int_to_file(td, root, "blkio.weight", @@ -175,7 +198,9 @@ void cgroup_shutdown(struct thread_data *td, char **mnt) static void fio_init cgroup_init(void) { - lock = fio_mutex_init(1); + lock = fio_mutex_init(FIO_MUTEX_UNLOCKED); + if (!lock) + log_err("fio: failed to allocate cgroup lock\n"); } static void fio_exit cgroup_exit(void)