#include "smalloc.h"
#include "verify.h"
#include "diskutil.h"
+#include "cgroup.h"
unsigned long page_mask;
unsigned long page_size;
if (rate < ratemin ||
bytes < td->rate_bytes[ddir]) {
log_err("%s: min rate %u not met, got"
- " %luKiB/sec\n", td->o.name,
+ " %luKB/sec\n", td->o.name,
ratemin, rate);
return 1;
}
break;
}
- io_u->end_io = verify_io_u;
+ if (td->o.verify_async)
+ io_u->end_io = verify_io_u_async;
+ else
+ io_u->end_io = verify_io_u;
ret = td_io_queue(td, io_u);
switch (ret) {
*/
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;
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;
* Add verification end_io handler, if asked to verify
* a previously written file.
*/
- if (td->o.verify != VERIFY_NONE && io_u->ddir == DDIR_READ) {
- io_u->end_io = verify_io_u;
+ 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
+ io_u->end_io = verify_io_u;
td_set_runstate(td, TD_VERIFYING);
} else if (in_ramp_time(td))
td_set_runstate(td, TD_RAMP);
*/
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;
{
unsigned long long runtime[2], elapsed;
struct thread_data *td = data;
+ pthread_condattr_t attr;
int clear_state;
if (!td->o.use_thread)
INIT_FLIST_HEAD(&td->io_u_requeues);
INIT_FLIST_HEAD(&td->io_log_list);
INIT_FLIST_HEAD(&td->io_hist_list);
+ INIT_FLIST_HEAD(&td->verify_list);
+ pthread_mutex_init(&td->io_u_lock, NULL);
td->io_hist_tree = RB_ROOT;
+ pthread_condattr_init(&attr);
+ pthread_cond_init(&td->verify_cond, &attr);
+ pthread_cond_init(&td->free_cond, &attr);
+
td_set_runstate(td, TD_INITIALIZED);
dprint(FD_MUTEX, "up startup_mutex\n");
fio_mutex_up(startup_mutex);
if (init_io_u(td))
goto err;
- if (td->o.cpumask_set && fio_setaffinity(td) == -1) {
+ if (td->o.verify_async && verify_async_init(td))
+ goto err;
+
+ if (td->o.cpumask_set && fio_setaffinity(td->pid, td->o.cpumask) == -1) {
td_verror(td, errno, "cpu_set_affinity");
goto err;
}
*/
if (td->o.gtod_cpu) {
fio_cpu_clear(&td->o.cpumask, td->o.gtod_cpu);
- if (fio_setaffinity(td) == -1) {
+ if (fio_setaffinity(td->pid, td->o.cpumask) == -1) {
td_verror(td, errno, "cpu_set_affinity");
goto err;
}
}
}
+ if (td->o.cgroup_weight && cgroup_setup(td))
+ goto err;
+
if (nice(td->o.nice) == -1) {
td_verror(td, errno, "nice");
goto err;
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])
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);
+ cgroup_shutdown(td);
if (td->o.cpumask_set) {
int ret = fio_cpuset_exit(&td->o.cpumask);
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");
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]);