The following changes since commit c08f9fe23b0f257f914b2d9e0e4f1117418e5da6: options: add log_compression_cpus option (2015-12-08 15:45:12 -0700) are available in the git repository at: git://git.kernel.dk/fio.git master for you to fetch changes up to c5103619279883ee9291ed4793bb6ad39b436101: eta: use bool for forcing jobs_eta return (2015-12-09 12:44:09 -0700) ---------------------------------------------------------------- Jens Axboe (8): backend: terminate loop if we didn't do IO Fix ramp time for io_submit_mode=offload eta: fix comparison reversal for time based jobs iolog: don't copy log samples for compression thread_options: kill converted cpu masks server: always end back ETA reply server: ensure we send the right sized jobs_eta when faking it eta: use bool for forcing jobs_eta return backend.c | 5 ++++- eta.c | 6 +++--- iolog.c | 22 +++++++++------------- server.c | 50 ++++++++++++++++++++++++++++---------------------- stat.c | 2 +- stat.h | 2 +- thread_options.h | 5 +++++ time.c | 13 +++++++++++++ 8 files changed, 64 insertions(+), 41 deletions(-) --- Diff of recent changes: diff --git a/backend.c b/backend.c index ae26120..425b0ee 100644 --- a/backend.c +++ b/backend.c @@ -1587,8 +1587,11 @@ static void *thread_main(void *data) if (td->o.verify_only && (td_write(td) || td_rw(td))) verify_bytes = do_dry_run(td); - else + else { verify_bytes = do_io(td); + if (!verify_bytes) + fio_mark_td_terminate(td); + } clear_state = 1; diff --git a/eta.c b/eta.c index 8785540..ffab34e 100644 --- a/eta.c +++ b/eta.c @@ -214,7 +214,7 @@ static unsigned long thread_eta(struct thread_data *td) if (td->o.time_based) { if (timeout) { perc_t = (double) elapsed / (double) timeout; - if (perc_t > perc) + if (perc_t < perc) perc = perc_t; } else { /* @@ -589,7 +589,7 @@ void display_thread_status(struct jobs_eta *je) fflush(stdout); } -struct jobs_eta *get_jobs_eta(int force, size_t *size) +struct jobs_eta *get_jobs_eta(bool force, size_t *size) { struct jobs_eta *je; @@ -616,7 +616,7 @@ void print_thread_status(void) struct jobs_eta *je; size_t size; - je = get_jobs_eta(0, &size); + je = get_jobs_eta(false, &size); if (je) display_thread_status(je); diff --git a/iolog.c b/iolog.c index 27d00ff..e674171 100644 --- a/iolog.c +++ b/iolog.c @@ -1154,15 +1154,15 @@ void iolog_compress_exit(struct thread_data *td) } /* - * Queue work item to compress the existing log entries. We copy the - * samples, and reset the log sample count to 0 (so the logging will - * continue to use the memory associated with the log). If called with - * wait == 1, will not return until the log compression has completed. + * Queue work item to compress the existing log entries. We reset the + * current log to a small size, and reference the existing log in the + * data that we queue for compression. Once compression has been done, + * this old log is freed. If called with wait == 1, will not return until + * the log compression has completed. */ int iolog_flush(struct io_log *log, int wait) { struct iolog_flush_data *data; - size_t sample_size; data = malloc(sizeof(*data)); if (!data) @@ -1170,16 +1170,12 @@ int iolog_flush(struct io_log *log, int wait) data->log = log; - sample_size = log->nr_samples * log_entry_sz(log); - data->samples = malloc(sample_size); - if (!data->samples) { - free(data); - return 1; - } - - memcpy(data->samples, log->log, sample_size); + data->samples = log->log; data->nr_samples = log->nr_samples; + log->nr_samples = 0; + log->max_samples = 128; + log->log = malloc(log->max_samples * log_entry_sz(log)); data->wait = wait; if (data->wait) { diff --git a/server.c b/server.c index 18b3a08..cf01733 100644 --- a/server.c +++ b/server.c @@ -709,33 +709,39 @@ static int handle_send_eta_cmd(struct fio_net_cmd *cmd) size_t size; int i; - je = get_jobs_eta(1, &size); - if (!je) - return 0; - dprint(FD_NET, "server sending status\n"); - je->nr_running = cpu_to_le32(je->nr_running); - je->nr_ramp = cpu_to_le32(je->nr_ramp); - je->nr_pending = cpu_to_le32(je->nr_pending); - je->nr_setting_up = cpu_to_le32(je->nr_setting_up); - je->files_open = cpu_to_le32(je->files_open); + /* + * Fake ETA return if we don't have a local one, otherwise the client + * will end up timing out waiting for a response to the ETA request + */ + je = get_jobs_eta(true, &size); + if (!je) { + size = sizeof(*je); + je = calloc(1, size); + } else { + je->nr_running = cpu_to_le32(je->nr_running); + je->nr_ramp = cpu_to_le32(je->nr_ramp); + je->nr_pending = cpu_to_le32(je->nr_pending); + je->nr_setting_up = cpu_to_le32(je->nr_setting_up); + je->files_open = cpu_to_le32(je->files_open); + + for (i = 0; i < DDIR_RWDIR_CNT; i++) { + je->m_rate[i] = cpu_to_le32(je->m_rate[i]); + je->t_rate[i] = cpu_to_le32(je->t_rate[i]); + je->m_iops[i] = cpu_to_le32(je->m_iops[i]); + je->t_iops[i] = cpu_to_le32(je->t_iops[i]); + je->rate[i] = cpu_to_le32(je->rate[i]); + je->iops[i] = cpu_to_le32(je->iops[i]); + } - for (i = 0; i < DDIR_RWDIR_CNT; i++) { - je->m_rate[i] = cpu_to_le32(je->m_rate[i]); - je->t_rate[i] = cpu_to_le32(je->t_rate[i]); - je->m_iops[i] = cpu_to_le32(je->m_iops[i]); - je->t_iops[i] = cpu_to_le32(je->t_iops[i]); - je->rate[i] = cpu_to_le32(je->rate[i]); - je->iops[i] = cpu_to_le32(je->iops[i]); + je->elapsed_sec = cpu_to_le64(je->elapsed_sec); + je->eta_sec = cpu_to_le64(je->eta_sec); + je->nr_threads = cpu_to_le32(je->nr_threads); + je->is_pow2 = cpu_to_le32(je->is_pow2); + je->unit_base = cpu_to_le32(je->unit_base); } - je->elapsed_sec = cpu_to_le64(je->elapsed_sec); - je->eta_sec = cpu_to_le64(je->eta_sec); - je->nr_threads = cpu_to_le32(je->nr_threads); - je->is_pow2 = cpu_to_le32(je->is_pow2); - je->unit_base = cpu_to_le32(je->unit_base); - fio_net_send_cmd(server_fd, FIO_NET_CMD_ETA, je, size, &tag, NULL); free(je); return 0; diff --git a/stat.c b/stat.c index 818756d..ca06617 100644 --- a/stat.c +++ b/stat.c @@ -1104,7 +1104,7 @@ static struct json_object *show_thread_status_json(struct thread_stat *ts, json_object_add_value_int(root, "error", ts->error); /* ETA Info */ - je = get_jobs_eta(1, &size); + je = get_jobs_eta(true, &size); if (je) { json_object_add_value_int(root, "eta", je->eta_sec); json_object_add_value_int(root, "elapsed", je->elapsed_sec); diff --git a/stat.h b/stat.h index 33afd9b..dda88fc 100644 --- a/stat.h +++ b/stat.h @@ -242,7 +242,7 @@ struct jobs_eta { extern struct fio_mutex *stat_mutex; -extern struct jobs_eta *get_jobs_eta(int force, size_t *size); +extern struct jobs_eta *get_jobs_eta(bool force, size_t *size); extern void stat_init(void); extern void stat_exit(void); diff --git a/thread_options.h b/thread_options.h index f9c1562..02c867f 100644 --- a/thread_options.h +++ b/thread_options.h @@ -414,9 +414,14 @@ struct thread_options_pack { uint32_t stonewall; uint32_t new_group; uint32_t numjobs; + /* + * We currently can't convert these, so don't enable them + */ +#if 0 uint8_t cpumask[FIO_TOP_STR_MAX]; uint8_t verify_cpumask[FIO_TOP_STR_MAX]; uint8_t log_gz_cpumask[FIO_TOP_STR_MAX]; +#endif uint32_t cpus_allowed_policy; uint32_t iolog; uint32_t rwmixcycle; diff --git a/time.c b/time.c index f1833c7..b145e90 100644 --- a/time.c +++ b/time.c @@ -80,6 +80,18 @@ int in_ramp_time(struct thread_data *td) return td->o.ramp_time && !td->ramp_time_over; } +static void parent_update_ramp(struct thread_data *td) +{ + struct thread_data *parent = td->parent; + + if (!parent || parent->ramp_time_over) + return; + + reset_all_stats(parent); + parent->ramp_time_over = 1; + td_set_runstate(parent, TD_RAMP); +} + int ramp_time_over(struct thread_data *td) { struct timeval tv; @@ -92,6 +104,7 @@ int ramp_time_over(struct thread_data *td) td->ramp_time_over = 1; reset_all_stats(td); td_set_runstate(td, TD_RAMP); + parent_update_ramp(td); return 1; } -- To unsubscribe from this list: send the line "unsubscribe fio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html