projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'master' of ssh://brick.kernel.dk/data/git/fio
[fio.git]
/
fio.c
diff --git
a/fio.c
b/fio.c
index fa5deabb6842ed0c527c07e76f68c9c93560e5cc..dfd15e0f5db1e943a9aec595454cf1f601e97fea 100644
(file)
--- a/
fio.c
+++ b/
fio.c
@@
-223,7
+223,7
@@
static int __check_min_rate(struct thread_data *td, struct timeval *now,
if (rate < ratemin ||
bytes < td->rate_bytes[ddir]) {
log_err("%s: min rate %u not met, got"
if (rate < ratemin ||
bytes < td->rate_bytes[ddir]) {
log_err("%s: min rate %u not met, got"
- " %luK
i
B/sec\n", td->o.name,
+ " %luKB/sec\n", td->o.name,
ratemin, rate);
return 1;
}
ratemin, rate);
return 1;
}
@@
-388,21
+388,29
@@
static int break_on_this_error(struct thread_data *td, int *retptr)
else
err = td->error;
else
err = td->error;
- update_error_count(td, err);
-
if (td_non_fatal_error(err)) {
/*
* Continue with the I/Os in case of
* a non fatal error.
*/
if (td_non_fatal_error(err)) {
/*
* Continue with the I/Os in case of
* a non fatal error.
*/
+ update_error_count(td, err);
td_clear_error(td);
*retptr = 0;
return 0;
td_clear_error(td);
*retptr = 0;
return 0;
+ } else if (td->o.fill_device && err == ENOSPC) {
+ /*
+ * We expect to hit this error if
+ * fill_device option is set.
+ */
+ td_clear_error(td);
+ td->terminate = 1;
+ return 1;
} else {
/*
* Stop the I/O in case of a fatal
* error.
*/
} else {
/*
* Stop the I/O in case of a fatal
* error.
*/
+ update_error_count(td, err);
return 1;
}
}
return 1;
}
}
@@
-464,7
+472,10
@@
static void do_verify(struct thread_data *td)
break;
}
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) {
ret = td_io_queue(td, io_u);
switch (ret) {
@@
-596,7
+607,10
@@
static void do_io(struct thread_data *td)
* a previously written file.
*/
if (td->o.verify != VERIFY_NONE && io_u->ddir == DDIR_READ) {
* 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_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);
td_set_runstate(td, TD_VERIFYING);
} else if (in_ramp_time(td))
td_set_runstate(td, TD_RAMP);
@@
-791,7
+805,7
@@
static int init_io_u(struct thread_data *td)
if (allocate_io_mem(td))
return 1;
if (allocate_io_mem(td))
return 1;
- if (td->o.mem_align)
+ if (td->o.
odirect || td->o.
mem_align)
p = PAGE_ALIGN(td->orig_buffer) + td->o.mem_align;
else
p = td->orig_buffer;
p = PAGE_ALIGN(td->orig_buffer) + td->o.mem_align;
else
p = td->orig_buffer;
@@
-984,6
+998,7
@@
static void *thread_main(void *data)
{
unsigned long long runtime[2], elapsed;
struct thread_data *td = data;
{
unsigned long long runtime[2], elapsed;
struct thread_data *td = data;
+ pthread_condattr_t attr;
int clear_state;
if (!td->o.use_thread)
int clear_state;
if (!td->o.use_thread)
@@
-998,8
+1013,14
@@
static void *thread_main(void *data)
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->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;
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);
td_set_runstate(td, TD_INITIALIZED);
dprint(FD_MUTEX, "up startup_mutex\n");
fio_mutex_up(startup_mutex);
@@
-1023,7
+1044,10
@@
static void *thread_main(void *data)
if (init_io_u(td))
goto err;
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;
}
td_verror(td, errno, "cpu_set_affinity");
goto err;
}
@@
-1034,7
+1058,7
@@
static void *thread_main(void *data)
*/
if (td->o.gtod_cpu) {
fio_cpu_clear(&td->o.cpumask, td->o.gtod_cpu);
*/
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;
}
td_verror(td, errno, "cpu_set_affinity");
goto err;
}
@@
-1081,7
+1105,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])
@@
-1176,6
+1203,9
@@
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
*/
@@
-1588,12
+1618,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");
@@
-1603,6
+1627,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]);