Scramble default write buffer contents slightly
authorJens Axboe <axboe@kernel.dk>
Fri, 16 Sep 2011 20:11:23 +0000 (22:11 +0200)
committerJens Axboe <jaxboe@fusionio.com>
Fri, 16 Sep 2011 20:13:54 +0000 (22:13 +0200)
If we are worried about de-dupe making the output data too easy
to compress, but don't want the full incompressible guarantee
provided by refill_buffers=1 (since it's too costly), then lets
make their life a little harder by filling the offset of the IO
into the beginning of the buffer and the start time at the end
of the buffer. This will effectively default simple de-dupe
or compression attempts, while not doing the costly full buffer
refill.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_u.c

diff --git a/io_u.c b/io_u.c
index a87c58e32791e35cfbb770c705a2c34c9b41ee17..af2d05f360eaed2f4d6c169f6ee5eb5f62da18f8 100644 (file)
--- a/io_u.c
+++ b/io_u.c
@@ -1120,6 +1120,19 @@ static int check_get_verify(struct thread_data *td, struct io_u *io_u)
        return 0;
 }
 
        return 0;
 }
 
+/*
+ * Fill offset and start time into the buffer content, to prevent too
+ * easy compressible data for simple de-dupe attempts.
+ */
+static void small_content_scramble(struct io_u *io_u)
+{
+       void *end;
+
+       *((unsigned long long *) io_u->xfer_buf) = io_u->offset;
+       end = io_u->xfer_buf + io_u->xfer_buflen - sizeof(io_u->start_time);
+       memcpy(end, &io_u->start_time, sizeof(io_u->start_time));
+}
+
 /*
  * Return an io_u to be processed. Gets a buflen and offset, sets direction,
  * etc. The returned io_u is fully ready to be prepped and submitted.
 /*
  * Return an io_u to be processed. Gets a buflen and offset, sets direction,
  * etc. The returned io_u is fully ready to be prepped and submitted.
@@ -1128,6 +1141,7 @@ struct io_u *get_io_u(struct thread_data *td)
 {
        struct fio_file *f;
        struct io_u *io_u;
 {
        struct fio_file *f;
        struct io_u *io_u;
+       int do_scramble = 0;
 
        io_u = __get_io_u(td);
        if (!io_u) {
 
        io_u = __get_io_u(td);
        if (!io_u) {
@@ -1173,6 +1187,8 @@ struct io_u *get_io_u(struct thread_data *td)
                        populate_verify_io_u(td, io_u);
                else if (td->o.refill_buffers && io_u->ddir == DDIR_WRITE)
                        io_u_fill_buffer(td, io_u, io_u->xfer_buflen);
                        populate_verify_io_u(td, io_u);
                else if (td->o.refill_buffers && io_u->ddir == DDIR_WRITE)
                        io_u_fill_buffer(td, io_u, io_u->xfer_buflen);
+               else if (io_u->ddir == DDIR_WRITE)
+                       do_scramble = 1;
                else if (io_u->ddir == DDIR_READ) {
                        /*
                         * Reset the buf_filled parameters so next time if the
                else if (io_u->ddir == DDIR_READ) {
                        /*
                         * Reset the buf_filled parameters so next time if the
@@ -1193,6 +1209,8 @@ out:
        if (!td_io_prep(td, io_u)) {
                if (!td->o.disable_slat)
                        fio_gettime(&io_u->start_time, NULL);
        if (!td_io_prep(td, io_u)) {
                if (!td->o.disable_slat)
                        fio_gettime(&io_u->start_time, NULL);
+               if (do_scramble)
+                       small_content_scramble(io_u);
                return io_u;
        }
 err_put:
                return io_u;
        }
 err_put: