lfsr: Fix spin related bug
authorAlex Pyrgiotis <apyrgio@grnet.gr>
Sun, 10 Mar 2013 09:58:05 +0000 (10:58 +0100)
committerJens Axboe <axboe@kernel.dk>
Sun, 10 Mar 2013 09:58:05 +0000 (10:58 +0100)
On the previous patch on cycle detection, we would incremet spin value
when:

    num_vals % cycle_length == 0

which would evaluate always to true for the first iteration since we
start with num_vals = 0. Only one corner-case is affected by this bug
and this patch should fix it.

Signed-off-by: Alex Pyrgiotis <apyrgio@grnet.gr>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
lib/lfsr.c

index a83540494fc1964aebb7d89fad86a730030ab211..4c15c6256f9a1d41ab95a1bfdb0d8e59fb92796a 100644 (file)
@@ -108,22 +108,28 @@ static inline void __lfsr_next(struct fio_lfsr *fl, unsigned int spin)
        }
 }
 
+/*
+ * lfsr_next does the following:
+ *
+ * a. Return if the number of max values has been exceeded.
+ * b. Check if the next iteration(s) produce a cycle (due to spin) and add "1"
+ *    where necessary.
+ * c. Calculate the next value and return.
+ */
 int lfsr_next(struct fio_lfsr *fl, uint64_t *off, uint64_t last)
 {
        int repeat;
        unsigned int spin;
 
+       if (fl->num_vals++ > fl->max_val)
+               return 1;
+
        repeat = fl->num_vals % fl->cycle_length;
        if (repeat == 0)
                spin = fl->spin + 1;
        else
                spin = fl->spin;
 
-       if (fl->num_vals > fl->max_val)
-               return 1;
-
-       fl->num_vals++;
-
        do {
                __lfsr_next(fl, spin);
        } while (fl->last_val > fl->max_val);