X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=lib%2Flfsr.c;h=1ef6ebbf1a22d39b6a4ff86d936bfebb08e32f96;hb=b57f4fd4e42672f1686fd119da522eace09d1d27;hp=329ef85a8bf7a4e9529838c201482ee0eab78641;hpb=c3afb7639f41e58e44481151e3aa4caa6be789f6;p=fio.git diff --git a/lib/lfsr.c b/lib/lfsr.c index 329ef85a..1ef6ebbf 100644 --- a/lib/lfsr.c +++ b/lib/lfsr.c @@ -1,5 +1,4 @@ #include -#include #include "lfsr.h" #include "../compiler/compiler.h" @@ -11,7 +10,7 @@ * The memory overhead of the following tap table should be relatively small, * no more than 400 bytes. */ -static uint8_t taps[64][FIO_MAX_TAPS] = +static uint8_t lfsr_taps[64][FIO_MAX_TAPS] = { {0}, {0}, {0}, //LFSRs with less that 3-bits cannot exist {3, 2}, //Tap position for 3-bit LFSR @@ -79,7 +78,7 @@ static uint8_t taps[64][FIO_MAX_TAPS] = #define __LFSR_NEXT(__fl, __v) \ __v = ((__v >> 1) | __fl->cached_bit) ^ \ - (((__v & 1UL) - 1UL) & __fl->xormask); + (((__v & 1ULL) - 1ULL) & __fl->xormask); static inline void __lfsr_next(struct fio_lfsr *fl, unsigned int spin) { @@ -89,21 +88,37 @@ static inline void __lfsr_next(struct fio_lfsr *fl, unsigned int spin) */ switch (spin) { case 15: __LFSR_NEXT(fl, fl->last_val); + /* fall through */ case 14: __LFSR_NEXT(fl, fl->last_val); + /* fall through */ case 13: __LFSR_NEXT(fl, fl->last_val); + /* fall through */ case 12: __LFSR_NEXT(fl, fl->last_val); + /* fall through */ case 11: __LFSR_NEXT(fl, fl->last_val); + /* fall through */ case 10: __LFSR_NEXT(fl, fl->last_val); + /* fall through */ case 9: __LFSR_NEXT(fl, fl->last_val); + /* fall through */ case 8: __LFSR_NEXT(fl, fl->last_val); + /* fall through */ case 7: __LFSR_NEXT(fl, fl->last_val); + /* fall through */ case 6: __LFSR_NEXT(fl, fl->last_val); + /* fall through */ case 5: __LFSR_NEXT(fl, fl->last_val); + /* fall through */ case 4: __LFSR_NEXT(fl, fl->last_val); + /* fall through */ case 3: __LFSR_NEXT(fl, fl->last_val); + /* fall through */ case 2: __LFSR_NEXT(fl, fl->last_val); + /* fall through */ case 1: __LFSR_NEXT(fl, fl->last_val); + /* fall through */ case 0: __LFSR_NEXT(fl, fl->last_val); + /* fall through */ default: break; } } @@ -124,7 +139,7 @@ static inline void __lfsr_next(struct fio_lfsr *fl, unsigned int spin) * c. Check if the calculated value exceeds the desirable range. In this case, * go back to b, else return. */ -int lfsr_next(struct fio_lfsr *fl, uint64_t *off, uint64_t last) +int lfsr_next(struct fio_lfsr *fl, uint64_t *off) { if (fl->num_vals++ > fl->max_val) return 1; @@ -147,7 +162,7 @@ static uint64_t lfsr_create_xormask(uint8_t *taps) uint64_t xormask = 0; for(i = 0; i < FIO_MAX_TAPS && taps[i] != 0; i++) - xormask |= 1UL << (taps[i] - 1); + xormask |= 1ULL << (taps[i] - 1); return xormask; } @@ -158,12 +173,12 @@ static uint8_t *find_lfsr(uint64_t size) /* * For an LFSR, there is always a prohibited state (all ones). - * Thus, if we need to find the proper LFSR for our size, we must take that - * into account. + * Thus, if we need to find the proper LFSR for our size, we must + * take that into account. */ for (i = 3; i < 64; i++) - if ((1UL << i) > size) - return taps[i]; + if ((1ULL << i) > size) + return lfsr_taps[i]; return NULL; } @@ -217,7 +232,7 @@ static int prepare_spin(struct fio_lfsr *fl, unsigned int spin) return 0; } -int lfsr_reset(struct fio_lfsr *fl, unsigned long seed) +int lfsr_reset(struct fio_lfsr *fl, uint64_t seed) { uint64_t bitmask = (fl->cached_bit << 1) - 1; @@ -231,18 +246,18 @@ int lfsr_reset(struct fio_lfsr *fl, unsigned long seed) return 0; } -int lfsr_init(struct fio_lfsr *fl, uint64_t nums, unsigned long seed, - unsigned int spin) +int lfsr_init(struct fio_lfsr *fl, uint64_t nums, uint64_t seed, + unsigned int spin) { - uint8_t *lfsr_taps; + uint8_t *taps; - lfsr_taps = find_lfsr(nums); - if (!lfsr_taps) + taps = find_lfsr(nums); + if (!taps) return 1; fl->max_val = nums - 1; - fl->xormask = lfsr_create_xormask(lfsr_taps); - fl->cached_bit = 1UL << (lfsr_taps[0] - 1); + fl->xormask = lfsr_create_xormask(taps); + fl->cached_bit = 1ULL << (taps[0] - 1); if (prepare_spin(fl, spin)) return 1;