projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
io_u: reset file to initial offset
[fio.git]
/
io_u.c
diff --git
a/io_u.c
b/io_u.c
index 88f35c916078f8d92f2e50ff70eef3a88b0f46a1..81ee724b7357a36651d4d6001bcf31c23b3853e9 100644
(file)
--- a/
io_u.c
+++ b/
io_u.c
@@
-20,7
+20,7
@@
struct io_completion_data {
int error; /* output */
uint64_t bytes_done[DDIR_RWDIR_CNT]; /* output */
int error; /* output */
uint64_t bytes_done[DDIR_RWDIR_CNT]; /* output */
- struct time
val time;
/* output */
+ struct time
spec time;
/* output */
};
/*
};
/*
@@
-37,7
+37,7
@@
static bool random_map_free(struct fio_file *f, const uint64_t block)
*/
static void mark_random_map(struct thread_data *td, struct io_u *io_u)
{
*/
static void mark_random_map(struct thread_data *td, struct io_u *io_u)
{
- unsigned int min_bs = td->o.
rw_min_bs
;
+ unsigned int min_bs = td->o.
min_bs[io_u->ddir]
;
struct fio_file *f = io_u->file;
unsigned int nr_blocks;
uint64_t block;
struct fio_file *f = io_u->file;
unsigned int nr_blocks;
uint64_t block;
@@
-323,6
+323,17
@@
fetch:
goto fetch;
}
goto fetch;
}
+static void loop_cache_invalidate(struct thread_data *td, struct fio_file *f)
+{
+ struct thread_options *o = &td->o;
+
+ if (o->invalidate_cache && !o->odirect) {
+ int fio_unused ret;
+
+ ret = file_invalidate_cache(td, f);
+ }
+}
+
static int get_next_rand_block(struct thread_data *td, struct fio_file *f,
enum fio_ddir ddir, uint64_t *b)
{
static int get_next_rand_block(struct thread_data *td, struct fio_file *f,
enum fio_ddir ddir, uint64_t *b)
{
@@
-334,6
+345,7
@@
static int get_next_rand_block(struct thread_data *td, struct fio_file *f,
fio_file_reset(td, f);
if (!get_next_rand_offset(td, f, ddir, b))
return 0;
fio_file_reset(td, f);
if (!get_next_rand_offset(td, f, ddir, b))
return 0;
+ loop_cache_invalidate(td, f);
}
dprint(FD_IO, "%s: rand offset failed, last=%llu, size=%llu\n",
}
dprint(FD_IO, "%s: rand offset failed, last=%llu, size=%llu\n",
@@
-349,15
+361,14
@@
static int get_next_seq_offset(struct thread_data *td, struct fio_file *f,
assert(ddir_rw(ddir));
assert(ddir_rw(ddir));
+ /*
+ * If we reach the end for a time based run, reset us back to 0
+ * and invalidate the cache, if we need to.
+ */
if (f->last_pos[ddir] >= f->io_size + get_start_offset(td, f) &&
o->time_based) {
if (f->last_pos[ddir] >= f->io_size + get_start_offset(td, f) &&
o->time_based) {
- struct thread_options *o = &td->o;
- uint64_t io_size = f->io_size + (f->io_size % o->min_bs[ddir]);
-
- if (io_size > f->last_pos[ddir])
- f->last_pos[ddir] = 0;
- else
- f->last_pos[ddir] = f->last_pos[ddir] - io_size;
+ f->last_pos[ddir] = f->file_offset;
+ loop_cache_invalidate(td, f);
}
if (f->last_pos[ddir] < f->real_file_size) {
}
if (f->last_pos[ddir] < f->real_file_size) {
@@
-552,9
+563,9
@@
static unsigned int __get_next_buflen(struct thread_data *td, struct io_u *io_u,
if (!io_u_fits(td, io_u, minbs))
return 0;
if (!io_u_fits(td, io_u, minbs))
return 0;
- frand_max = rand_max(&td->bsrange_state);
+ frand_max = rand_max(&td->bsrange_state
[ddir]
);
do {
do {
- r = __rand(&td->bsrange_state);
+ r = __rand(&td->bsrange_state
[ddir]
);
if (!td->o.bssplit_nr[ddir]) {
buflen = 1 + (unsigned int) ((double) maxbs *
if (!td->o.bssplit_nr[ddir]) {
buflen = 1 + (unsigned int) ((double) maxbs *
@@
-662,7
+673,7
@@
int io_u_quiesce(struct thread_data *td)
static enum fio_ddir rate_ddir(struct thread_data *td, enum fio_ddir ddir)
{
enum fio_ddir odir = ddir ^ 1;
static enum fio_ddir rate_ddir(struct thread_data *td, enum fio_ddir ddir)
{
enum fio_ddir odir = ddir ^ 1;
-
long
usec;
+
uint64_t
usec;
uint64_t now;
assert(ddir_rw(ddir));
uint64_t now;
assert(ddir_rw(ddir));
@@
-989,11
+1000,52
@@
void io_u_mark_depth(struct thread_data *td, unsigned int nr)
td->ts.io_u_map[idx] += nr;
}
td->ts.io_u_map[idx] += nr;
}
-static void io_u_mark_lat_
usec(struct thread_data *td, unsigned long u
sec)
+static void io_u_mark_lat_
nsec(struct thread_data *td, unsigned long long n
sec)
{
int idx = 0;
{
int idx = 0;
- assert(usec < 1000);
+ assert(nsec < 1000);
+
+ switch (nsec) {
+ case 750 ... 999:
+ idx = 9;
+ break;
+ case 500 ... 749:
+ idx = 8;
+ break;
+ case 250 ... 499:
+ idx = 7;
+ break;
+ case 100 ... 249:
+ idx = 6;
+ break;
+ case 50 ... 99:
+ idx = 5;
+ break;
+ case 20 ... 49:
+ idx = 4;
+ break;
+ case 10 ... 19:
+ idx = 3;
+ break;
+ case 4 ... 9:
+ idx = 2;
+ break;
+ case 2 ... 3:
+ idx = 1;
+ case 0 ... 1:
+ break;
+ }
+
+ assert(idx < FIO_IO_U_LAT_N_NR);
+ td->ts.io_u_lat_n[idx]++;
+}
+
+static void io_u_mark_lat_usec(struct thread_data *td, unsigned long long usec)
+{
+ int idx = 0;
+
+ assert(usec < 1000 && usec >= 1);
switch (usec) {
case 750 ... 999:
switch (usec) {
case 750 ... 999:
@@
-1030,10
+1082,12
@@
static void io_u_mark_lat_usec(struct thread_data *td, unsigned long usec)
td->ts.io_u_lat_u[idx]++;
}
td->ts.io_u_lat_u[idx]++;
}
-static void io_u_mark_lat_msec(struct thread_data *td, unsigned long msec)
+static void io_u_mark_lat_msec(struct thread_data *td, unsigned long
long
msec)
{
int idx = 0;
{
int idx = 0;
+ assert(msec >= 1);
+
switch (msec) {
default:
idx = 11;
switch (msec) {
default:
idx = 11;
@@
-1075,12
+1129,14
@@
static void io_u_mark_lat_msec(struct thread_data *td, unsigned long msec)
td->ts.io_u_lat_m[idx]++;
}
td->ts.io_u_lat_m[idx]++;
}
-static void io_u_mark_latency(struct thread_data *td, unsigned long
u
sec)
+static void io_u_mark_latency(struct thread_data *td, unsigned long
long n
sec)
{
{
- if (usec < 1000)
- io_u_mark_lat_usec(td, usec);
+ if (nsec < 1000)
+ io_u_mark_lat_nsec(td, nsec);
+ else if (nsec < 1000000)
+ io_u_mark_lat_usec(td, nsec / 1000);
else
else
- io_u_mark_lat_msec(td,
usec / 1
000);
+ io_u_mark_lat_msec(td,
nsec / 1000
000);
}
static unsigned int __get_next_fileno_rand(struct thread_data *td)
}
static unsigned int __get_next_fileno_rand(struct thread_data *td)
@@
-1557,7
+1613,7
@@
static void small_content_scramble(struct io_u *io_u)
unsigned int i, nr_blocks = io_u->buflen / 512;
uint64_t boffset;
unsigned int offset;
unsigned int i, nr_blocks = io_u->buflen / 512;
uint64_t boffset;
unsigned int offset;
-
void
*p, *end;
+
char
*p, *end;
if (!nr_blocks)
return;
if (!nr_blocks)
return;
@@
-1572,7
+1628,7
@@
static void small_content_scramble(struct io_u *io_u)
* the buffer, given by the product of the usec time
* and the actual offset.
*/
* the buffer, given by the product of the usec time
* and the actual offset.
*/
- offset = (
io_u->start_time.tv_usec
^ boffset) & 511;
+ offset = (
(io_u->start_time.tv_nsec/1000)
^ boffset) & 511;
offset &= ~(sizeof(uint64_t) - 1);
if (offset >= 512 - sizeof(uint64_t))
offset -= sizeof(uint64_t);
offset &= ~(sizeof(uint64_t) - 1);
if (offset >= 512 - sizeof(uint64_t))
offset -= sizeof(uint64_t);
@@
-1674,8
+1730,10
@@
out:
if (!td_io_prep(td, io_u)) {
if (!td->o.disable_lat)
fio_gettime(&io_u->start_time, NULL);
if (!td_io_prep(td, io_u)) {
if (!td->o.disable_lat)
fio_gettime(&io_u->start_time, NULL);
+
if (do_scramble)
small_content_scramble(io_u);
if (do_scramble)
small_content_scramble(io_u);
+
return io_u;
}
err_put:
return io_u;
}
err_put:
@@
-1727,46
+1785,46
@@
static void account_io_completion(struct thread_data *td, struct io_u *io_u,
const enum fio_ddir idx, unsigned int bytes)
{
const int no_reduce = !gtod_reduce(td);
const enum fio_ddir idx, unsigned int bytes)
{
const int no_reduce = !gtod_reduce(td);
- unsigned long l
u
sec = 0;
+ unsigned long l
ong lln
sec = 0;
if (td->parent)
td = td->parent;
if (td->parent)
td = td->parent;
- if (!td->o.stats)
+ if (!td->o.stats
|| td_ioengine_flagged(td, FIO_NOSTATS)
)
return;
if (no_reduce)
return;
if (no_reduce)
- l
usec = u
time_since(&io_u->issue_time, &icd->time);
+ l
lnsec = n
time_since(&io_u->issue_time, &icd->time);
if (!td->o.disable_lat) {
if (!td->o.disable_lat) {
- unsigned long
tu
sec;
+ unsigned long
long tn
sec;
- t
usec = u
time_since(&io_u->start_time, &icd->time);
- add_lat_sample(td, idx, t
u
sec, bytes, io_u->offset);
+ t
nsec = n
time_since(&io_u->start_time, &icd->time);
+ add_lat_sample(td, idx, t
n
sec, bytes, io_u->offset);
if (td->flags & TD_F_PROFILE_OPS) {
struct prof_io_ops *ops = &td->prof_io_ops;
if (ops->io_u_lat)
if (td->flags & TD_F_PROFILE_OPS) {
struct prof_io_ops *ops = &td->prof_io_ops;
if (ops->io_u_lat)
- icd->error = ops->io_u_lat(td, t
usec
);
+ icd->error = ops->io_u_lat(td, t
nsec/1000
);
}
}
- if (td->o.max_latency && t
usec
> td->o.max_latency)
- lat_fatal(td, icd, t
usec
, td->o.max_latency);
- if (td->o.latency_target && t
usec
> td->o.latency_target) {
+ if (td->o.max_latency && t
nsec/1000
> td->o.max_latency)
+ lat_fatal(td, icd, t
nsec/1000
, td->o.max_latency);
+ if (td->o.latency_target && t
nsec/1000
> td->o.latency_target) {
if (lat_target_failed(td))
if (lat_target_failed(td))
- lat_fatal(td, icd, t
usec
, td->o.latency_target);
+ lat_fatal(td, icd, t
nsec/1000
, td->o.latency_target);
}
}
if (ddir_rw(idx)) {
if (!td->o.disable_clat) {
}
}
if (ddir_rw(idx)) {
if (!td->o.disable_clat) {
- add_clat_sample(td, idx, l
u
sec, bytes, io_u->offset);
- io_u_mark_latency(td, l
u
sec);
+ add_clat_sample(td, idx, l
ln
sec, bytes, io_u->offset);
+ io_u_mark_latency(td, l
ln
sec);
}
if (!td->o.disable_bw && per_unit_log(td->bw_log))
}
if (!td->o.disable_bw && per_unit_log(td->bw_log))
- add_bw_sample(td, io_u, bytes, l
u
sec);
+ add_bw_sample(td, io_u, bytes, l
ln
sec);
if (no_reduce && per_unit_log(td->iops_log))
add_iops_sample(td, io_u, bytes);
if (no_reduce && per_unit_log(td->iops_log))
add_iops_sample(td, io_u, bytes);
@@
-1998,7
+2056,7
@@
void io_u_queued(struct thread_data *td, struct io_u *io_u)
if (!td->o.disable_slat && ramp_time_over(td) && td->o.stats) {
unsigned long slat_time;
if (!td->o.disable_slat && ramp_time_over(td) && td->o.stats) {
unsigned long slat_time;
- slat_time =
u
time_since(&io_u->start_time, &io_u->issue_time);
+ slat_time =
n
time_since(&io_u->start_time, &io_u->issue_time);
if (td->parent)
td = td->parent;
if (td->parent)
td = td->parent;
@@
-2043,6
+2101,9
@@
void fill_io_buffer(struct thread_data *td, void *buf, unsigned int min_write,
{
struct thread_options *o = &td->o;
{
struct thread_options *o = &td->o;
+ if (o->mem_type == MEM_CUDA_MALLOC)
+ return;
+
if (o->compress_percentage || o->dedupe_percentage) {
unsigned int perc = td->o.compress_percentage;
struct frand_state *rs;
if (o->compress_percentage || o->dedupe_percentage) {
unsigned int perc = td->o.compress_percentage;
struct frand_state *rs;
@@
-2138,7
+2199,7
@@
int do_io_u_trim(const struct thread_data *td, struct io_u *io_u)
struct fio_file *f = io_u->file;
int ret;
struct fio_file *f = io_u->file;
int ret;
- ret = os_trim(f
->fd
, io_u->offset, io_u->xfer_buflen);
+ ret = os_trim(f, io_u->offset, io_u->xfer_buflen);
if (!ret)
return io_u->xfer_buflen;
if (!ret)
return io_u->xfer_buflen;