lfsr: ensure that the cycle follows the randrepeat= setting
authorJens Axboe <axboe@kernel.dk>
Tue, 4 Dec 2012 12:12:25 +0000 (13:12 +0100)
committerJens Axboe <axboe@kernel.dk>
Tue, 4 Dec 2012 12:12:25 +0000 (13:12 +0100)
Use the regular block offset seed to "seed" the lfsr generator,
so that it obeys randrepeat=0/1 as well.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
filesetup.c
lib/lfsr.c
lib/lfsr.h

index 9fb325bd18b392f1c1419a01a6518b34da6d90fb..f4e1adcb01a10ae22c352cfe75a3a351305ccba1 100644 (file)
@@ -918,7 +918,11 @@ int init_random_map(struct thread_data *td)
                blocks = (f->real_file_size + td->o.rw_min_bs - 1) /
                                (unsigned long long) td->o.rw_min_bs;
                if (td->o.random_generator == FIO_RAND_GEN_LFSR) {
-                       if (!lfsr_init(&f->lfsr, blocks))
+                       unsigned long seed;
+
+                       seed = td->rand_seeds[FIO_RAND_BLOCK_OFF];
+                       
+                       if (!lfsr_init(&f->lfsr, blocks, seed))
                                continue;
                } else if (!td->o.norandommap) {
                        f->io_axmap = axmap_new(blocks);
index 01c97cb80b1df7a7c8bfa6f9d84f7e366f286390..8a70029627a34ccbec53a104f879c94ec6498234 100644 (file)
@@ -243,7 +243,7 @@ static struct lfsr_taps *find_lfsr(uint64_t size)
        return NULL;
 }
 
-int lfsr_init(struct fio_lfsr *fl, uint64_t size)
+int lfsr_init(struct fio_lfsr *fl, uint64_t size, unsigned long seed)
 {
        struct lfsr_taps *tap;
        int i;
@@ -252,7 +252,7 @@ int lfsr_init(struct fio_lfsr *fl, uint64_t size)
        if (!tap)
                return 1;
 
-       fl->last_val = 1;
+       fl->last_val = seed;
        fl->max_val = size - 1;
        fl->num_vals = 0;
        fl->taps.length = tap->length;
index 0de9ea8e3c09a10a4b411d69d9fb30b569733f76..09f5ac0bd3d73f63541a16ea46778a9d5cecf178 100644 (file)
@@ -19,6 +19,6 @@ struct fio_lfsr {
 };
 
 int lfsr_next(struct fio_lfsr *fl, uint64_t *off);
-int lfsr_init(struct fio_lfsr *fl, uint64_t size);
+int lfsr_init(struct fio_lfsr *fl, uint64_t size, unsigned long seed);
 
 #endif