unsigned long long ret, sized;
long r;
- r = os_random_long(&td->file_size_state);
- sized = td->o.file_size_high - td->o.file_size_low;
- ret = (unsigned long long) ((double) sized * (r / (OS_RAND_MAX + 1.0)));
+ if (td->o.use_os_rand) {
+ r = os_random_long(&td->file_size_state);
+ sized = td->o.file_size_high - td->o.file_size_low;
+ ret = (unsigned long long) ((double) sized * (r / (OS_RAND_MAX + 1.0)));
+ } else {
+ r = __rand(&td->__file_size_state);
+ sized = td->o.file_size_high - td->o.file_size_low;
+ ret = (unsigned long long) ((double) sized * (r / (FRAND_MAX + 1.0)));
+ }
+
ret += td->o.file_size_low;
ret -= (ret % td->o.rw_min_bs);
return ret;
union {
unsigned int next_file;
os_random_state_t next_file_state;
+ struct frand_state __next_file_state;
};
int error;
int done;
unsigned long rand_seeds[7];
- os_random_state_t bsrange_state;
- os_random_state_t verify_state;
- os_random_state_t trim_state;
+ union {
+ os_random_state_t bsrange_state;
+ struct frand_state __bsrange_state;
+ };
+ union {
+ os_random_state_t verify_state;
+ struct frand_state __verify_state;
+ };
+ union {
+ os_random_state_t trim_state;
+ struct frand_state __trim_state;
+ };
unsigned int verify_batch;
unsigned int trim_batch;
/*
* State for random io, a bitmap of blocks done vs not done
*/
- os_random_state_t random_state;
- struct frand_state __random_state;
+ union {
+ os_random_state_t random_state;
+ struct frand_state __random_state;
+ };
struct timeval start; /* start of this loop */
struct timeval epoch; /* time job was started */
/*
* read/write mixed workload state
*/
- os_random_state_t rwmix_state;
+ union {
+ os_random_state_t rwmix_state;
+ struct frand_state __rwmix_state;
+ };
unsigned long rwmix_issues;
enum fio_ddir rwmix_ddir;
unsigned int ddir_seq_nr;
/*
* For generating file sizes
*/
- os_random_state_t file_size_state;
+ union {
+ os_random_state_t file_size_state;
+ struct frand_state __file_size_state;
+ };
/*
* Error counts
return 1;
}
-void td_fill_rand_seeds(struct thread_data *td)
+static void td_fill_rand_seeds_os(struct thread_data *td)
{
os_random_seed(td->rand_seeds[0], &td->bsrange_state);
os_random_seed(td->rand_seeds[1], &td->verify_state);
td->rand_seeds[4] = FIO_RANDSEED * td->thread_number;
os_random_seed(td->rand_seeds[4], &td->random_state);
+}
+
+static void td_fill_rand_seeds_internal(struct thread_data *td)
+{
+ init_rand_seed(&td->__bsrange_state, td->rand_seeds[0]);
+ init_rand_seed(&td->__verify_state, td->rand_seeds[1]);
+ init_rand_seed(&td->__rwmix_state, td->rand_seeds[2]);
+
+ if (td->o.file_service_type == FIO_FSERVICE_RANDOM)
+ init_rand_seed(&td->__next_file_state, td->rand_seeds[3]);
+
+ init_rand_seed(&td->__file_size_state, td->rand_seeds[5]);
+ init_rand_seed(&td->__trim_state, td->rand_seeds[6]);
+
+ if (!td_random(td))
+ return;
+
+ if (td->o.rand_repeatable)
+ td->rand_seeds[4] = FIO_RANDSEED * td->thread_number;
+
init_rand_seed(&td->__random_state, td->rand_seeds[4]);
}
+void td_fill_rand_seeds(struct thread_data *td)
+{
+ if (td->o.use_os_rand)
+ td_fill_rand_seeds_os(td);
+ else
+ td_fill_rand_seeds_internal(td);
+}
+
/*
* Initialize the various random states we need (random io, block size ranges,
* read/write mix, etc).
const int ddir = io_u->ddir;
unsigned int uninitialized_var(buflen);
unsigned int minbs, maxbs;
- long r;
+ long r, rand_max;
assert(ddir_rw(ddir));
minbs = td->o.min_bs[ddir];
maxbs = td->o.max_bs[ddir];
+ if (td->o.use_os_rand)
+ rand_max = OS_RAND_MAX;
+ else
+ rand_max = FRAND_MAX;
+
if (minbs == maxbs)
buflen = minbs;
else {
- r = os_random_long(&td->bsrange_state);
+ if (td->o.use_os_rand)
+ r = os_random_long(&td->bsrange_state);
+ else
+ r = __rand(&td->__bsrange_state);
+
if (!td->o.bssplit_nr[ddir]) {
buflen = 1 + (unsigned int) ((double) maxbs *
- (r / (OS_RAND_MAX + 1.0)));
+ (r / (rand_max + 1.0)));
if (buflen < minbs)
buflen = minbs;
} else {
buflen = bsp->bs;
perc += bsp->perc;
- if (r <= ((OS_RAND_MAX / 100L) * perc))
+ if (r <= ((rand_max / 100L) * perc))
break;
}
}
unsigned int v;
long r;
- r = os_random_long(&td->rwmix_state);
- v = 1 + (int) (100.0 * (r / (OS_RAND_MAX + 1.0)));
+ if (td->o.use_os_rand) {
+ r = os_random_long(&td->rwmix_state);
+ v = 1 + (int) (100.0 * (r / (OS_RAND_MAX + 1.0)));
+ } else {
+ r = __rand(&td->__rwmix_state);
+ v = 1 + (int) (100.0 * (r / (FRAND_MAX + 1.0)));
+ }
+
if (v <= td->o.rwmix[DDIR_READ])
return DDIR_READ;
int fno;
do {
- long r = os_random_long(&td->next_file_state);
int opened = 0;
+ long r;
+
+ if (td->o.use_os_rand) {
+ r = os_random_long(&td->next_file_state);
+ fno = (unsigned int) ((double) td->o.nr_files
+ * (r / (OS_RAND_MAX + 1.0)));
+ } else {
+ r = __rand(&td->__next_file_state);
+ fno = (unsigned int) ((double) td->o.nr_files
+ * (r / (FRAND_MAX + 1.0)));
+ }
- fno = (unsigned int) ((double) td->o.nr_files
- * (r / (OS_RAND_MAX + 1.0)));
f = td->files[fno];
if (fio_file_done(f))
continue;
if (!td->o.trim_percentage)
return 0;
- r = os_random_long(&td->trim_state);
- val = (OS_RAND_MAX / 100ULL);
- val *= (unsigned long long) td->o.trim_percentage;
+ if (td->o.use_os_rand) {
+ r = os_random_long(&td->trim_state);
+ val = (OS_RAND_MAX / 100ULL);
+ } else {
+ r = __rand(&td->__trim_state);
+ val = (FRAND_MAX / 100ULL);
+ }
+ val *= (unsigned long long) td->o.trim_percentage;
return r <= val;
}
#endif