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; if (!td->o.ramp_time || td->ramp_time_over) return 1; fio_gettime(&tv, NULL); if (mtime_since(&td->epoch, &tv) >= td->o.ramp_time * 1000) { td->ramp_time_over = 1; reset_all_stats(td); td_set_runstate(td, TD_RAMP); return 1; } return 0; }
static void lat_target_success(struct thread_data *td) { const unsigned int qd = td->latency_qd; struct thread_options *o = &td->o; td->latency_qd_low = td->latency_qd; /* * If we haven't failed yet, we double up to a failing value instead * of bisecting from highest possible queue depth. If we have set * a limit other than td->o.iodepth, bisect between that. */ if (td->latency_qd_high != o->iodepth) td->latency_qd = (td->latency_qd + td->latency_qd_high) / 2; else td->latency_qd *= 2; if (td->latency_qd > o->iodepth) td->latency_qd = o->iodepth; dprint(FD_RATE, "Ramped up: %d %d %d\n", td->latency_qd_low, td->latency_qd, td->latency_qd_high); /* * Same as last one, we are done. Let it run a latency cycle, so * we get only the results from the targeted depth. */ if (td->latency_qd == qd) { if (td->latency_end_run) { dprint(FD_RATE, "We are done\n"); td->done = 1; } else { dprint(FD_RATE, "Quiesce and final run\n"); io_u_quiesce(td); td->latency_end_run = 1; reset_all_stats(td); reset_io_stats(td); } } lat_new_cycle(td); }