[PATCH] Get rid of FIO_INST_PREFIX
[fio.git] / fio.c
diff --git a/fio.c b/fio.c
index fc653b3d9016e9b7553ac5cadbb37a870ba00a9d..42ac0c9b0d7dd0904b90bfd2451c4681ac42b48a 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -4,10 +4,12 @@
  * Copyright (C) 2005 Jens Axboe <axboe@suse.de>
  * Copyright (C) 2006 Jens Axboe <axboe@kernel.dk>
  *
+ * The license below covers all files distributed with fio unless otherwise
+ * noted in the file itself.
+ *
  *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
  *
  *  This program is distributed in the hope that it will be useful,
  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -43,7 +45,6 @@ int groupid = 0;
 int thread_number = 0;
 int shm_id = 0;
 int temp_stall_ts;
-char *fio_inst_prefix = _INST_PREFIX;
 
 static volatile int startup_sem;
 
@@ -193,6 +194,50 @@ static void cleanup_pending_aio(struct thread_data *td)
        }
 }
 
+/*
+ * Helper to handle the final sync of a file. Works just like the normal
+ * io path, just does everything sync.
+ */
+static int fio_io_sync(struct thread_data *td, struct fio_file *f)
+{
+       struct io_u *io_u = __get_io_u(td);
+       struct io_completion_data icd;
+       int ret;
+
+       if (!io_u)
+               return 1;
+
+       io_u->ddir = DDIR_SYNC;
+       io_u->file = f;
+
+       if (td_io_prep(td, io_u)) {
+               put_io_u(td, io_u);
+               return 1;
+       }
+
+       ret = td_io_queue(td, io_u);
+       if (ret) {
+               td_verror(td, io_u->error);
+               put_io_u(td, io_u);
+               return 1;
+       }
+
+       ret = td_io_getevents(td, 1, td->cur_depth, NULL);
+       if (ret < 0) {
+               td_verror(td, ret);
+               return 1;
+       }
+
+       icd.nr = ret;
+       ios_completed(td, &icd);
+       if (icd.error) {
+               td_verror(td, icd.error);
+               return 1;
+       }
+
+       return 0;
+}
+
 /*
  * The main verify engine. Runs over the writes we previusly submitted,
  * reads the blocks back in, and checks the crc/md5 of the data.
@@ -210,7 +255,7 @@ void do_verify(struct thread_data *td)
         * read from disk.
         */
        for_each_file(td, f, i) {
-               td_io_sync(td, f);
+               fio_io_sync(td, f);
                file_invalidate_cache(td, f);
        }
 
@@ -246,8 +291,8 @@ void do_verify(struct thread_data *td)
 
                ret = td_io_queue(td, io_u);
                if (ret) {
+                       td_verror(td, io_u->error);
                        put_io_u(td, io_u);
-                       td_verror(td, ret);
                        break;
                }
 
@@ -353,8 +398,8 @@ static void do_io(struct thread_data *td)
 
                ret = td_io_queue(td, io_u);
                if (ret) {
+                       td_verror(td, io_u->error);
                        put_io_u(td, io_u);
-                       td_verror(td, ret);
                        break;
                }
 
@@ -390,10 +435,10 @@ static void do_io(struct thread_data *td)
                gettimeofday(&e, NULL);
                usec = utime_since(&s, &e);
 
-               rate_throttle(td, usec, icd.bytes_done[td->ddir]);
+               rate_throttle(td, usec, icd.bytes_done[td->ddir], td->ddir);
 
                if (check_min_rate(td, &e)) {
-                       if (rate_quit)
+                       if (exitall_on_terminate)
                                terminate_threads(td->groupid);
                        td_verror(td, ENOMEM);
                        break;
@@ -406,14 +451,14 @@ static void do_io(struct thread_data *td)
                        usec_sleep(td, td->thinktime);
        }
 
-       if (!ret) {
+       if (!td->error) {
                if (td->cur_depth)
                        cleanup_pending_aio(td);
 
                if (should_fsync(td) && td->end_fsync) {
                        td_set_runstate(td, TD_FSYNCING);
                        for_each_file(td, f, i)
-                               td_io_sync(td, f);
+                               fio_io_sync(td, f);
                }
        }
 }
@@ -433,9 +478,23 @@ static void cleanup_io_u(struct thread_data *td)
        free_io_mem(td);
 }
 
+/*
+ * "randomly" fill the buffer contents
+ */
+static void fill_rand_buf(struct io_u *io_u, int max_bs)
+{
+       int *ptr = io_u->buf;
+
+       while ((void *) ptr - io_u->buf < max_bs) {
+               *ptr = rand() * 0x9e370001;
+               ptr++;
+       }
+}
+
 static int init_io_u(struct thread_data *td)
 {
        struct io_u *io_u;
+       unsigned int max_bs;
        int i, max_units;
        char *p;
 
@@ -447,7 +506,8 @@ static int init_io_u(struct thread_data *td)
        else
                max_units = td->iodepth;
 
-       td->orig_buffer_size = td->max_bs * max_units + MASK;
+       max_bs = max(td->max_bs[DDIR_READ], td->max_bs[DDIR_WRITE]);
+       td->orig_buffer_size = max_bs * max_units + MASK;
 
        if (allocate_io_mem(td))
                return 1;
@@ -458,7 +518,10 @@ static int init_io_u(struct thread_data *td)
                memset(io_u, 0, sizeof(*io_u));
                INIT_LIST_HEAD(&io_u->list);
 
-               io_u->buf = p + td->max_bs * i;
+               io_u->buf = p + max_bs * i;
+               if (td_write(td) || td_rw(td))
+                       fill_rand_buf(io_u, max_bs);
+
                io_u->index = i;
                list_add(&io_u->list, &td->io_u_freelist);
        }
@@ -472,6 +535,9 @@ static int switch_ioscheduler(struct thread_data *td)
        FILE *f;
        int ret;
 
+       if (td->io_ops->flags & FIO_CPUIO)
+               return 0;
+
        sprintf(tmp, "%s/queue/scheduler", td->sysfs_root);
 
        f = fopen(tmp, "r+");
@@ -589,6 +655,8 @@ static void *thread_main(void *data)
 
        if (!td->create_serialize && setup_files(td))
                goto err;
+       if (open_files(td))
+               goto err;
 
        gettimeofday(&td->epoch, NULL);
 
@@ -640,7 +708,7 @@ static void *thread_main(void *data)
                finish_log(td, td->slat_log, "slat");
        if (td->clat_log)
                finish_log(td, td->clat_log, "clat");
-       if (td->write_iolog)
+       if (td->write_iolog_file)
                write_iolog_close(td);
        if (td->exec_postrun)
                system(td->exec_postrun);
@@ -684,12 +752,12 @@ static void *fork_main(int shmid, int offset)
 static void reap_threads(int *nr_running, int *t_rate, int *m_rate)
 {
        struct thread_data *td;
-       int i, cputhreads;
+       int i, cputhreads, pending;
 
        /*
         * reap exited threads (TD_EXITED -> TD_REAPED)
         */
-       cputhreads = 0;
+       pending = cputhreads = 0;
        for_each_td(td, i) {
                /*
                 * ->io_ops is NULL for a thread that has closed its
@@ -698,8 +766,12 @@ static void reap_threads(int *nr_running, int *t_rate, int *m_rate)
                if (td->io_ops && td->io_ops->flags & FIO_CPUIO)
                        cputhreads++;
 
-               if (td->runstate != TD_EXITED)
+               if (td->runstate != TD_EXITED) {
+                       if (td->runstate < TD_RUNNING)
+                               pending++;
+
                        continue;
+               }
 
                td_set_runstate(td, TD_REAPED);
 
@@ -716,7 +788,7 @@ static void reap_threads(int *nr_running, int *t_rate, int *m_rate)
                (*t_rate) -= td->rate;
        }
 
-       if (*nr_running == cputhreads)
+       if (*nr_running == cputhreads && !pending)
                terminate_threads(TERMINATE_ALL);
 }