projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Include juggling
[fio.git]
/
fio.c
diff --git
a/fio.c
b/fio.c
index ba9e384b6609950a8c500dab96de39d0c8bce904..728addd614e70aafa2548a7914619052abe06d9f 100644
(file)
--- a/
fio.c
+++ b/
fio.c
@@
-39,6
+39,7
@@
#include "smalloc.h"
#include "verify.h"
#include "diskutil.h"
#include "smalloc.h"
#include "verify.h"
#include "diskutil.h"
+#include "cgroup.h"
unsigned long page_mask;
unsigned long page_size;
unsigned long page_mask;
unsigned long page_size;
@@
-60,6
+61,8
@@
static volatile int fio_abort;
static int exit_value;
static struct itimerval itimer;
static pthread_t gtod_thread;
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];
struct io_log *agg_io_log[2];
@@
-536,7
+539,8
@@
sync_done:
*/
full = queue_full(td) || ret == FIO_Q_BUSY;
if (full || !td->o.iodepth_batch_complete) {
*/
full = queue_full(td) || ret == FIO_Q_BUSY;
if (full || !td->o.iodepth_batch_complete) {
- min_events = td->o.iodepth_batch_complete;
+ min_events = min(td->o.iodepth_batch_complete,
+ td->cur_depth);
if (full && !min_events)
min_events = 1;
if (full && !min_events)
min_events = 1;
@@
-581,7
+585,8
@@
static void do_io(struct thread_data *td)
else
td_set_runstate(td, TD_RUNNING);
else
td_set_runstate(td, TD_RUNNING);
- while ((td->this_io_bytes[0] + td->this_io_bytes[1]) < td->o.size) {
+ while ( (td->o.read_iolog_file && !flist_empty(&td->io_log_list)) ||
+ ((td->this_io_bytes[0] + td->this_io_bytes[1]) < td->o.size) ) {
struct timeval comp_time;
unsigned long bytes_done[2] = { 0, 0 };
int min_evts = 0;
struct timeval comp_time;
unsigned long bytes_done[2] = { 0, 0 };
int min_evts = 0;
@@
-606,7
+611,8
@@
static void do_io(struct thread_data *td)
* Add verification end_io handler, if asked to verify
* a previously written file.
*/
* Add verification end_io handler, if asked to verify
* a previously written file.
*/
- if (td->o.verify != VERIFY_NONE && io_u->ddir == DDIR_READ) {
+ if (td->o.verify != VERIFY_NONE && io_u->ddir == DDIR_READ &&
+ !td_rw(td)) {
if (td->o.verify_async)
io_u->end_io = verify_io_u_async;
else
if (td->o.verify_async)
io_u->end_io = verify_io_u_async;
else
@@
-686,7
+692,8
@@
sync_done:
*/
full = queue_full(td) || ret == FIO_Q_BUSY;
if (full || !td->o.iodepth_batch_complete) {
*/
full = queue_full(td) || ret == FIO_Q_BUSY;
if (full || !td->o.iodepth_batch_complete) {
- min_evts = td->o.iodepth_batch_complete;
+ min_evts = min(td->o.iodepth_batch_complete,
+ td->cur_depth);
if (full && !min_evts)
min_evts = 1;
if (full && !min_evts)
min_evts = 1;
@@
-1034,6
+1041,15
@@
static void *thread_main(void *data)
*/
fio_mutex_remove(td->mutex);
*/
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.
/*
* May alter parameters that init_io_u() will use, so we need to
* do this first.
@@
-1071,6
+1087,9
@@
static void *thread_main(void *data)
}
}
}
}
+ if (td->o.cgroup_weight && cgroup_setup(td, cgroup_list, &cgroup_mnt))
+ goto err;
+
if (nice(td->o.nice) == -1) {
td_verror(td, errno, "nice");
goto err;
if (nice(td->o.nice) == -1) {
td_verror(td, errno, "nice");
goto err;
@@
-1105,7
+1124,10
@@
static void *thread_main(void *data)
clear_state = 0;
while (keep_running(td)) {
fio_gettime(&td->start, NULL);
clear_state = 0;
while (keep_running(td)) {
fio_gettime(&td->start, NULL);
- memcpy(&td->ts.stat_sample_time, &td->start, sizeof(td->start));
+ memcpy(&td->ts.stat_sample_time[0], &td->start,
+ sizeof(td->start));
+ memcpy(&td->ts.stat_sample_time[1], &td->start,
+ sizeof(td->start));
memcpy(&td->tv_cache, &td->start, sizeof(td->start));
if (td->o.ratemin[0] || td->o.ratemin[1])
memcpy(&td->tv_cache, &td->start, sizeof(td->start));
if (td->o.ratemin[0] || td->o.ratemin[1])
@@
-1190,9
+1212,14
@@
err:
if (td->error)
printf("fio: pid=%d, err=%d/%s\n", (int) td->pid, td->error,
td->verror);
if (td->error)
printf("fio: pid=%d, err=%d/%s\n", (int) td->pid, td->error,
td->verror);
+
+ if (td->o.verify_async)
+ verify_async_exit(td);
+
close_and_free_files(td);
close_ioengine(td);
cleanup_io_u(td);
close_and_free_files(td);
close_ioengine(td);
cleanup_io_u(td);
+ cgroup_shutdown(td, &cgroup_mnt);
if (td->o.cpumask_set) {
int ret = fio_cpuset_exit(&td->o.cpumask);
if (td->o.cpumask_set) {
int ret = fio_cpuset_exit(&td->o.cpumask);
@@
-1200,9
+1227,6
@@
err:
td_verror(td, ret, "fio_cpuset_exit");
}
td_verror(td, ret, "fio_cpuset_exit");
}
- if (td->o.verify_async)
- verify_async_exit(td);
-
/*
* do this very late, it will log file closing as well
*/
/*
* do this very late, it will log file closing as well
*/
@@
-1615,12
+1639,6
@@
int main(int argc, char *argv[])
if (!getenv("LC_NUMERIC"))
setlocale(LC_NUMERIC, "en_US");
if (!getenv("LC_NUMERIC"))
setlocale(LC_NUMERIC, "en_US");
- if (parse_options(argc, argv))
- return 1;
-
- if (!thread_number)
- return 0;
-
ps = sysconf(_SC_PAGESIZE);
if (ps < 0) {
log_err("Failed to get page size\n");
ps = sysconf(_SC_PAGESIZE);
if (ps < 0) {
log_err("Failed to get page size\n");
@@
-1630,6
+1648,14
@@
int main(int argc, char *argv[])
page_size = ps;
page_mask = ps - 1;
page_size = ps;
page_mask = ps - 1;
+ fio_keywords_init();
+
+ if (parse_options(argc, argv))
+ return 1;
+
+ if (!thread_number)
+ return 0;
+
if (write_bw_log) {
setup_log(&agg_io_log[DDIR_READ]);
setup_log(&agg_io_log[DDIR_WRITE]);
if (write_bw_log) {
setup_log(&agg_io_log[DDIR_READ]);
setup_log(&agg_io_log[DDIR_WRITE]);
@@
-1642,6
+1668,9
@@
int main(int argc, char *argv[])
status_timer_arm();
status_timer_arm();
+ cgroup_list = smalloc(sizeof(*cgroup_list));
+ INIT_FLIST_HEAD(cgroup_list);
+
run_threads();
if (!fio_abort) {
run_threads();
if (!fio_abort) {
@@
-1653,6
+1682,11
@@
int main(int argc, char *argv[])
}
}
}
}
+ cgroup_kill(cgroup_list);
+ sfree(cgroup_list);
+ if (cgroup_mnt)
+ sfree(cgroup_mnt);
+
fio_mutex_remove(startup_mutex);
fio_mutex_remove(writeout_mutex);
return exit_value;
fio_mutex_remove(startup_mutex);
fio_mutex_remove(writeout_mutex);
return exit_value;