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>
}
}
+/*
+ * 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);