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 {
};
/*
- * 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
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
/*
seed = td->rand_seeds[FIO_RAND_BLOCK_OFF];
- if (!lfsr_init(&f->lfsr, blocks, seed, 0))
+ if (!lfsr_init(&f->lfsr, blocks, seed, 0)) {
+ fio_file_set_lfsr(f);
continue;
+ }
} else if (!td->o.norandommap) {
f->io_axmap = axmap_new(blocks);
- if (f->io_axmap)
+ if (f->io_axmap) {
+ fio_file_set_axmap(f);
continue;
+ }
} else if (td->o.norandommap)
continue;
sfree(f->file_name);
f->file_name = NULL;
- axmap_free(f->io_axmap);
- f->io_axmap = NULL;
+ if (fio_file_axmap(f)) {
+ axmap_free(f->io_axmap);
+ f->io_axmap = NULL;
+ }
sfree(f);
}
f->last_start[i] = -1ULL;
}
- if (f->io_axmap)
+ if (fio_file_axmap(f))
axmap_reset(f->io_axmap);
- if (td->o.random_generator == FIO_RAND_GEN_LFSR)
+ else if (fio_file_lfsr(f))
lfsr_reset(&f->lfsr, td->rand_seeds[FIO_RAND_BLOCK_OFF]);
}
#define td_trim(td) ((td)->o.td_ddir & TD_DDIR_TRIM)
#define td_rw(td) (((td)->o.td_ddir & TD_DDIR_RW) == TD_DDIR_RW)
#define td_random(td) ((td)->o.td_ddir & TD_DDIR_RAND)
-#define file_randommap(td, f) (!(td)->o.norandommap && (f)->io_axmap)
+#define file_randommap(td, f) (!(td)->o.norandommap && fio_file_axmap((f)))
static inline int ddir_sync(enum fio_ddir ddir)
{
} else {
uint64_t off = 0;
+ assert(fio_file_lfsr(f));
+
if (lfsr_next(&f->lfsr, &off))
return 1;