#include <sys/mman.h>
#include "fio.h"
-#include "os.h"
unsigned long page_mask;
unsigned long page_size;
put_io_u(td, io_u);
break;
}
+
io_u->xfer_buflen = io_u->resid;
io_u->xfer_buf += bytes;
+ io_u->offset += bytes;
+
+ if (io_u->offset == io_u->file->real_file_size)
+ goto sync_done;
+
requeue_io_u(td, &io_u);
} else {
+sync_done:
ret = io_u_sync_complete(td, io_u);
if (ret < 0)
break;
td_set_runstate(td, TD_RUNNING);
- while ((td->this_io_bytes[0] + td->this_io_bytes[1]) < td->io_size) {
+ while ((td->this_io_bytes[0] + td->this_io_bytes[1]) < td->o.size) {
struct timeval comp_time;
long bytes_done = 0;
int min_evts = 0;
io_u->xfer_buflen = io_u->resid;
io_u->xfer_buf += bytes;
+ io_u->offset += bytes;
+
+ if (io_u->offset == io_u->file->real_file_size)
+ goto sync_done;
+
requeue_io_u(td, &io_u);
} else {
+sync_done:
fio_gettime(&comp_time, NULL);
bytes_done = io_u_sync_complete(td, io_u);
if (bytes_done < 0)
f = fopen(tmp, "r+");
if (!f) {
- td_verror(td, errno, "fopen");
+ if (errno == ENOENT) {
+ log_err("fio: os or kernel doesn't support IO scheduler switching\n");
+ return 0;
+ }
+ td_verror(td, errno, "fopen iosched");
return 1;
}
td->zone_bytes = 0;
td->rate_bytes = 0;
td->rate_blocks = 0;
+ td->rw_end_set[0] = td->rw_end_set[1] = 0;
td->last_was_sync = 0;
{
unsigned long long runtime[2];
struct thread_data *td = data;
+ unsigned long elapsed;
int clear_state;
if (!td->o.use_thread)
INIT_LIST_HEAD(&td->io_u_freelist);
INIT_LIST_HEAD(&td->io_u_busylist);
INIT_LIST_HEAD(&td->io_u_requeues);
- INIT_LIST_HEAD(&td->io_hist_list);
INIT_LIST_HEAD(&td->io_log_list);
+ INIT_LIST_HEAD(&td->io_hist_list);
+ td->io_hist_tree = RB_ROOT;
if (init_io_u(td))
goto err_sem;
clear_state = 1;
- if (td_read(td) && td->io_bytes[DDIR_READ])
- runtime[DDIR_READ] += utime_since_now(&td->start);
- if (td_write(td) && td->io_bytes[DDIR_WRITE])
- runtime[DDIR_WRITE] += utime_since_now(&td->start);
+ if (td_read(td) && td->io_bytes[DDIR_READ]) {
+ if (td->rw_end_set[DDIR_READ])
+ elapsed = utime_since(&td->start, &td->rw_end[DDIR_READ]);
+ else
+ elapsed = utime_since_now(&td->start);
+
+ runtime[DDIR_READ] += elapsed;
+ }
+ if (td_write(td) && td->io_bytes[DDIR_WRITE]) {
+ if (td->rw_end_set[DDIR_WRITE])
+ elapsed = utime_since(&td->start, &td->rw_end[DDIR_WRITE]);
+ else
+ elapsed = utime_since_now(&td->start);
+
+ runtime[DDIR_WRITE] += elapsed;
+ }
if (td->error || td->terminate)
break;
close_files(td);
close_ioengine(td);
cleanup_io_u(td);
+ options_mem_free(td);
td_set_runstate(td, TD_EXITED);
return (void *) (unsigned long) td->error;
err_sem:
/*
* thread is not dead, continue
*/
+ pending++;
continue;
reaped:
if (td->o.use_thread) {
(*nr_running)--;
(*m_rate) -= td->o.ratemin;
(*t_rate) -= td->o.rate;
+ pending--;
if (td->error)
exit_value++;
if (parse_options(argc, argv))
return 1;
- if (!thread_number) {
- log_err("Nothing to do\n");
- return 1;
- }
+ if (!thread_number)
+ return 0;
ps = sysconf(_SC_PAGESIZE);
if (ps < 0) {