X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=cgroup.c;h=77e31a4d0e222fd4f03ccbccb92a48a7c1457d9a;hp=de00d986eb05246b25e853c3af524149f1b53e22;hb=ce4d13ca162df4127ec3b5911553802c53396705;hpb=599e72b74ed2c44fd846b95160c5037c16438994 diff --git a/cgroup.c b/cgroup.c index de00d986..77e31a4d 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; @@ -19,12 +18,13 @@ struct cgroup_member { unsigned int cgroup_nodelete; }; -static char *find_cgroup_mnt(struct thread_data *td) +static struct cgroup_mnt *find_cgroup_mnt(struct thread_data *td) { - char *mntpoint = NULL; + struct cgroup_mnt *cgroup_mnt = NULL; struct mntent *mnt, dummy; char buf[256] = {0}; FILE *f; + bool cgroup2 = false; f = setmntent("/proc/mounts", "r"); if (!f) { @@ -36,15 +36,29 @@ static char *find_cgroup_mnt(struct thread_data *td) if (!strcmp(mnt->mnt_type, "cgroup") && strstr(mnt->mnt_opts, "blkio")) break; + if (!strcmp(mnt->mnt_type, "cgroup2")) { + cgroup2 = true; + break; + } } - if (mnt) - mntpoint = smalloc_strdup(mnt->mnt_dir); - else + if (mnt) { + cgroup_mnt = smalloc(sizeof(*cgroup_mnt)); + if (cgroup_mnt) { + cgroup_mnt->path = smalloc_strdup(mnt->mnt_dir); + if (!cgroup_mnt->path) { + sfree(cgroup_mnt); + log_err("fio: could not allocate memory\n"); + } else { + cgroup_mnt->cgroup2 = cgroup2; + } + } + } else { log_err("fio: cgroup blkio does not appear to be mounted\n"); + } endmntent(f); - return mntpoint; + return cgroup_mnt; } static void add_cgroup(struct thread_data *td, const char *name, @@ -52,14 +66,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) @@ -67,7 +94,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); @@ -78,17 +108,17 @@ 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) +static char *get_cgroup_root(struct thread_data *td, struct cgroup_mnt *mnt) { char *str = malloc(64); if (td->o.cgroup) - sprintf(str, "%s/%s", mnt, td->o.cgroup); + sprintf(str, "%s/%s", mnt->path, td->o.cgroup); else - sprintf(str, "%s/%s", mnt, td->o.name); + sprintf(str, "%s/%s", mnt->path, td->o.name); return str; } @@ -99,7 +129,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) { @@ -113,25 +143,31 @@ static int write_int_to_file(struct thread_data *td, const char *path, } -static int cgroup_write_pid(struct thread_data *td, const char *root) +static int cgroup_write_pid(struct thread_data *td, char *path, bool cgroup2) { unsigned int val = td->pid; - return write_int_to_file(td, root, "tasks", val, "cgroup write pid"); + if (cgroup2) + return write_int_to_file(td, path, "cgroup.procs", + val, "cgroup write pid"); + return write_int_to_file(td, path, "tasks", val, "cgroup write pid"); } /* * Move pid to root class */ -static int cgroup_del_pid(struct thread_data *td, char *mnt) +static int cgroup_del_pid(struct thread_data *td, struct cgroup_mnt *mnt) { - return cgroup_write_pid(td, mnt); + return cgroup_write_pid(td, mnt->path, mnt->cgroup2); } -int cgroup_setup(struct thread_data *td, struct flist_head *clist, char **mnt) +int cgroup_setup(struct thread_data *td, struct flist_head *clist, struct cgroup_mnt **mnt) { char *root; + if (!clist) + return 1; + if (!*mnt) { *mnt = find_cgroup_mnt(td); if (!*mnt) @@ -154,13 +190,17 @@ int cgroup_setup(struct thread_data *td, struct flist_head *clist, char **mnt) add_cgroup(td, root, clist); if (td->o.cgroup_weight) { + if ((*mnt)->cgroup2) { + log_err("fio: cgroup weit doesn't work with cgroup2\n"); + goto err; + } if (write_int_to_file(td, root, "blkio.weight", td->o.cgroup_weight, "cgroup open weight")) goto err; } - if (!cgroup_write_pid(td, root)) { + if (!cgroup_write_pid(td, root, (*mnt)->cgroup2)) { free(root); return 0; } @@ -170,22 +210,28 @@ err: return 1; } -void cgroup_shutdown(struct thread_data *td, char **mnt) +void cgroup_shutdown(struct thread_data *td, struct cgroup_mnt *mnt) { - if (*mnt == NULL) + if (mnt == NULL) return; if (!td->o.cgroup_weight && !td->o.cgroup) - return; + goto out; - cgroup_del_pid(td, *mnt); + cgroup_del_pid(td, mnt); +out: + if (mnt->path) + sfree(mnt->path); + sfree(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); }