Add support for non-uniformly random file service type
[fio.git] / file.h
diff --git a/file.h b/file.h
index bb303103048cd847e3918efc18c98efbda1950fb..0cf622fcbb213a7922ecb96a8e7b7f88bd76b2f2 100644 (file)
--- a/file.h
+++ b/file.h
@@ -8,6 +8,7 @@
 #include "lib/zipf.h"
 #include "lib/axmap.h"
 #include "lib/lfsr.h"
+#include "lib/gauss.h"
 
 /*
  * The type of object we are working on
@@ -27,6 +28,8 @@ enum fio_file_flags {
        FIO_FILE_size_known     = 1 << 4,       /* size has been set */
        FIO_FILE_hashed         = 1 << 5,       /* file is on hash */
        FIO_FILE_partial_mmap   = 1 << 6,       /* can't do full mmap */
+       FIO_FILE_axmap          = 1 << 7,       /* uses axmap */
+       FIO_FILE_lfsr           = 1 << 8,       /* lfsr is used */
 };
 
 enum file_lock_mode {
@@ -36,13 +39,20 @@ enum file_lock_mode {
 };
 
 /*
- * roundrobin available files, or choose one at random, or do each one
- * serially.
+ * How fio chooses what file to service next. Choice of uniformly random, or
+ * some skewed random variants, or just sequentially go through them or
+ * roundrobing.
  */
 enum {
-       FIO_FSERVICE_RANDOM     = 1,
-       FIO_FSERVICE_RR         = 2,
-       FIO_FSERVICE_SEQ        = 3,
+       FIO_FSERVICE_RANDOM             = 1,
+       FIO_FSERVICE_RR                 = 2,
+       FIO_FSERVICE_SEQ                = 3,
+       __FIO_FSERVICE_NONUNIFORM       = 0x100,
+       FIO_FSERVICE_ZIPF               = __FIO_FSERVICE_NONUNIFORM | 4,
+       FIO_FSERVICE_PARETO             = __FIO_FSERVICE_NONUNIFORM | 5,
+       FIO_FSERVICE_GAUSS              = __FIO_FSERVICE_NONUNIFORM | 6,
+
+       FIO_FSERVICE_SHIFT              = 10,
 };
 
 /*
@@ -73,13 +83,10 @@ struct fio_file {
        /*
         * filename and possible memory mapping
         */
-       char *file_name;
        unsigned int major, minor;
        int fileno;
-
-       void *mmap_ptr;
-       size_t mmap_sz;
-       off_t mmap_off;
+       int bs;
+       char *file_name;
 
        /*
         * size of the file, offset into file, and io size from that offset
@@ -97,6 +104,13 @@ struct fio_file {
        uint64_t first_write;
        uint64_t last_write;
 
+       /*
+        * Tracks the last iodepth number of completed writes, if data
+        * verification is enabled
+        */
+       uint64_t *last_write_comp;
+       unsigned int last_write_idx;
+
        /*
         * For use by the io engine
         */
@@ -111,16 +125,20 @@ struct fio_file {
        };
 
        /*
-        * block map for random io
+        * block map or LFSR for random io
         */
-       struct axmap *io_axmap;
-
-       struct fio_lfsr lfsr;
+       union {
+               struct axmap *io_axmap;
+               struct fio_lfsr lfsr;
+       };
 
        /*
         * Used for zipf random distribution
         */
-       struct zipf_state zipf;
+       union {
+               struct zipf_state zipf;
+               struct gauss_state gauss;
+       };
 
        int references;
        enum fio_file_flags flags;
@@ -128,6 +146,10 @@ struct fio_file {
        struct disk_util *du;
 };
 
+#define FILE_ENG_DATA(f)       ((void *) (uintptr_t) (f)->engine_data)
+#define FILE_SET_ENG_DATA(f, data)     \
+       ((f)->engine_data = (uintptr_t) (data))
+
 struct file_name {
        struct flist_head list;
        char *filename;
@@ -154,6 +176,8 @@ FILE_FLAG_FNS(done);
 FILE_FLAG_FNS(size_known);
 FILE_FLAG_FNS(hashed);
 FILE_FLAG_FNS(partial_mmap);
+FILE_FLAG_FNS(axmap);
+FILE_FLAG_FNS(lfsr);
 #undef FILE_FLAG_FNS
 
 /*
@@ -170,6 +194,7 @@ extern int __must_check generic_close_file(struct thread_data *, struct fio_file
 extern int __must_check generic_get_file_size(struct thread_data *, struct fio_file *);
 extern int __must_check file_lookup_open(struct fio_file *f, int flags);
 extern int __must_check pre_read_files(struct thread_data *);
+extern unsigned long long get_rand_file_size(struct thread_data *td);
 extern int add_file(struct thread_data *, const char *, int, int);
 extern int add_file_exclusive(struct thread_data *, const char *);
 extern void get_file(struct fio_file *);