*/
static void *thread_main(void *data)
{
+ unsigned long long runtime[2];
struct thread_data *td = data;
if (!td->use_thread)
if (open_files(td))
goto err;
- fio_gettime(&td->epoch, NULL);
-
if (td->exec_prerun)
system(td->exec_prerun);
+ fio_gettime(&td->epoch, NULL);
+
+ runtime[0] = runtime[1] = 0;
while (td->loops--) {
getrusage(RUSAGE_SELF, &td->ru_start);
fio_gettime(&td->start, NULL);
else
do_io(td);
- td->runtime[td->ddir] += mtime_since_now(&td->start);
+ runtime[td->ddir] += utime_since_now(&td->start);
if (td_rw(td) && td->io_bytes[td->ddir ^ 1])
- td->runtime[td->ddir ^ 1] = td->runtime[td->ddir];
+ runtime[td->ddir ^ 1] = runtime[td->ddir];
update_rusage_stat(td);
do_verify(td);
- td->runtime[DDIR_READ] += mtime_since_now(&td->start);
+ runtime[DDIR_READ] += utime_since_now(&td->start);
if (td->error || td->terminate)
break;
}
+ fio_gettime(&td->end_time, NULL);
+ td->runtime[0] = runtime[0] / 1000;
+ td->runtime[1] = runtime[1] / 1000;
+
if (td->bw_log)
finish_log(td, td->bw_log, "bw");
if (td->slat_log)
struct timeval start; /* start of this loop */
struct timeval epoch; /* time job was started */
+ struct timeval end_time;/* time job ended */
/*
* fio system usage accounting
* Time functions
*/
extern unsigned long utime_since(struct timeval *, struct timeval *);
+extern unsigned long utime_since_now(struct timeval *);
extern unsigned long mtime_since(struct timeval *, struct timeval *);
extern unsigned long mtime_since_now(struct timeval *);
extern unsigned long time_since_now(struct timeval *);
void update_rusage_stat(struct thread_data *td)
{
- if (!(td->runtime[0] + td->runtime[1]))
- return;
-
getrusage(RUSAGE_SELF, &td->ru_end);
td->usr_time += mtime_since(&td->ru_start.ru_utime, &td->ru_end.ru_utime);
struct group_run_stats *rs)
{
double usr_cpu, sys_cpu;
+ unsigned long runtime;
if (!(td->io_bytes[0] + td->io_bytes[1]) && !td->error)
return;
if (td->io_bytes[td->ddir ^ 1])
show_ddir_status(td, rs, td->ddir ^ 1);
- if (td->runtime[0] + td->runtime[1]) {
- double runt = td->runtime[0] + td->runtime[1];
+ runtime = mtime_since(&td->epoch, &td->end_time);
+ if (runtime) {
+ double runt = runtime;
usr_cpu = (double) td->usr_time * 100 / runt;
sys_cpu = (double) td->sys_time * 100 / runt;
return sec + usec;
}
-static unsigned long utime_since_now(struct timeval *s)
+unsigned long utime_since_now(struct timeval *s)
{
struct timeval t;