X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=cgroup.c;h=629047b495b33c145ca545ac4856efdecaf78df5;hb=1612c4a5eea3bc09f6f94115b028320bbc32ce4b;hp=f36683aeacf311561c6ba768565361c547fcd9bf;hpb=983a69d71e6f9c0c8f590f24d492f9efba19232b;p=fio.git diff --git a/cgroup.c b/cgroup.c index f36683ae..629047b4 100644 --- a/cgroup.c +++ b/cgroup.c @@ -5,13 +5,12 @@ #include #include #include -#include #include "fio.h" #include "flist.h" #include "cgroup.h" #include "smalloc.h" -static struct fio_mutex *lock; +static struct fio_sem *lock; struct cgroup_member { struct flist_head list; @@ -22,7 +21,8 @@ struct cgroup_member { 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"); @@ -31,7 +31,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; @@ -51,14 +51,27 @@ static void add_cgroup(struct thread_data *td, const char *name, { 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); + fio_sem_down(lock); flist_add_tail(&cm->list, clist); - fio_mutex_up(lock); + fio_sem_up(lock); } void cgroup_kill(struct flist_head *clist) @@ -66,7 +79,10 @@ void cgroup_kill(struct flist_head *clist) struct flist_head *n, *tmp; struct cgroup_member *cm; - fio_mutex_down(lock); + if (!lock) + return; + + fio_sem_down(lock); flist_for_each_safe(n, tmp, clist) { cm = flist_entry(n, struct cgroup_member, list); @@ -77,7 +93,7 @@ void cgroup_kill(struct flist_head *clist) sfree(cm); } - fio_mutex_up(lock); + fio_sem_up(lock); } static char *get_cgroup_root(struct thread_data *td, char *mnt) @@ -98,7 +114,7 @@ static int write_int_to_file(struct thread_data *td, const char *path, { char tmp[256]; FILE *f; - + sprintf(tmp, "%s/%s", path, filename); f = fopen(tmp, "w"); if (!f) { @@ -131,6 +147,9 @@ int cgroup_setup(struct thread_data *td, struct flist_head *clist, char **mnt) { char *root; + if (!clist) + return 1; + if (!*mnt) { *mnt = find_cgroup_mnt(td); if (!*mnt) @@ -181,10 +200,12 @@ void cgroup_shutdown(struct thread_data *td, char **mnt) static void fio_init cgroup_init(void) { - lock = fio_mutex_init(1); + lock = fio_sem_init(FIO_SEM_UNLOCKED); + if (!lock) + log_err("fio: failed to allocate cgroup lock\n"); } static void fio_exit cgroup_exit(void) { - fio_mutex_remove(lock); + fio_sem_remove(lock); }