[PATCH] Randomly fill output buffers
[fio.git] / fio.c
diff --git a/fio.c b/fio.c
index 0dbce58835ad83e76e6855f7d4f100c9509decaa..52caa4e94627222957f5c46f6a123ac9cc319278 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
@@ -216,14 +218,14 @@ static int fio_io_sync(struct thread_data *td, struct fio_file *f)
 
        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);
                return 1;
        }
 
        ret = td_io_getevents(td, 1, td->cur_depth, NULL);
        if (ret < 0) {
-               td_verror(td, -ret);
+               td_verror(td, ret);
                return 1;
        }
 
@@ -290,8 +292,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;
                }
 
@@ -397,8 +399,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;
                }
 
@@ -477,6 +479,19 @@ 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, unsigned int max_bs)
+{
+       unsigned 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;
@@ -503,6 +518,9 @@ static int init_io_u(struct thread_data *td)
                INIT_LIST_HEAD(&io_u->list);
 
                io_u->buf = p + td->max_bs * i;
+               if (td_write(td) || td_rw(td))
+                       fill_rand_buf(io_u, td->max_bs);
+
                io_u->index = i;
                list_add(&io_u->list, &td->io_u_freelist);
        }
@@ -516,6 +534,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+");
@@ -684,7 +705,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);