static int exit_value;
static struct itimerval itimer;
static pthread_t gtod_thread;
+static struct flist_head *cgroup_list;
+static char *cgroup_mnt;
struct io_log *agg_io_log[2];
static void sig_int(int sig)
{
if (threads) {
- printf("\nfio: terminating on signal %d\n", sig);
+ log_info("\nfio: terminating on signal %d\n", sig);
fflush(stdout);
terminate_threads(TERMINATE_ALL);
}
*/
fio_mutex_remove(td->mutex);
+ if (td->o.uid != -1U && setuid(td->o.uid)) {
+ td_verror(td, errno, "setuid");
+ goto err;
+ }
+ if (td->o.gid != -1U && setgid(td->o.gid)) {
+ td_verror(td, errno, "setgid");
+ goto err;
+ }
+
/*
* May alter parameters that init_io_u() will use, so we need to
* do this first.
}
}
- if (td->o.cgroup_weight && cgroup_setup(td))
+ if (td->o.cgroup_weight && cgroup_setup(td, cgroup_list, &cgroup_mnt))
goto err;
if (nice(td->o.nice) == -1) {
err:
if (td->error)
- printf("fio: pid=%d, err=%d/%s\n", (int) td->pid, td->error,
+ log_info("fio: pid=%d, err=%d/%s\n", (int) td->pid, td->error,
td->verror);
if (td->o.verify_async)
close_and_free_files(td);
close_ioengine(td);
cleanup_io_u(td);
- cgroup_shutdown(td);
+ cgroup_shutdown(td, &cgroup_mnt);
if (td->o.cpumask_set) {
int ret = fio_cpuset_exit(&td->o.cpumask);
return;
if (!terse_output) {
- printf("Starting ");
+ log_info("Starting ");
if (nr_thread)
- printf("%d thread%s", nr_thread,
+ log_info("%d thread%s", nr_thread,
nr_thread > 1 ? "s" : "");
if (nr_process) {
if (nr_thread)
printf(" and ");
- printf("%d process%s", nr_process,
+ log_info("%d process%s", nr_process,
nr_process > 1 ? "es" : "");
}
- printf("\n");
+ log_info("\n");
fflush(stdout);
}
status_timer_arm();
+ cgroup_list = smalloc(sizeof(*cgroup_list));
+ INIT_FLIST_HEAD(cgroup_list);
+
run_threads();
if (!fio_abort) {
}
}
- cgroup_kill();
+ cgroup_kill(cgroup_list);
+ sfree(cgroup_list);
+ if (cgroup_mnt)
+ sfree(cgroup_mnt);
fio_mutex_remove(startup_mutex);
fio_mutex_remove(writeout_mutex);