On systems that have a mixed setup of cgroup and cgroup-v2, blkio controller might be active. I think in this case there is no point in using cgroup-v2. One needs to boot with cgroup_no_v1=blkio to be able to use cgroup-v2 IO controller. Signed-off-by: Andreas Herrmann <aherrmann@xxxxxxxx> --- cgroup.c | 58 ++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 18 deletions(-) diff --git a/cgroup.c b/cgroup.c index 77e31a4d..fc31d4cd 100644 --- a/cgroup.c +++ b/cgroup.c @@ -20,11 +20,10 @@ struct cgroup_member { static struct cgroup_mnt *find_cgroup_mnt(struct thread_data *td) { - struct cgroup_mnt *cgroup_mnt = NULL; + struct cgroup_mnt *cgroup_mnt, *cg1_mnt = NULL, *cg2_mnt = NULL; struct mntent *mnt, dummy; char buf[256] = {0}; FILE *f; - bool cgroup2 = false; f = setmntent("/proc/mounts", "r"); if (!f) { @@ -34,27 +33,50 @@ static struct cgroup_mnt *find_cgroup_mnt(struct thread_data *td) while ((mnt = getmntent_r(f, &dummy, buf, sizeof(buf))) != NULL) { if (!strcmp(mnt->mnt_type, "cgroup") && - strstr(mnt->mnt_opts, "blkio")) - break; - if (!strcmp(mnt->mnt_type, "cgroup2")) { - cgroup2 = true; + strstr(mnt->mnt_opts, "blkio")) { + cg1_mnt = smalloc(sizeof(*cg1_mnt)); + if (cg1_mnt) { + cg1_mnt->path = smalloc_strdup(mnt->mnt_dir); + if (!cg1_mnt->path) { + sfree(cg1_mnt); + cg1_mnt = NULL; + log_err("fio: could not allocate memory\n"); + } + } + /* + * blkio controller has precedence + */ break; + } if (!strcmp(mnt->mnt_type, "cgroup2")) { + if (cg2_mnt) + continue; + cg2_mnt = smalloc(sizeof(*cg2_mnt)); + if (cg2_mnt) { + cg2_mnt->path = smalloc_strdup(mnt->mnt_dir); + if (!cg2_mnt->path) { + sfree(cg2_mnt); + cg2_mnt = NULL; + log_err("fio: could not allocate memory\n"); + } else + cg2_mnt->cgroup2 = true; + } + /* + * Check all mount points, there can be a mix + * of cgroup-v1 and cgroup-v2 + */ + continue; } } - 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; - } - } + cgroup_mnt = NULL; + if (cg1_mnt) { + cgroup_mnt = cg1_mnt; + if (cg2_mnt) + sfree(cg2_mnt); + } else if (cg2_mnt) { + cgroup_mnt = cg2_mnt; } else { - log_err("fio: cgroup blkio does not appear to be mounted\n"); + log_err("fio: cgroup blkio or cgroup2 do not appear to be mounted\n"); } endmntent(f); -- 2.28.0