projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Only populate the write buffer if necessary
[fio.git]
/
io_u.c
diff --git
a/io_u.c
b/io_u.c
index a37b723e7f03124c48508b26cc64bd8786d37a6c..5fbb2386237de6ba8aa106917e9f222ae564e014 100644
(file)
--- a/
io_u.c
+++ b/
io_u.c
@@
-1,12
+1,8
@@
#include <unistd.h>
#include <unistd.h>
-#include <fcntl.h>
#include <string.h>
#include <string.h>
-#include <signal.h>
-#include <time.h>
#include <assert.h>
#include "fio.h"
#include <assert.h>
#include "fio.h"
-#include "hash.h"
#include "verify.h"
#include "trim.h"
#include "lib/rand.h"
#include "verify.h"
#include "trim.h"
#include "lib/rand.h"
@@
-430,7
+426,11
@@
static int get_next_seq_offset(struct thread_data *td, struct fio_file *f,
if (f->last_pos[ddir] < f->real_file_size) {
uint64_t pos;
if (f->last_pos[ddir] < f->real_file_size) {
uint64_t pos;
- if (f->last_pos[ddir] == f->file_offset && o->ddir_seq_add < 0) {
+ /*
+ * Only rewind if we already hit the end
+ */
+ if (f->last_pos[ddir] == f->file_offset &&
+ f->file_offset && o->ddir_seq_add < 0) {
if (f->real_file_size > f->io_size)
f->last_pos[ddir] = f->io_size;
else
if (f->real_file_size > f->io_size)
f->last_pos[ddir] = f->io_size;
else
@@
-852,8
+852,8
@@
void put_io_u(struct thread_data *td, struct io_u *io_u)
assert(!(td->flags & TD_F_CHILD));
}
io_u_qpush(&td->io_u_freelist, io_u);
assert(!(td->flags & TD_F_CHILD));
}
io_u_qpush(&td->io_u_freelist, io_u);
- td_io_u_unlock(td);
td_io_u_free_notify(td);
td_io_u_free_notify(td);
+ td_io_u_unlock(td);
}
void clear_io_u(struct thread_data *td, struct io_u *io_u)
}
void clear_io_u(struct thread_data *td, struct io_u *io_u)
@@
-885,8
+885,8
@@
void requeue_io_u(struct thread_data *td, struct io_u **io_u)
}
io_u_rpush(&td->io_u_requeues, __io_u);
}
io_u_rpush(&td->io_u_requeues, __io_u);
- td_io_u_unlock(td);
td_io_u_free_notify(td);
td_io_u_free_notify(td);
+ td_io_u_unlock(td);
*io_u = NULL;
}
*io_u = NULL;
}
@@
-1554,6
+1554,7
@@
bool queue_full(const struct thread_data *td)
struct io_u *__get_io_u(struct thread_data *td)
{
struct io_u *io_u = NULL;
struct io_u *__get_io_u(struct thread_data *td)
{
struct io_u *io_u = NULL;
+ int ret;
if (td->stop_io)
return NULL;
if (td->stop_io)
return NULL;
@@
-1590,7
+1591,8
@@
again:
* return one
*/
assert(!(td->flags & TD_F_CHILD));
* return one
*/
assert(!(td->flags & TD_F_CHILD));
- assert(!pthread_cond_wait(&td->free_cond, &td->io_u_lock));
+ ret = pthread_cond_wait(&td->free_cond, &td->io_u_lock);
+ assert(ret == 0);
goto again;
}
goto again;
}
@@
-1697,7
+1699,7
@@
static void small_content_scramble(struct io_u *io_u)
/*
* Return an io_u to be processed. Gets a buflen and offset, sets direction,
/*
* Return an io_u to be processed. Gets a buflen and offset, sets direction,
- * etc. The returned io_u is fully ready to be prepped and submitted.
+ * etc. The returned io_u is fully ready to be prepped
, populated
and submitted.
*/
struct io_u *get_io_u(struct thread_data *td)
{
*/
struct io_u *get_io_u(struct thread_data *td)
{
@@
-1758,12
+1760,9
@@
struct io_u *get_io_u(struct thread_data *td)
td->o.min_bs[DDIR_WRITE],
io_u->buflen);
} else if ((td->flags & TD_F_SCRAMBLE_BUFFERS) &&
td->o.min_bs[DDIR_WRITE],
io_u->buflen);
} else if ((td->flags & TD_F_SCRAMBLE_BUFFERS) &&
- !(td->flags & TD_F_COMPRESS))
+ !(td->flags & TD_F_COMPRESS) &&
+ !(td->flags & TD_F_DO_VERIFY))
do_scramble = 1;
do_scramble = 1;
- if (td->flags & TD_F_VER_NONE) {
- populate_verify_io_u(td, io_u);
- do_scramble = 0;
- }
} else if (io_u->ddir == DDIR_READ) {
/*
* Reset the buf_filled parameters so next time if the
} else if (io_u->ddir == DDIR_READ) {
/*
* Reset the buf_filled parameters so next time if the