dprint(FD_RANDOM, "free: b=%llu, idx=%u, bit=%u\n", block, idx, bit);
- return (f->file_map[idx] & (1UL << bit)) == 0;
+ return (f->file_map[idx] & (1 << bit)) == 0;
}
/*
fio_assert(td, idx < f->num_maps);
- f->file_map[idx] |= (1UL << bit);
+ f->file_map[idx] |= (1 << bit);
block++;
blocks++;
}
i = f->last_free_lookup;
*b = (i * BLOCKS_PER_MAP);
while ((*b) * min_bs < f->real_file_size) {
- if (f->file_map[i] != -1UL) {
- *b += fio_ffz(f->file_map[i]);
+ if (f->file_map[i] != (unsigned int) -1) {
+ *b += ffz(f->file_map[i]);
if (*b > last_block(td, f, ddir))
break;
f->last_free_lookup = i;
static void set_rwmix_bytes(struct thread_data *td)
{
- unsigned long issues;
unsigned int diff;
/*
* buffered writes may issue a lot quicker than they complete,
* whereas reads do not.
*/
- issues = td->io_issues[td->rwmix_ddir] - td->rwmix_issues;
diff = td->o.rwmix[td->rwmix_ddir ^ 1];
-
- td->rwmix_issues = td->io_issues[td->rwmix_ddir]
- + (issues * ((100 - diff)) / diff);
+ td->rwmix_issues = (td->io_issues[td->rwmix_ddir] * diff) / 100;
}
static inline enum fio_ddir get_rand_ddir(struct thread_data *td)
r = os_random_long(&td->rwmix_state);
v = 1 + (int) (100.0 * (r / (RAND_MAX + 1.0)));
- if (v < td->o.rwmix[DDIR_READ])
+ if (v <= td->o.rwmix[DDIR_READ])
return DDIR_READ;
return DDIR_WRITE;
{
struct io_u *__io_u = *io_u;
+ dprint(FD_IO, "requeue %p\n", __io_u);
+
__io_u->flags |= IO_U_F_FREE;
if ((__io_u->flags & IO_U_F_FLIGHT) && (__io_u->ddir != DDIR_SYNC))
td->io_issues[__io_u->ddir]--;
if (td->o.verify != VERIFY_NONE)
populate_verify_io_u(td, io_u);
+ else if (td->o.refill_buffers && io_u->ddir == DDIR_WRITE)
+ io_u_fill_buffer(td, io_u, io_u->xfer_buflen);
}
/*
io_u->xfer_buf = io_u->buf;
io_u->xfer_buflen = io_u->buflen;
- if (td->o.refill_buffers && io_u->ddir == DDIR_WRITE)
- io_u_fill_buffer(td, io_u, io_u->xfer_buflen);
out:
if (!td_io_prep(td, io_u)) {
fio_gettime(&io_u->start_time, NULL);