Recent changes (master)

Jens Axboe
2018-06-30T12:00:32Z

The following changes since commit 9caaf02b06deecf0b0a13c16b6d59dddc64b8c35:

Merge branch 'doc-norandommap' of https://github.com/larrystevenwise/fio (2018-06-21 11:22:41 -0600)

are available in the git repository at:

git://git.kernel.dk/fio.git master

for you to fetch changes up to 354d50e771451f510e5886275768abb63b602798:

Fix compilation without cgroups (2018-06-29 08:00:29 -0600)

----------------------------------------------------------------
Jens Axboe (1):
Fix compilation without cgroups

Josef Bacik (2):
fio: work with cgroup2 as well
fio: add job_runtime to the thread json output

backend.c | 5 ++---
cgroup.c | 64 ++++++++++++++++++++++++++++++++++++++++++++-------------------
cgroup.h | 15 +++++++++++----
stat.c | 1 +
4 files changed, 59 insertions(+), 26 deletions(-)

---

Diff of recent changes:

diff --git a/backend.c b/backend.c
index c52eba5..a7e9184 100644
--- a/backend.c
+++ b/backend.c
@@ -50,7 +50,7 @@

static struct fio_sem *startup_sem;
static struct flist_head *cgroup_list;
-static char *cgroup_mnt;
+static struct cgroup_mnt *cgroup_mnt;
static int exit_value;
static volatile int fio_abort;
static unsigned int nr_process = 0;
@@ -1886,7 +1886,7 @@ err:
close_and_free_files(td);
cleanup_io_u(td);
close_ioengine(td);
- cgroup_shutdown(td, &cgroup_mnt);
+ cgroup_shutdown(td, cgroup_mnt);
verify_free_state(td);

if (td->zone_state_index) {
@@ -2508,7 +2508,6 @@ int fio_backend(struct sk_out *sk_out)
cgroup_kill(cgroup_list);
sfree(cgroup_list);
}
- sfree(cgroup_mnt);

fio_sem_remove(startup_sem);
stat_exit();
diff --git a/cgroup.c b/cgroup.c
index 629047b..77e31a4 100644
--- a/cgroup.c
+++ b/cgroup.c
@@ -18,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) {
@@ -35,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,
@@ -96,14 +111,14 @@ void cgroup_kill(struct flist_head *clist)
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;
}
@@ -128,22 +143,25 @@ 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;

@@ -172,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;
}
@@ -188,14 +210,18 @@ 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)
diff --git a/cgroup.h b/cgroup.h
index 0bbe25a..10313b7 100644
--- a/cgroup.h
+++ b/cgroup.h
@@ -3,21 +3,28 @@

#ifdef FIO_HAVE_CGROUPS

-int cgroup_setup(struct thread_data *, struct flist_head *, char **);
-void cgroup_shutdown(struct thread_data *, char **);
+struct cgroup_mnt {
+ char *path;
+ bool cgroup2;
+};
+
+int cgroup_setup(struct thread_data *, struct flist_head *, struct cgroup_mnt **);
+void cgroup_shutdown(struct thread_data *, struct cgroup_mnt *);

void cgroup_kill(struct flist_head *list);

#else

+struct cgroup_mnt;
+
static inline int cgroup_setup(struct thread_data *td, struct flist_head *list,
- char **mnt)
+ struct cgroup_mnt **mnt)
{
td_verror(td, EINVAL, "cgroup_setup");
return 1;
}

-static inline void cgroup_shutdown(struct thread_data *td, char **mnt)
+static inline void cgroup_shutdown(struct thread_data *td, struct cgroup_mnt *mnt)
{
}

diff --git a/stat.c b/stat.c
index d5240d9..a308eb8 100644
--- a/stat.c
+++ b/stat.c
@@ -1288,6 +1288,7 @@ static struct json_object *show_thread_status_json(struct thread_stat *ts,
usr_cpu = 0;
sys_cpu = 0;
}
+ json_object_add_value_int(root, "job_runtime", ts->total_run_time);
json_object_add_value_float(root, "usr_cpu", usr_cpu);
json_object_add_value_float(root, "sys_cpu", sys_cpu);
json_object_add_value_int(root, "ctx", ts->ctx);