X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=stat.c;h=a8f2b02665b2b21f278bcef35af984dc2e61e0d0;hb=bc5b77a8c46aabea554c4a2c8cca37f27f97969a;hp=352ba48f4447cf77068b77bae7247ceec8dfa166;hpb=8abdce6686bfcaa211e7eb75a69ec07e980bd96e;p=fio.git diff --git a/stat.c b/stat.c index 352ba48f..a8f2b026 100644 --- a/stat.c +++ b/stat.c @@ -11,6 +11,7 @@ static struct itimerval itimer; static struct list_head disk_list = LIST_HEAD_INIT(disk_list); +static dev_t last_dev; /* * Cheasy number->string conversion, complete with carry rounding error. @@ -273,6 +274,17 @@ void init_disk_util(struct thread_data *td) if (disk_util_exists(dev)) return; + + /* + * for an fs without a device, we will repeatedly stat through + * sysfs which can take oodles of time for thousands of files. so + * cache the last lookup and compare with that before going through + * everything again. + */ + if (dev == last_dev) + return; + + last_dev = dev; sprintf(foo, "/sys/block"); if (!find_block_dir(dev, foo)) @@ -454,9 +466,10 @@ static void show_thread_status(struct thread_data *td, else fprintf(f_out, "%s: (groupid=%d): err=%2d (%s): pid=%d\n",td->name, td->groupid, td->error, td->verror, td->pid); - show_ddir_status(td, rs, td->ddir); - if (td->io_bytes[td->ddir ^ 1]) - show_ddir_status(td, rs, td->ddir ^ 1); + if (td_read(td)) + show_ddir_status(td, rs, DDIR_READ); + if (td_write(td)) + show_ddir_status(td, rs, DDIR_WRITE); runtime = mtime_since(&td->epoch, &td->end_time); if (runtime) {