From: Jens Axboe Date: Mon, 15 Dec 2014 16:38:43 +0000 (-0700) Subject: file: unionize lfsr/randommap X-Git-Tag: fio-2.2.0~15 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=967d1b631d2a69df41feca144632256e37cc5aec file: unionize lfsr/randommap We only use one of them, add file flags to distinguish between the two. Signed-off-by: Jens Axboe --- diff --git a/file.h b/file.h index 4d24bdc5..f7a1eae1 100644 --- a/file.h +++ b/file.h @@ -27,6 +27,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 { @@ -107,11 +109,12 @@ 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 @@ -154,6 +157,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 /* diff --git a/filesetup.c b/filesetup.c index c026048f..0fb5589b 100644 --- a/filesetup.c +++ b/filesetup.c @@ -1044,12 +1044,16 @@ int init_random_map(struct thread_data *td) 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; @@ -1104,8 +1108,10 @@ void close_and_free_files(struct thread_data *td) 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); } @@ -1537,9 +1543,9 @@ void fio_file_reset(struct thread_data *td, struct fio_file *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]); } diff --git a/io_ddir.h b/io_ddir.h index 269768ec..b16a6b9b 100644 --- a/io_ddir.h +++ b/io_ddir.h @@ -42,7 +42,7 @@ enum td_ddir { #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) { diff --git a/io_u.c b/io_u.c index efbcea9e..23a9e4ad 100644 --- a/io_u.c +++ b/io_u.c @@ -100,6 +100,8 @@ static int __get_next_rand_offset(struct thread_data *td, struct fio_file *f, } else { uint64_t off = 0; + assert(fio_file_lfsr(f)); + if (lfsr_next(&f->lfsr, &off)) return 1;