Merge branch 'master' of https://github.com/jan--f/fio
[fio.git] / io_u.c
1 #include <unistd.h>
2 #include <fcntl.h>
3 #include <string.h>
4 #include <signal.h>
5 #include <time.h>
6 #include <assert.h>
7
8 #include "fio.h"
9 #include "hash.h"
10 #include "verify.h"
11 #include "trim.h"
12 #include "lib/rand.h"
13 #include "lib/axmap.h"
14 #include "err.h"
15 #include "lib/pow2.h"
16 #include "minmax.h"
17
18 struct io_completion_data {
19         int nr;                         /* input */
20
21         int error;                      /* output */
22         uint64_t bytes_done[DDIR_RWDIR_CNT];    /* output */
23         struct timeval time;            /* output */
24 };
25
26 /*
27  * The ->io_axmap contains a map of blocks we have or have not done io
28  * to yet. Used to make sure we cover the entire range in a fair fashion.
29  */
30 static bool random_map_free(struct fio_file *f, const uint64_t block)
31 {
32         return !axmap_isset(f->io_axmap, block);
33 }
34
35 /*
36  * Mark a given offset as used in the map.
37  */
38 static void mark_random_map(struct thread_data *td, struct io_u *io_u)
39 {
40         unsigned int min_bs = td->o.rw_min_bs;
41         struct fio_file *f = io_u->file;
42         unsigned int nr_blocks;
43         uint64_t block;
44
45         block = (io_u->offset - f->file_offset) / (uint64_t) min_bs;
46         nr_blocks = (io_u->buflen + min_bs - 1) / min_bs;
47
48         if (!(io_u->flags & IO_U_F_BUSY_OK))
49                 nr_blocks = axmap_set_nr(f->io_axmap, block, nr_blocks);
50
51         if ((nr_blocks * min_bs) < io_u->buflen)
52                 io_u->buflen = nr_blocks * min_bs;
53 }
54
55 static uint64_t last_block(struct thread_data *td, struct fio_file *f,
56                            enum fio_ddir ddir)
57 {
58         uint64_t max_blocks;
59         uint64_t max_size;
60
61         assert(ddir_rw(ddir));
62
63         /*
64          * Hmm, should we make sure that ->io_size <= ->real_file_size?
65          */
66         max_size = f->io_size;
67         if (max_size > f->real_file_size)
68                 max_size = f->real_file_size;
69
70         if (td->o.zone_range)
71                 max_size = td->o.zone_range;
72
73         if (td->o.min_bs[ddir] > td->o.ba[ddir])
74                 max_size -= td->o.min_bs[ddir] - td->o.ba[ddir];
75
76         max_blocks = max_size / (uint64_t) td->o.ba[ddir];
77         if (!max_blocks)
78                 return 0;
79
80         return max_blocks;
81 }
82
83 struct rand_off {
84         struct flist_head list;
85         uint64_t off;
86 };
87
88 static int __get_next_rand_offset(struct thread_data *td, struct fio_file *f,
89                                   enum fio_ddir ddir, uint64_t *b,
90                                   uint64_t lastb)
91 {
92         uint64_t r;
93
94         if (td->o.random_generator == FIO_RAND_GEN_TAUSWORTHE ||
95             td->o.random_generator == FIO_RAND_GEN_TAUSWORTHE64) {
96
97                 r = __rand(&td->random_state);
98
99                 dprint(FD_RANDOM, "off rand %llu\n", (unsigned long long) r);
100
101                 *b = lastb * (r / (rand_max(&td->random_state) + 1.0));
102         } else {
103                 uint64_t off = 0;
104
105                 assert(fio_file_lfsr(f));
106
107                 if (lfsr_next(&f->lfsr, &off))
108                         return 1;
109
110                 *b = off;
111         }
112
113         /*
114          * if we are not maintaining a random map, we are done.
115          */
116         if (!file_randommap(td, f))
117                 goto ret;
118
119         /*
120          * calculate map offset and check if it's free
121          */
122         if (random_map_free(f, *b))
123                 goto ret;
124
125         dprint(FD_RANDOM, "get_next_rand_offset: offset %llu busy\n",
126                                                 (unsigned long long) *b);
127
128         *b = axmap_next_free(f->io_axmap, *b);
129         if (*b == (uint64_t) -1ULL)
130                 return 1;
131 ret:
132         return 0;
133 }
134
135 static int __get_next_rand_offset_zipf(struct thread_data *td,
136                                        struct fio_file *f, enum fio_ddir ddir,
137                                        uint64_t *b)
138 {
139         *b = zipf_next(&f->zipf);
140         return 0;
141 }
142
143 static int __get_next_rand_offset_pareto(struct thread_data *td,
144                                          struct fio_file *f, enum fio_ddir ddir,
145                                          uint64_t *b)
146 {
147         *b = pareto_next(&f->zipf);
148         return 0;
149 }
150
151 static int __get_next_rand_offset_gauss(struct thread_data *td,
152                                         struct fio_file *f, enum fio_ddir ddir,
153                                         uint64_t *b)
154 {
155         *b = gauss_next(&f->gauss);
156         return 0;
157 }
158
159 static int __get_next_rand_offset_zoned(struct thread_data *td,
160                                         struct fio_file *f, enum fio_ddir ddir,
161                                         uint64_t *b)
162 {
163         unsigned int v, send, stotal;
164         uint64_t offset, lastb;
165         static int warned;
166         struct zone_split_index *zsi;
167
168         lastb = last_block(td, f, ddir);
169         if (!lastb)
170                 return 1;
171
172         if (!td->o.zone_split_nr[ddir]) {
173 bail:
174                 return __get_next_rand_offset(td, f, ddir, b, lastb);
175         }
176
177         /*
178          * Generate a value, v, between 1 and 100, both inclusive
179          */
180         v = rand32_between(&td->zone_state, 1, 100);
181
182         zsi = &td->zone_state_index[ddir][v - 1];
183         stotal = zsi->size_perc_prev;
184         send = zsi->size_perc;
185
186         /*
187          * Should never happen
188          */
189         if (send == -1U) {
190                 if (!warned) {
191                         log_err("fio: bug in zoned generation\n");
192                         warned = 1;
193                 }
194                 goto bail;
195         }
196
197         /*
198          * 'send' is some percentage below or equal to 100 that
199          * marks the end of the current IO range. 'stotal' marks
200          * the start, in percent.
201          */
202         if (stotal)
203                 offset = stotal * lastb / 100ULL;
204         else
205                 offset = 0;
206
207         lastb = lastb * (send - stotal) / 100ULL;
208
209         /*
210          * Generate index from 0..send-of-lastb
211          */
212         if (__get_next_rand_offset(td, f, ddir, b, lastb) == 1)
213                 return 1;
214
215         /*
216          * Add our start offset, if any
217          */
218         if (offset)
219                 *b += offset;
220
221         return 0;
222 }
223
224 static int flist_cmp(void *data, struct flist_head *a, struct flist_head *b)
225 {
226         struct rand_off *r1 = flist_entry(a, struct rand_off, list);
227         struct rand_off *r2 = flist_entry(b, struct rand_off, list);
228
229         return r1->off - r2->off;
230 }
231
232 static int get_off_from_method(struct thread_data *td, struct fio_file *f,
233                                enum fio_ddir ddir, uint64_t *b)
234 {
235         if (td->o.random_distribution == FIO_RAND_DIST_RANDOM) {
236                 uint64_t lastb;
237
238                 lastb = last_block(td, f, ddir);
239                 if (!lastb)
240                         return 1;
241
242                 return __get_next_rand_offset(td, f, ddir, b, lastb);
243         } else if (td->o.random_distribution == FIO_RAND_DIST_ZIPF)
244                 return __get_next_rand_offset_zipf(td, f, ddir, b);
245         else if (td->o.random_distribution == FIO_RAND_DIST_PARETO)
246                 return __get_next_rand_offset_pareto(td, f, ddir, b);
247         else if (td->o.random_distribution == FIO_RAND_DIST_GAUSS)
248                 return __get_next_rand_offset_gauss(td, f, ddir, b);
249         else if (td->o.random_distribution == FIO_RAND_DIST_ZONED)
250                 return __get_next_rand_offset_zoned(td, f, ddir, b);
251
252         log_err("fio: unknown random distribution: %d\n", td->o.random_distribution);
253         return 1;
254 }
255
256 /*
257  * Sort the reads for a verify phase in batches of verifysort_nr, if
258  * specified.
259  */
260 static inline bool should_sort_io(struct thread_data *td)
261 {
262         if (!td->o.verifysort_nr || !td->o.do_verify)
263                 return false;
264         if (!td_random(td))
265                 return false;
266         if (td->runstate != TD_VERIFYING)
267                 return false;
268         if (td->o.random_generator == FIO_RAND_GEN_TAUSWORTHE ||
269             td->o.random_generator == FIO_RAND_GEN_TAUSWORTHE64)
270                 return false;
271
272         return true;
273 }
274
275 static bool should_do_random(struct thread_data *td, enum fio_ddir ddir)
276 {
277         unsigned int v;
278
279         if (td->o.perc_rand[ddir] == 100)
280                 return true;
281
282         v = rand32_between(&td->seq_rand_state[ddir], 1, 100);
283
284         return v <= td->o.perc_rand[ddir];
285 }
286
287 static int get_next_rand_offset(struct thread_data *td, struct fio_file *f,
288                                 enum fio_ddir ddir, uint64_t *b)
289 {
290         struct rand_off *r;
291         int i, ret = 1;
292
293         if (!should_sort_io(td))
294                 return get_off_from_method(td, f, ddir, b);
295
296         if (!flist_empty(&td->next_rand_list)) {
297 fetch:
298                 r = flist_first_entry(&td->next_rand_list, struct rand_off, list);
299                 flist_del(&r->list);
300                 *b = r->off;
301                 free(r);
302                 return 0;
303         }
304
305         for (i = 0; i < td->o.verifysort_nr; i++) {
306                 r = malloc(sizeof(*r));
307
308                 ret = get_off_from_method(td, f, ddir, &r->off);
309                 if (ret) {
310                         free(r);
311                         break;
312                 }
313
314                 flist_add(&r->list, &td->next_rand_list);
315         }
316
317         if (ret && !i)
318                 return ret;
319
320         assert(!flist_empty(&td->next_rand_list));
321         flist_sort(NULL, &td->next_rand_list, flist_cmp);
322         goto fetch;
323 }
324
325 static int get_next_rand_block(struct thread_data *td, struct fio_file *f,
326                                enum fio_ddir ddir, uint64_t *b)
327 {
328         if (!get_next_rand_offset(td, f, ddir, b))
329                 return 0;
330
331         if (td->o.time_based ||
332             (td->o.file_service_type & __FIO_FSERVICE_NONUNIFORM)) {
333                 fio_file_reset(td, f);
334                 if (!get_next_rand_offset(td, f, ddir, b))
335                         return 0;
336         }
337
338         dprint(FD_IO, "%s: rand offset failed, last=%llu, size=%llu\n",
339                         f->file_name, (unsigned long long) f->last_pos[ddir],
340                         (unsigned long long) f->real_file_size);
341         return 1;
342 }
343
344 static int get_next_seq_offset(struct thread_data *td, struct fio_file *f,
345                                enum fio_ddir ddir, uint64_t *offset)
346 {
347         struct thread_options *o = &td->o;
348
349         assert(ddir_rw(ddir));
350
351         if (f->last_pos[ddir] >= f->io_size + get_start_offset(td, f) &&
352             o->time_based) {
353                 struct thread_options *o = &td->o;
354                 uint64_t io_size = f->io_size + (f->io_size % o->min_bs[ddir]);
355
356                 if (io_size > f->last_pos[ddir])
357                         f->last_pos[ddir] = 0;
358                 else
359                         f->last_pos[ddir] = f->last_pos[ddir] - io_size;
360         }
361
362         if (f->last_pos[ddir] < f->real_file_size) {
363                 uint64_t pos;
364
365                 if (f->last_pos[ddir] == f->file_offset && o->ddir_seq_add < 0) {
366                         if (f->real_file_size > f->io_size)
367                                 f->last_pos[ddir] = f->io_size;
368                         else
369                                 f->last_pos[ddir] = f->real_file_size;
370                 }
371
372                 pos = f->last_pos[ddir] - f->file_offset;
373                 if (pos && o->ddir_seq_add) {
374                         pos += o->ddir_seq_add;
375
376                         /*
377                          * If we reach beyond the end of the file
378                          * with holed IO, wrap around to the
379                          * beginning again. If we're doing backwards IO,
380                          * wrap to the end.
381                          */
382                         if (pos >= f->real_file_size) {
383                                 if (o->ddir_seq_add > 0)
384                                         pos = f->file_offset;
385                                 else {
386                                         if (f->real_file_size > f->io_size)
387                                                 pos = f->io_size;
388                                         else
389                                                 pos = f->real_file_size;
390
391                                         pos += o->ddir_seq_add;
392                                 }
393                         }
394                 }
395
396                 *offset = pos;
397                 return 0;
398         }
399
400         return 1;
401 }
402
403 static int get_next_block(struct thread_data *td, struct io_u *io_u,
404                           enum fio_ddir ddir, int rw_seq,
405                           unsigned int *is_random)
406 {
407         struct fio_file *f = io_u->file;
408         uint64_t b, offset;
409         int ret;
410
411         assert(ddir_rw(ddir));
412
413         b = offset = -1ULL;
414
415         if (rw_seq) {
416                 if (td_random(td)) {
417                         if (should_do_random(td, ddir)) {
418                                 ret = get_next_rand_block(td, f, ddir, &b);
419                                 *is_random = 1;
420                         } else {
421                                 *is_random = 0;
422                                 io_u_set(td, io_u, IO_U_F_BUSY_OK);
423                                 ret = get_next_seq_offset(td, f, ddir, &offset);
424                                 if (ret)
425                                         ret = get_next_rand_block(td, f, ddir, &b);
426                         }
427                 } else {
428                         *is_random = 0;
429                         ret = get_next_seq_offset(td, f, ddir, &offset);
430                 }
431         } else {
432                 io_u_set(td, io_u, IO_U_F_BUSY_OK);
433                 *is_random = 0;
434
435                 if (td->o.rw_seq == RW_SEQ_SEQ) {
436                         ret = get_next_seq_offset(td, f, ddir, &offset);
437                         if (ret) {
438                                 ret = get_next_rand_block(td, f, ddir, &b);
439                                 *is_random = 0;
440                         }
441                 } else if (td->o.rw_seq == RW_SEQ_IDENT) {
442                         if (f->last_start[ddir] != -1ULL)
443                                 offset = f->last_start[ddir] - f->file_offset;
444                         else
445                                 offset = 0;
446                         ret = 0;
447                 } else {
448                         log_err("fio: unknown rw_seq=%d\n", td->o.rw_seq);
449                         ret = 1;
450                 }
451         }
452
453         if (!ret) {
454                 if (offset != -1ULL)
455                         io_u->offset = offset;
456                 else if (b != -1ULL)
457                         io_u->offset = b * td->o.ba[ddir];
458                 else {
459                         log_err("fio: bug in offset generation: offset=%llu, b=%llu\n", (unsigned long long) offset, (unsigned long long) b);
460                         ret = 1;
461                 }
462         }
463
464         return ret;
465 }
466
467 /*
468  * For random io, generate a random new block and see if it's used. Repeat
469  * until we find a free one. For sequential io, just return the end of
470  * the last io issued.
471  */
472 static int __get_next_offset(struct thread_data *td, struct io_u *io_u,
473                              unsigned int *is_random)
474 {
475         struct fio_file *f = io_u->file;
476         enum fio_ddir ddir = io_u->ddir;
477         int rw_seq_hit = 0;
478
479         assert(ddir_rw(ddir));
480
481         if (td->o.ddir_seq_nr && !--td->ddir_seq_nr) {
482                 rw_seq_hit = 1;
483                 td->ddir_seq_nr = td->o.ddir_seq_nr;
484         }
485
486         if (get_next_block(td, io_u, ddir, rw_seq_hit, is_random))
487                 return 1;
488
489         if (io_u->offset >= f->io_size) {
490                 dprint(FD_IO, "get_next_offset: offset %llu >= io_size %llu\n",
491                                         (unsigned long long) io_u->offset,
492                                         (unsigned long long) f->io_size);
493                 return 1;
494         }
495
496         io_u->offset += f->file_offset;
497         if (io_u->offset >= f->real_file_size) {
498                 dprint(FD_IO, "get_next_offset: offset %llu >= size %llu\n",
499                                         (unsigned long long) io_u->offset,
500                                         (unsigned long long) f->real_file_size);
501                 return 1;
502         }
503
504         return 0;
505 }
506
507 static int get_next_offset(struct thread_data *td, struct io_u *io_u,
508                            unsigned int *is_random)
509 {
510         if (td->flags & TD_F_PROFILE_OPS) {
511                 struct prof_io_ops *ops = &td->prof_io_ops;
512
513                 if (ops->fill_io_u_off)
514                         return ops->fill_io_u_off(td, io_u, is_random);
515         }
516
517         return __get_next_offset(td, io_u, is_random);
518 }
519
520 static inline bool io_u_fits(struct thread_data *td, struct io_u *io_u,
521                              unsigned int buflen)
522 {
523         struct fio_file *f = io_u->file;
524
525         return io_u->offset + buflen <= f->io_size + get_start_offset(td, f);
526 }
527
528 static unsigned int __get_next_buflen(struct thread_data *td, struct io_u *io_u,
529                                       unsigned int is_random)
530 {
531         int ddir = io_u->ddir;
532         unsigned int buflen = 0;
533         unsigned int minbs, maxbs;
534         uint64_t frand_max;
535         unsigned long r;
536
537         assert(ddir_rw(ddir));
538
539         if (td->o.bs_is_seq_rand)
540                 ddir = is_random ? DDIR_WRITE: DDIR_READ;
541
542         minbs = td->o.min_bs[ddir];
543         maxbs = td->o.max_bs[ddir];
544
545         if (minbs == maxbs)
546                 return minbs;
547
548         /*
549          * If we can't satisfy the min block size from here, then fail
550          */
551         if (!io_u_fits(td, io_u, minbs))
552                 return 0;
553
554         frand_max = rand_max(&td->bsrange_state);
555         do {
556                 r = __rand(&td->bsrange_state);
557
558                 if (!td->o.bssplit_nr[ddir]) {
559                         buflen = 1 + (unsigned int) ((double) maxbs *
560                                         (r / (frand_max + 1.0)));
561                         if (buflen < minbs)
562                                 buflen = minbs;
563                 } else {
564                         long perc = 0;
565                         unsigned int i;
566
567                         for (i = 0; i < td->o.bssplit_nr[ddir]; i++) {
568                                 struct bssplit *bsp = &td->o.bssplit[ddir][i];
569
570                                 buflen = bsp->bs;
571                                 perc += bsp->perc;
572                                 if ((r * 100UL <= frand_max * perc) &&
573                                     io_u_fits(td, io_u, buflen))
574                                         break;
575                         }
576                 }
577
578                 if (td->o.verify != VERIFY_NONE)
579                         buflen = (buflen + td->o.verify_interval - 1) &
580                                 ~(td->o.verify_interval - 1);
581
582                 if (!td->o.bs_unaligned && is_power_of_2(minbs))
583                         buflen &= ~(minbs - 1);
584
585         } while (!io_u_fits(td, io_u, buflen));
586
587         return buflen;
588 }
589
590 static unsigned int get_next_buflen(struct thread_data *td, struct io_u *io_u,
591                                     unsigned int is_random)
592 {
593         if (td->flags & TD_F_PROFILE_OPS) {
594                 struct prof_io_ops *ops = &td->prof_io_ops;
595
596                 if (ops->fill_io_u_size)
597                         return ops->fill_io_u_size(td, io_u, is_random);
598         }
599
600         return __get_next_buflen(td, io_u, is_random);
601 }
602
603 static void set_rwmix_bytes(struct thread_data *td)
604 {
605         unsigned int diff;
606
607         /*
608          * we do time or byte based switch. this is needed because
609          * buffered writes may issue a lot quicker than they complete,
610          * whereas reads do not.
611          */
612         diff = td->o.rwmix[td->rwmix_ddir ^ 1];
613         td->rwmix_issues = (td->io_issues[td->rwmix_ddir] * diff) / 100;
614 }
615
616 static inline enum fio_ddir get_rand_ddir(struct thread_data *td)
617 {
618         unsigned int v;
619
620         v = rand32_between(&td->rwmix_state, 1, 100);
621
622         if (v <= td->o.rwmix[DDIR_READ])
623                 return DDIR_READ;
624
625         return DDIR_WRITE;
626 }
627
628 int io_u_quiesce(struct thread_data *td)
629 {
630         int completed = 0;
631
632         /*
633          * We are going to sleep, ensure that we flush anything pending as
634          * not to skew our latency numbers.
635          *
636          * Changed to only monitor 'in flight' requests here instead of the
637          * td->cur_depth, b/c td->cur_depth does not accurately represent
638          * io's that have been actually submitted to an async engine,
639          * and cur_depth is meaningless for sync engines.
640          */
641         if (td->io_u_queued || td->cur_depth) {
642                 int fio_unused ret;
643
644                 ret = td_io_commit(td);
645         }
646
647         while (td->io_u_in_flight) {
648                 int fio_unused ret;
649
650                 ret = io_u_queued_complete(td, 1);
651                 if (ret > 0)
652                         completed += ret;
653         }
654
655         return completed;
656 }
657
658 static enum fio_ddir rate_ddir(struct thread_data *td, enum fio_ddir ddir)
659 {
660         enum fio_ddir odir = ddir ^ 1;
661         long usec, now;
662
663         assert(ddir_rw(ddir));
664         now = utime_since_now(&td->start);
665
666         /*
667          * if rate_next_io_time is in the past, need to catch up to rate
668          */
669         if (td->rate_next_io_time[ddir] <= now)
670                 return ddir;
671
672         /*
673          * We are ahead of rate in this direction. See if we
674          * should switch.
675          */
676         if (td_rw(td) && td->o.rwmix[odir]) {
677                 /*
678                  * Other direction is behind rate, switch
679                  */
680                 if (td->rate_next_io_time[odir] <= now)
681                         return odir;
682
683                 /*
684                  * Both directions are ahead of rate. sleep the min
685                  * switch if necissary
686                  */
687                 if (td->rate_next_io_time[ddir] <=
688                         td->rate_next_io_time[odir]) {
689                         usec = td->rate_next_io_time[ddir] - now;
690                 } else {
691                         usec = td->rate_next_io_time[odir] - now;
692                         ddir = odir;
693                 }
694         } else
695                 usec = td->rate_next_io_time[ddir] - now;
696
697         if (td->o.io_submit_mode == IO_MODE_INLINE)
698                 io_u_quiesce(td);
699
700         usec = usec_sleep(td, usec);
701
702         return ddir;
703 }
704
705 /*
706  * Return the data direction for the next io_u. If the job is a
707  * mixed read/write workload, check the rwmix cycle and switch if
708  * necessary.
709  */
710 static enum fio_ddir get_rw_ddir(struct thread_data *td)
711 {
712         enum fio_ddir ddir;
713
714         /*
715          * see if it's time to fsync
716          */
717         if (td->o.fsync_blocks &&
718            !(td->io_issues[DDIR_WRITE] % td->o.fsync_blocks) &&
719              td->io_issues[DDIR_WRITE] && should_fsync(td))
720                 return DDIR_SYNC;
721
722         /*
723          * see if it's time to fdatasync
724          */
725         if (td->o.fdatasync_blocks &&
726            !(td->io_issues[DDIR_WRITE] % td->o.fdatasync_blocks) &&
727              td->io_issues[DDIR_WRITE] && should_fsync(td))
728                 return DDIR_DATASYNC;
729
730         /*
731          * see if it's time to sync_file_range
732          */
733         if (td->sync_file_range_nr &&
734            !(td->io_issues[DDIR_WRITE] % td->sync_file_range_nr) &&
735              td->io_issues[DDIR_WRITE] && should_fsync(td))
736                 return DDIR_SYNC_FILE_RANGE;
737
738         if (td_rw(td)) {
739                 /*
740                  * Check if it's time to seed a new data direction.
741                  */
742                 if (td->io_issues[td->rwmix_ddir] >= td->rwmix_issues) {
743                         /*
744                          * Put a top limit on how many bytes we do for
745                          * one data direction, to avoid overflowing the
746                          * ranges too much
747                          */
748                         ddir = get_rand_ddir(td);
749
750                         if (ddir != td->rwmix_ddir)
751                                 set_rwmix_bytes(td);
752
753                         td->rwmix_ddir = ddir;
754                 }
755                 ddir = td->rwmix_ddir;
756         } else if (td_read(td))
757                 ddir = DDIR_READ;
758         else if (td_write(td))
759                 ddir = DDIR_WRITE;
760         else
761                 ddir = DDIR_TRIM;
762
763         td->rwmix_ddir = rate_ddir(td, ddir);
764         return td->rwmix_ddir;
765 }
766
767 static void set_rw_ddir(struct thread_data *td, struct io_u *io_u)
768 {
769         enum fio_ddir ddir = get_rw_ddir(td);
770
771         if (td_trimwrite(td)) {
772                 struct fio_file *f = io_u->file;
773                 if (f->last_pos[DDIR_WRITE] == f->last_pos[DDIR_TRIM])
774                         ddir = DDIR_TRIM;
775                 else
776                         ddir = DDIR_WRITE;
777         }
778
779         io_u->ddir = io_u->acct_ddir = ddir;
780
781         if (io_u->ddir == DDIR_WRITE && td_ioengine_flagged(td, FIO_BARRIER) &&
782             td->o.barrier_blocks &&
783            !(td->io_issues[DDIR_WRITE] % td->o.barrier_blocks) &&
784              td->io_issues[DDIR_WRITE])
785                 io_u_set(td, io_u, IO_U_F_BARRIER);
786 }
787
788 void put_file_log(struct thread_data *td, struct fio_file *f)
789 {
790         unsigned int ret = put_file(td, f);
791
792         if (ret)
793                 td_verror(td, ret, "file close");
794 }
795
796 void put_io_u(struct thread_data *td, struct io_u *io_u)
797 {
798         if (td->parent)
799                 td = td->parent;
800
801         td_io_u_lock(td);
802
803         if (io_u->file && !(io_u->flags & IO_U_F_NO_FILE_PUT))
804                 put_file_log(td, io_u->file);
805
806         io_u->file = NULL;
807         io_u_set(td, io_u, IO_U_F_FREE);
808
809         if (io_u->flags & IO_U_F_IN_CUR_DEPTH) {
810                 td->cur_depth--;
811                 assert(!(td->flags & TD_F_CHILD));
812         }
813         io_u_qpush(&td->io_u_freelist, io_u);
814         td_io_u_unlock(td);
815         td_io_u_free_notify(td);
816 }
817
818 void clear_io_u(struct thread_data *td, struct io_u *io_u)
819 {
820         io_u_clear(td, io_u, IO_U_F_FLIGHT);
821         put_io_u(td, io_u);
822 }
823
824 void requeue_io_u(struct thread_data *td, struct io_u **io_u)
825 {
826         struct io_u *__io_u = *io_u;
827         enum fio_ddir ddir = acct_ddir(__io_u);
828
829         dprint(FD_IO, "requeue %p\n", __io_u);
830
831         if (td->parent)
832                 td = td->parent;
833
834         td_io_u_lock(td);
835
836         io_u_set(td, __io_u, IO_U_F_FREE);
837         if ((__io_u->flags & IO_U_F_FLIGHT) && ddir_rw(ddir))
838                 td->io_issues[ddir]--;
839
840         io_u_clear(td, __io_u, IO_U_F_FLIGHT);
841         if (__io_u->flags & IO_U_F_IN_CUR_DEPTH) {
842                 td->cur_depth--;
843                 assert(!(td->flags & TD_F_CHILD));
844         }
845
846         io_u_rpush(&td->io_u_requeues, __io_u);
847         td_io_u_unlock(td);
848         td_io_u_free_notify(td);
849         *io_u = NULL;
850 }
851
852 static int fill_io_u(struct thread_data *td, struct io_u *io_u)
853 {
854         unsigned int is_random;
855
856         if (td_ioengine_flagged(td, FIO_NOIO))
857                 goto out;
858
859         set_rw_ddir(td, io_u);
860
861         /*
862          * fsync() or fdatasync() or trim etc, we are done
863          */
864         if (!ddir_rw(io_u->ddir))
865                 goto out;
866
867         /*
868          * See if it's time to switch to a new zone
869          */
870         if (td->zone_bytes >= td->o.zone_size && td->o.zone_skip) {
871                 struct fio_file *f = io_u->file;
872
873                 td->zone_bytes = 0;
874                 f->file_offset += td->o.zone_range + td->o.zone_skip;
875
876                 /*
877                  * Wrap from the beginning, if we exceed the file size
878                  */
879                 if (f->file_offset >= f->real_file_size)
880                         f->file_offset = f->real_file_size - f->file_offset;
881                 f->last_pos[io_u->ddir] = f->file_offset;
882                 td->io_skip_bytes += td->o.zone_skip;
883         }
884
885         /*
886          * No log, let the seq/rand engine retrieve the next buflen and
887          * position.
888          */
889         if (get_next_offset(td, io_u, &is_random)) {
890                 dprint(FD_IO, "io_u %p, failed getting offset\n", io_u);
891                 return 1;
892         }
893
894         io_u->buflen = get_next_buflen(td, io_u, is_random);
895         if (!io_u->buflen) {
896                 dprint(FD_IO, "io_u %p, failed getting buflen\n", io_u);
897                 return 1;
898         }
899
900         if (io_u->offset + io_u->buflen > io_u->file->real_file_size) {
901                 dprint(FD_IO, "io_u %p, offset too large\n", io_u);
902                 dprint(FD_IO, "  off=%llu/%lu > %llu\n",
903                         (unsigned long long) io_u->offset, io_u->buflen,
904                         (unsigned long long) io_u->file->real_file_size);
905                 return 1;
906         }
907
908         /*
909          * mark entry before potentially trimming io_u
910          */
911         if (td_random(td) && file_randommap(td, io_u->file))
912                 mark_random_map(td, io_u);
913
914 out:
915         dprint_io_u(io_u, "fill_io_u");
916         td->zone_bytes += io_u->buflen;
917         return 0;
918 }
919
920 static void __io_u_mark_map(unsigned int *map, unsigned int nr)
921 {
922         int idx = 0;
923
924         switch (nr) {
925         default:
926                 idx = 6;
927                 break;
928         case 33 ... 64:
929                 idx = 5;
930                 break;
931         case 17 ... 32:
932                 idx = 4;
933                 break;
934         case 9 ... 16:
935                 idx = 3;
936                 break;
937         case 5 ... 8:
938                 idx = 2;
939                 break;
940         case 1 ... 4:
941                 idx = 1;
942         case 0:
943                 break;
944         }
945
946         map[idx]++;
947 }
948
949 void io_u_mark_submit(struct thread_data *td, unsigned int nr)
950 {
951         __io_u_mark_map(td->ts.io_u_submit, nr);
952         td->ts.total_submit++;
953 }
954
955 void io_u_mark_complete(struct thread_data *td, unsigned int nr)
956 {
957         __io_u_mark_map(td->ts.io_u_complete, nr);
958         td->ts.total_complete++;
959 }
960
961 void io_u_mark_depth(struct thread_data *td, unsigned int nr)
962 {
963         int idx = 0;
964
965         switch (td->cur_depth) {
966         default:
967                 idx = 6;
968                 break;
969         case 32 ... 63:
970                 idx = 5;
971                 break;
972         case 16 ... 31:
973                 idx = 4;
974                 break;
975         case 8 ... 15:
976                 idx = 3;
977                 break;
978         case 4 ... 7:
979                 idx = 2;
980                 break;
981         case 2 ... 3:
982                 idx = 1;
983         case 1:
984                 break;
985         }
986
987         td->ts.io_u_map[idx] += nr;
988 }
989
990 static void io_u_mark_lat_usec(struct thread_data *td, unsigned long usec)
991 {
992         int idx = 0;
993
994         assert(usec < 1000);
995
996         switch (usec) {
997         case 750 ... 999:
998                 idx = 9;
999                 break;
1000         case 500 ... 749:
1001                 idx = 8;
1002                 break;
1003         case 250 ... 499:
1004                 idx = 7;
1005                 break;
1006         case 100 ... 249:
1007                 idx = 6;
1008                 break;
1009         case 50 ... 99:
1010                 idx = 5;
1011                 break;
1012         case 20 ... 49:
1013                 idx = 4;
1014                 break;
1015         case 10 ... 19:
1016                 idx = 3;
1017                 break;
1018         case 4 ... 9:
1019                 idx = 2;
1020                 break;
1021         case 2 ... 3:
1022                 idx = 1;
1023         case 0 ... 1:
1024                 break;
1025         }
1026
1027         assert(idx < FIO_IO_U_LAT_U_NR);
1028         td->ts.io_u_lat_u[idx]++;
1029 }
1030
1031 static void io_u_mark_lat_msec(struct thread_data *td, unsigned long msec)
1032 {
1033         int idx = 0;
1034
1035         switch (msec) {
1036         default:
1037                 idx = 11;
1038                 break;
1039         case 1000 ... 1999:
1040                 idx = 10;
1041                 break;
1042         case 750 ... 999:
1043                 idx = 9;
1044                 break;
1045         case 500 ... 749:
1046                 idx = 8;
1047                 break;
1048         case 250 ... 499:
1049                 idx = 7;
1050                 break;
1051         case 100 ... 249:
1052                 idx = 6;
1053                 break;
1054         case 50 ... 99:
1055                 idx = 5;
1056                 break;
1057         case 20 ... 49:
1058                 idx = 4;
1059                 break;
1060         case 10 ... 19:
1061                 idx = 3;
1062                 break;
1063         case 4 ... 9:
1064                 idx = 2;
1065                 break;
1066         case 2 ... 3:
1067                 idx = 1;
1068         case 0 ... 1:
1069                 break;
1070         }
1071
1072         assert(idx < FIO_IO_U_LAT_M_NR);
1073         td->ts.io_u_lat_m[idx]++;
1074 }
1075
1076 static void io_u_mark_latency(struct thread_data *td, unsigned long usec)
1077 {
1078         if (usec < 1000)
1079                 io_u_mark_lat_usec(td, usec);
1080         else
1081                 io_u_mark_lat_msec(td, usec / 1000);
1082 }
1083
1084 static unsigned int __get_next_fileno_rand(struct thread_data *td)
1085 {
1086         unsigned long fileno;
1087
1088         if (td->o.file_service_type == FIO_FSERVICE_RANDOM) {
1089                 uint64_t frand_max = rand_max(&td->next_file_state);
1090                 unsigned long r;
1091
1092                 r = __rand(&td->next_file_state);
1093                 return (unsigned int) ((double) td->o.nr_files
1094                                 * (r / (frand_max + 1.0)));
1095         }
1096
1097         if (td->o.file_service_type == FIO_FSERVICE_ZIPF)
1098                 fileno = zipf_next(&td->next_file_zipf);
1099         else if (td->o.file_service_type == FIO_FSERVICE_PARETO)
1100                 fileno = pareto_next(&td->next_file_zipf);
1101         else if (td->o.file_service_type == FIO_FSERVICE_GAUSS)
1102                 fileno = gauss_next(&td->next_file_gauss);
1103         else {
1104                 log_err("fio: bad file service type: %d\n", td->o.file_service_type);
1105                 assert(0);
1106                 return 0;
1107         }
1108
1109         return fileno >> FIO_FSERVICE_SHIFT;
1110 }
1111
1112 /*
1113  * Get next file to service by choosing one at random
1114  */
1115 static struct fio_file *get_next_file_rand(struct thread_data *td,
1116                                            enum fio_file_flags goodf,
1117                                            enum fio_file_flags badf)
1118 {
1119         struct fio_file *f;
1120         int fno;
1121
1122         do {
1123                 int opened = 0;
1124
1125                 fno = __get_next_fileno_rand(td);
1126
1127                 f = td->files[fno];
1128                 if (fio_file_done(f))
1129                         continue;
1130
1131                 if (!fio_file_open(f)) {
1132                         int err;
1133
1134                         if (td->nr_open_files >= td->o.open_files)
1135                                 return ERR_PTR(-EBUSY);
1136
1137                         err = td_io_open_file(td, f);
1138                         if (err)
1139                                 continue;
1140                         opened = 1;
1141                 }
1142
1143                 if ((!goodf || (f->flags & goodf)) && !(f->flags & badf)) {
1144                         dprint(FD_FILE, "get_next_file_rand: %p\n", f);
1145                         return f;
1146                 }
1147                 if (opened)
1148                         td_io_close_file(td, f);
1149         } while (1);
1150 }
1151
1152 /*
1153  * Get next file to service by doing round robin between all available ones
1154  */
1155 static struct fio_file *get_next_file_rr(struct thread_data *td, int goodf,
1156                                          int badf)
1157 {
1158         unsigned int old_next_file = td->next_file;
1159         struct fio_file *f;
1160
1161         do {
1162                 int opened = 0;
1163
1164                 f = td->files[td->next_file];
1165
1166                 td->next_file++;
1167                 if (td->next_file >= td->o.nr_files)
1168                         td->next_file = 0;
1169
1170                 dprint(FD_FILE, "trying file %s %x\n", f->file_name, f->flags);
1171                 if (fio_file_done(f)) {
1172                         f = NULL;
1173                         continue;
1174                 }
1175
1176                 if (!fio_file_open(f)) {
1177                         int err;
1178
1179                         if (td->nr_open_files >= td->o.open_files)
1180                                 return ERR_PTR(-EBUSY);
1181
1182                         err = td_io_open_file(td, f);
1183                         if (err) {
1184                                 dprint(FD_FILE, "error %d on open of %s\n",
1185                                         err, f->file_name);
1186                                 f = NULL;
1187                                 continue;
1188                         }
1189                         opened = 1;
1190                 }
1191
1192                 dprint(FD_FILE, "goodf=%x, badf=%x, ff=%x\n", goodf, badf,
1193                                                                 f->flags);
1194                 if ((!goodf || (f->flags & goodf)) && !(f->flags & badf))
1195                         break;
1196
1197                 if (opened)
1198                         td_io_close_file(td, f);
1199
1200                 f = NULL;
1201         } while (td->next_file != old_next_file);
1202
1203         dprint(FD_FILE, "get_next_file_rr: %p\n", f);
1204         return f;
1205 }
1206
1207 static struct fio_file *__get_next_file(struct thread_data *td)
1208 {
1209         struct fio_file *f;
1210
1211         assert(td->o.nr_files <= td->files_index);
1212
1213         if (td->nr_done_files >= td->o.nr_files) {
1214                 dprint(FD_FILE, "get_next_file: nr_open=%d, nr_done=%d,"
1215                                 " nr_files=%d\n", td->nr_open_files,
1216                                                   td->nr_done_files,
1217                                                   td->o.nr_files);
1218                 return NULL;
1219         }
1220
1221         f = td->file_service_file;
1222         if (f && fio_file_open(f) && !fio_file_closing(f)) {
1223                 if (td->o.file_service_type == FIO_FSERVICE_SEQ)
1224                         goto out;
1225                 if (td->file_service_left--)
1226                         goto out;
1227         }
1228
1229         if (td->o.file_service_type == FIO_FSERVICE_RR ||
1230             td->o.file_service_type == FIO_FSERVICE_SEQ)
1231                 f = get_next_file_rr(td, FIO_FILE_open, FIO_FILE_closing);
1232         else
1233                 f = get_next_file_rand(td, FIO_FILE_open, FIO_FILE_closing);
1234
1235         if (IS_ERR(f))
1236                 return f;
1237
1238         td->file_service_file = f;
1239         td->file_service_left = td->file_service_nr - 1;
1240 out:
1241         if (f)
1242                 dprint(FD_FILE, "get_next_file: %p [%s]\n", f, f->file_name);
1243         else
1244                 dprint(FD_FILE, "get_next_file: NULL\n");
1245         return f;
1246 }
1247
1248 static struct fio_file *get_next_file(struct thread_data *td)
1249 {
1250         if (td->flags & TD_F_PROFILE_OPS) {
1251                 struct prof_io_ops *ops = &td->prof_io_ops;
1252
1253                 if (ops->get_next_file)
1254                         return ops->get_next_file(td);
1255         }
1256
1257         return __get_next_file(td);
1258 }
1259
1260 static long set_io_u_file(struct thread_data *td, struct io_u *io_u)
1261 {
1262         struct fio_file *f;
1263
1264         do {
1265                 f = get_next_file(td);
1266                 if (IS_ERR_OR_NULL(f))
1267                         return PTR_ERR(f);
1268
1269                 io_u->file = f;
1270                 get_file(f);
1271
1272                 if (!fill_io_u(td, io_u))
1273                         break;
1274
1275                 put_file_log(td, f);
1276                 td_io_close_file(td, f);
1277                 io_u->file = NULL;
1278                 if (td->o.file_service_type & __FIO_FSERVICE_NONUNIFORM)
1279                         fio_file_reset(td, f);
1280                 else {
1281                         fio_file_set_done(f);
1282                         td->nr_done_files++;
1283                         dprint(FD_FILE, "%s: is done (%d of %d)\n", f->file_name,
1284                                         td->nr_done_files, td->o.nr_files);
1285                 }
1286         } while (1);
1287
1288         return 0;
1289 }
1290
1291 static void lat_fatal(struct thread_data *td, struct io_completion_data *icd,
1292                       unsigned long tusec, unsigned long max_usec)
1293 {
1294         if (!td->error)
1295                 log_err("fio: latency of %lu usec exceeds specified max (%lu usec)\n", tusec, max_usec);
1296         td_verror(td, ETIMEDOUT, "max latency exceeded");
1297         icd->error = ETIMEDOUT;
1298 }
1299
1300 static void lat_new_cycle(struct thread_data *td)
1301 {
1302         fio_gettime(&td->latency_ts, NULL);
1303         td->latency_ios = ddir_rw_sum(td->io_blocks);
1304         td->latency_failed = 0;
1305 }
1306
1307 /*
1308  * We had an IO outside the latency target. Reduce the queue depth. If we
1309  * are at QD=1, then it's time to give up.
1310  */
1311 static bool __lat_target_failed(struct thread_data *td)
1312 {
1313         if (td->latency_qd == 1)
1314                 return true;
1315
1316         td->latency_qd_high = td->latency_qd;
1317
1318         if (td->latency_qd == td->latency_qd_low)
1319                 td->latency_qd_low--;
1320
1321         td->latency_qd = (td->latency_qd + td->latency_qd_low) / 2;
1322
1323         dprint(FD_RATE, "Ramped down: %d %d %d\n", td->latency_qd_low, td->latency_qd, td->latency_qd_high);
1324
1325         /*
1326          * When we ramp QD down, quiesce existing IO to prevent
1327          * a storm of ramp downs due to pending higher depth.
1328          */
1329         io_u_quiesce(td);
1330         lat_new_cycle(td);
1331         return false;
1332 }
1333
1334 static bool lat_target_failed(struct thread_data *td)
1335 {
1336         if (td->o.latency_percentile.u.f == 100.0)
1337                 return __lat_target_failed(td);
1338
1339         td->latency_failed++;
1340         return false;
1341 }
1342
1343 void lat_target_init(struct thread_data *td)
1344 {
1345         td->latency_end_run = 0;
1346
1347         if (td->o.latency_target) {
1348                 dprint(FD_RATE, "Latency target=%llu\n", td->o.latency_target);
1349                 fio_gettime(&td->latency_ts, NULL);
1350                 td->latency_qd = 1;
1351                 td->latency_qd_high = td->o.iodepth;
1352                 td->latency_qd_low = 1;
1353                 td->latency_ios = ddir_rw_sum(td->io_blocks);
1354         } else
1355                 td->latency_qd = td->o.iodepth;
1356 }
1357
1358 void lat_target_reset(struct thread_data *td)
1359 {
1360         if (!td->latency_end_run)
1361                 lat_target_init(td);
1362 }
1363
1364 static void lat_target_success(struct thread_data *td)
1365 {
1366         const unsigned int qd = td->latency_qd;
1367         struct thread_options *o = &td->o;
1368
1369         td->latency_qd_low = td->latency_qd;
1370
1371         /*
1372          * If we haven't failed yet, we double up to a failing value instead
1373          * of bisecting from highest possible queue depth. If we have set
1374          * a limit other than td->o.iodepth, bisect between that.
1375          */
1376         if (td->latency_qd_high != o->iodepth)
1377                 td->latency_qd = (td->latency_qd + td->latency_qd_high) / 2;
1378         else
1379                 td->latency_qd *= 2;
1380
1381         if (td->latency_qd > o->iodepth)
1382                 td->latency_qd = o->iodepth;
1383
1384         dprint(FD_RATE, "Ramped up: %d %d %d\n", td->latency_qd_low, td->latency_qd, td->latency_qd_high);
1385
1386         /*
1387          * Same as last one, we are done. Let it run a latency cycle, so
1388          * we get only the results from the targeted depth.
1389          */
1390         if (td->latency_qd == qd) {
1391                 if (td->latency_end_run) {
1392                         dprint(FD_RATE, "We are done\n");
1393                         td->done = 1;
1394                 } else {
1395                         dprint(FD_RATE, "Quiesce and final run\n");
1396                         io_u_quiesce(td);
1397                         td->latency_end_run = 1;
1398                         reset_all_stats(td);
1399                         reset_io_stats(td);
1400                 }
1401         }
1402
1403         lat_new_cycle(td);
1404 }
1405
1406 /*
1407  * Check if we can bump the queue depth
1408  */
1409 void lat_target_check(struct thread_data *td)
1410 {
1411         uint64_t usec_window;
1412         uint64_t ios;
1413         double success_ios;
1414
1415         usec_window = utime_since_now(&td->latency_ts);
1416         if (usec_window < td->o.latency_window)
1417                 return;
1418
1419         ios = ddir_rw_sum(td->io_blocks) - td->latency_ios;
1420         success_ios = (double) (ios - td->latency_failed) / (double) ios;
1421         success_ios *= 100.0;
1422
1423         dprint(FD_RATE, "Success rate: %.2f%% (target %.2f%%)\n", success_ios, td->o.latency_percentile.u.f);
1424
1425         if (success_ios >= td->o.latency_percentile.u.f)
1426                 lat_target_success(td);
1427         else
1428                 __lat_target_failed(td);
1429 }
1430
1431 /*
1432  * If latency target is enabled, we might be ramping up or down and not
1433  * using the full queue depth available.
1434  */
1435 bool queue_full(const struct thread_data *td)
1436 {
1437         const int qempty = io_u_qempty(&td->io_u_freelist);
1438
1439         if (qempty)
1440                 return true;
1441         if (!td->o.latency_target)
1442                 return false;
1443
1444         return td->cur_depth >= td->latency_qd;
1445 }
1446
1447 struct io_u *__get_io_u(struct thread_data *td)
1448 {
1449         struct io_u *io_u = NULL;
1450
1451         if (td->stop_io)
1452                 return NULL;
1453
1454         td_io_u_lock(td);
1455
1456 again:
1457         if (!io_u_rempty(&td->io_u_requeues))
1458                 io_u = io_u_rpop(&td->io_u_requeues);
1459         else if (!queue_full(td)) {
1460                 io_u = io_u_qpop(&td->io_u_freelist);
1461
1462                 io_u->file = NULL;
1463                 io_u->buflen = 0;
1464                 io_u->resid = 0;
1465                 io_u->end_io = NULL;
1466         }
1467
1468         if (io_u) {
1469                 assert(io_u->flags & IO_U_F_FREE);
1470                 io_u_clear(td, io_u, IO_U_F_FREE | IO_U_F_NO_FILE_PUT |
1471                                  IO_U_F_TRIMMED | IO_U_F_BARRIER |
1472                                  IO_U_F_VER_LIST);
1473
1474                 io_u->error = 0;
1475                 io_u->acct_ddir = -1;
1476                 td->cur_depth++;
1477                 assert(!(td->flags & TD_F_CHILD));
1478                 io_u_set(td, io_u, IO_U_F_IN_CUR_DEPTH);
1479                 io_u->ipo = NULL;
1480         } else if (td_async_processing(td)) {
1481                 /*
1482                  * We ran out, wait for async verify threads to finish and
1483                  * return one
1484                  */
1485                 assert(!(td->flags & TD_F_CHILD));
1486                 assert(!pthread_cond_wait(&td->free_cond, &td->io_u_lock));
1487                 goto again;
1488         }
1489
1490         td_io_u_unlock(td);
1491         return io_u;
1492 }
1493
1494 static bool check_get_trim(struct thread_data *td, struct io_u *io_u)
1495 {
1496         if (!(td->flags & TD_F_TRIM_BACKLOG))
1497                 return false;
1498
1499         if (td->trim_entries) {
1500                 int get_trim = 0;
1501
1502                 if (td->trim_batch) {
1503                         td->trim_batch--;
1504                         get_trim = 1;
1505                 } else if (!(td->io_hist_len % td->o.trim_backlog) &&
1506                          td->last_ddir != DDIR_READ) {
1507                         td->trim_batch = td->o.trim_batch;
1508                         if (!td->trim_batch)
1509                                 td->trim_batch = td->o.trim_backlog;
1510                         get_trim = 1;
1511                 }
1512
1513                 if (get_trim && get_next_trim(td, io_u))
1514                         return true;
1515         }
1516
1517         return false;
1518 }
1519
1520 static bool check_get_verify(struct thread_data *td, struct io_u *io_u)
1521 {
1522         if (!(td->flags & TD_F_VER_BACKLOG))
1523                 return false;
1524
1525         if (td->io_hist_len) {
1526                 int get_verify = 0;
1527
1528                 if (td->verify_batch)
1529                         get_verify = 1;
1530                 else if (!(td->io_hist_len % td->o.verify_backlog) &&
1531                          td->last_ddir != DDIR_READ) {
1532                         td->verify_batch = td->o.verify_batch;
1533                         if (!td->verify_batch)
1534                                 td->verify_batch = td->o.verify_backlog;
1535                         get_verify = 1;
1536                 }
1537
1538                 if (get_verify && !get_next_verify(td, io_u)) {
1539                         td->verify_batch--;
1540                         return true;
1541                 }
1542         }
1543
1544         return false;
1545 }
1546
1547 /*
1548  * Fill offset and start time into the buffer content, to prevent too
1549  * easy compressible data for simple de-dupe attempts. Do this for every
1550  * 512b block in the range, since that should be the smallest block size
1551  * we can expect from a device.
1552  */
1553 static void small_content_scramble(struct io_u *io_u)
1554 {
1555         unsigned int i, nr_blocks = io_u->buflen / 512;
1556         uint64_t boffset;
1557         unsigned int offset;
1558         void *p, *end;
1559
1560         if (!nr_blocks)
1561                 return;
1562
1563         p = io_u->xfer_buf;
1564         boffset = io_u->offset;
1565         io_u->buf_filled_len = 0;
1566
1567         for (i = 0; i < nr_blocks; i++) {
1568                 /*
1569                  * Fill the byte offset into a "random" start offset of
1570                  * the buffer, given by the product of the usec time
1571                  * and the actual offset.
1572                  */
1573                 offset = (io_u->start_time.tv_usec ^ boffset) & 511;
1574                 offset &= ~(sizeof(uint64_t) - 1);
1575                 if (offset >= 512 - sizeof(uint64_t))
1576                         offset -= sizeof(uint64_t);
1577                 memcpy(p + offset, &boffset, sizeof(boffset));
1578
1579                 end = p + 512 - sizeof(io_u->start_time);
1580                 memcpy(end, &io_u->start_time, sizeof(io_u->start_time));
1581                 p += 512;
1582                 boffset += 512;
1583         }
1584 }
1585
1586 /*
1587  * Return an io_u to be processed. Gets a buflen and offset, sets direction,
1588  * etc. The returned io_u is fully ready to be prepped and submitted.
1589  */
1590 struct io_u *get_io_u(struct thread_data *td)
1591 {
1592         struct fio_file *f;
1593         struct io_u *io_u;
1594         int do_scramble = 0;
1595         long ret = 0;
1596
1597         io_u = __get_io_u(td);
1598         if (!io_u) {
1599                 dprint(FD_IO, "__get_io_u failed\n");
1600                 return NULL;
1601         }
1602
1603         if (check_get_verify(td, io_u))
1604                 goto out;
1605         if (check_get_trim(td, io_u))
1606                 goto out;
1607
1608         /*
1609          * from a requeue, io_u already setup
1610          */
1611         if (io_u->file)
1612                 goto out;
1613
1614         /*
1615          * If using an iolog, grab next piece if any available.
1616          */
1617         if (td->flags & TD_F_READ_IOLOG) {
1618                 if (read_iolog_get(td, io_u))
1619                         goto err_put;
1620         } else if (set_io_u_file(td, io_u)) {
1621                 ret = -EBUSY;
1622                 dprint(FD_IO, "io_u %p, setting file failed\n", io_u);
1623                 goto err_put;
1624         }
1625
1626         f = io_u->file;
1627         if (!f) {
1628                 dprint(FD_IO, "io_u %p, setting file failed\n", io_u);
1629                 goto err_put;
1630         }
1631
1632         assert(fio_file_open(f));
1633
1634         if (ddir_rw(io_u->ddir)) {
1635                 if (!io_u->buflen && !td_ioengine_flagged(td, FIO_NOIO)) {
1636                         dprint(FD_IO, "get_io_u: zero buflen on %p\n", io_u);
1637                         goto err_put;
1638                 }
1639
1640                 f->last_start[io_u->ddir] = io_u->offset;
1641                 f->last_pos[io_u->ddir] = io_u->offset + io_u->buflen;
1642
1643                 if (io_u->ddir == DDIR_WRITE) {
1644                         if (td->flags & TD_F_REFILL_BUFFERS) {
1645                                 io_u_fill_buffer(td, io_u,
1646                                         td->o.min_bs[DDIR_WRITE],
1647                                         io_u->buflen);
1648                         } else if ((td->flags & TD_F_SCRAMBLE_BUFFERS) &&
1649                                    !(td->flags & TD_F_COMPRESS))
1650                                 do_scramble = 1;
1651                         if (td->flags & TD_F_VER_NONE) {
1652                                 populate_verify_io_u(td, io_u);
1653                                 do_scramble = 0;
1654                         }
1655                 } else if (io_u->ddir == DDIR_READ) {
1656                         /*
1657                          * Reset the buf_filled parameters so next time if the
1658                          * buffer is used for writes it is refilled.
1659                          */
1660                         io_u->buf_filled_len = 0;
1661                 }
1662         }
1663
1664         /*
1665          * Set io data pointers.
1666          */
1667         io_u->xfer_buf = io_u->buf;
1668         io_u->xfer_buflen = io_u->buflen;
1669
1670 out:
1671         assert(io_u->file);
1672         if (!td_io_prep(td, io_u)) {
1673                 if (!td->o.disable_lat)
1674                         fio_gettime(&io_u->start_time, NULL);
1675                 if (do_scramble)
1676                         small_content_scramble(io_u);
1677                 return io_u;
1678         }
1679 err_put:
1680         dprint(FD_IO, "get_io_u failed\n");
1681         put_io_u(td, io_u);
1682         return ERR_PTR(ret);
1683 }
1684
1685 static void __io_u_log_error(struct thread_data *td, struct io_u *io_u)
1686 {
1687         enum error_type_bit eb = td_error_type(io_u->ddir, io_u->error);
1688
1689         if (td_non_fatal_error(td, eb, io_u->error) && !td->o.error_dump)
1690                 return;
1691
1692         log_err("fio: io_u error%s%s: %s: %s offset=%llu, buflen=%lu\n",
1693                 io_u->file ? " on file " : "",
1694                 io_u->file ? io_u->file->file_name : "",
1695                 strerror(io_u->error),
1696                 io_ddir_name(io_u->ddir),
1697                 io_u->offset, io_u->xfer_buflen);
1698
1699         if (td->io_ops->errdetails) {
1700                 char *err = td->io_ops->errdetails(io_u);
1701
1702                 log_err("fio: %s\n", err);
1703                 free(err);
1704         }
1705
1706         if (!td->error)
1707                 td_verror(td, io_u->error, "io_u error");
1708 }
1709
1710 void io_u_log_error(struct thread_data *td, struct io_u *io_u)
1711 {
1712         __io_u_log_error(td, io_u);
1713         if (td->parent)
1714                 __io_u_log_error(td->parent, io_u);
1715 }
1716
1717 static inline bool gtod_reduce(struct thread_data *td)
1718 {
1719         return (td->o.disable_clat && td->o.disable_slat && td->o.disable_bw)
1720                         || td->o.gtod_reduce;
1721 }
1722
1723 static void account_io_completion(struct thread_data *td, struct io_u *io_u,
1724                                   struct io_completion_data *icd,
1725                                   const enum fio_ddir idx, unsigned int bytes)
1726 {
1727         const int no_reduce = !gtod_reduce(td);
1728         unsigned long lusec = 0;
1729
1730         if (td->parent)
1731                 td = td->parent;
1732
1733         if (no_reduce)
1734                 lusec = utime_since(&io_u->issue_time, &icd->time);
1735
1736         if (!td->o.disable_lat) {
1737                 unsigned long tusec;
1738
1739                 tusec = utime_since(&io_u->start_time, &icd->time);
1740                 add_lat_sample(td, idx, tusec, bytes, io_u->offset);
1741
1742                 if (td->flags & TD_F_PROFILE_OPS) {
1743                         struct prof_io_ops *ops = &td->prof_io_ops;
1744
1745                         if (ops->io_u_lat)
1746                                 icd->error = ops->io_u_lat(td, tusec);
1747                 }
1748
1749                 if (td->o.max_latency && tusec > td->o.max_latency)
1750                         lat_fatal(td, icd, tusec, td->o.max_latency);
1751                 if (td->o.latency_target && tusec > td->o.latency_target) {
1752                         if (lat_target_failed(td))
1753                                 lat_fatal(td, icd, tusec, td->o.latency_target);
1754                 }
1755         }
1756
1757         if (ddir_rw(idx)) {
1758                 if (!td->o.disable_clat) {
1759                         add_clat_sample(td, idx, lusec, bytes, io_u->offset);
1760                         io_u_mark_latency(td, lusec);
1761                 }
1762
1763                 if (!td->o.disable_bw && per_unit_log(td->bw_log))
1764                         add_bw_sample(td, io_u, bytes, lusec);
1765
1766                 if (no_reduce && per_unit_log(td->iops_log))
1767                         add_iops_sample(td, io_u, bytes);
1768         }
1769
1770         if (td->ts.nr_block_infos && io_u->ddir == DDIR_TRIM) {
1771                 uint32_t *info = io_u_block_info(td, io_u);
1772                 if (BLOCK_INFO_STATE(*info) < BLOCK_STATE_TRIM_FAILURE) {
1773                         if (io_u->ddir == DDIR_TRIM) {
1774                                 *info = BLOCK_INFO(BLOCK_STATE_TRIMMED,
1775                                                 BLOCK_INFO_TRIMS(*info) + 1);
1776                         } else if (io_u->ddir == DDIR_WRITE) {
1777                                 *info = BLOCK_INFO_SET_STATE(BLOCK_STATE_WRITTEN,
1778                                                                 *info);
1779                         }
1780                 }
1781         }
1782 }
1783
1784 static void file_log_write_comp(const struct thread_data *td, struct fio_file *f,
1785                                 uint64_t offset, unsigned int bytes)
1786 {
1787         int idx;
1788
1789         if (!f)
1790                 return;
1791
1792         if (f->first_write == -1ULL || offset < f->first_write)
1793                 f->first_write = offset;
1794         if (f->last_write == -1ULL || ((offset + bytes) > f->last_write))
1795                 f->last_write = offset + bytes;
1796
1797         if (!f->last_write_comp)
1798                 return;
1799
1800         idx = f->last_write_idx++;
1801         f->last_write_comp[idx] = offset;
1802         if (f->last_write_idx == td->o.iodepth)
1803                 f->last_write_idx = 0;
1804 }
1805
1806 static void io_completed(struct thread_data *td, struct io_u **io_u_ptr,
1807                          struct io_completion_data *icd)
1808 {
1809         struct io_u *io_u = *io_u_ptr;
1810         enum fio_ddir ddir = io_u->ddir;
1811         struct fio_file *f = io_u->file;
1812
1813         dprint_io_u(io_u, "io complete");
1814
1815         assert(io_u->flags & IO_U_F_FLIGHT);
1816         io_u_clear(td, io_u, IO_U_F_FLIGHT | IO_U_F_BUSY_OK);
1817
1818         /*
1819          * Mark IO ok to verify
1820          */
1821         if (io_u->ipo) {
1822                 /*
1823                  * Remove errored entry from the verification list
1824                  */
1825                 if (io_u->error)
1826                         unlog_io_piece(td, io_u);
1827                 else {
1828                         io_u->ipo->flags &= ~IP_F_IN_FLIGHT;
1829                         write_barrier();
1830                 }
1831         }
1832
1833         if (ddir_sync(ddir)) {
1834                 td->last_was_sync = 1;
1835                 if (f) {
1836                         f->first_write = -1ULL;
1837                         f->last_write = -1ULL;
1838                 }
1839                 return;
1840         }
1841
1842         td->last_was_sync = 0;
1843         td->last_ddir = ddir;
1844
1845         if (!io_u->error && ddir_rw(ddir)) {
1846                 unsigned int bytes = io_u->buflen - io_u->resid;
1847                 int ret;
1848
1849                 td->io_blocks[ddir]++;
1850                 td->this_io_blocks[ddir]++;
1851                 td->io_bytes[ddir] += bytes;
1852
1853                 if (!(io_u->flags & IO_U_F_VER_LIST))
1854                         td->this_io_bytes[ddir] += bytes;
1855
1856                 if (ddir == DDIR_WRITE)
1857                         file_log_write_comp(td, f, io_u->offset, bytes);
1858
1859                 if (ramp_time_over(td) && (td->runstate == TD_RUNNING ||
1860                                            td->runstate == TD_VERIFYING))
1861                         account_io_completion(td, io_u, icd, ddir, bytes);
1862
1863                 icd->bytes_done[ddir] += bytes;
1864
1865                 if (io_u->end_io) {
1866                         ret = io_u->end_io(td, io_u_ptr);
1867                         io_u = *io_u_ptr;
1868                         if (ret && !icd->error)
1869                                 icd->error = ret;
1870                 }
1871         } else if (io_u->error) {
1872                 icd->error = io_u->error;
1873                 io_u_log_error(td, io_u);
1874         }
1875         if (icd->error) {
1876                 enum error_type_bit eb = td_error_type(ddir, icd->error);
1877
1878                 if (!td_non_fatal_error(td, eb, icd->error))
1879                         return;
1880
1881                 /*
1882                  * If there is a non_fatal error, then add to the error count
1883                  * and clear all the errors.
1884                  */
1885                 update_error_count(td, icd->error);
1886                 td_clear_error(td);
1887                 icd->error = 0;
1888                 if (io_u)
1889                         io_u->error = 0;
1890         }
1891 }
1892
1893 static void init_icd(struct thread_data *td, struct io_completion_data *icd,
1894                      int nr)
1895 {
1896         int ddir;
1897
1898         if (!gtod_reduce(td))
1899                 fio_gettime(&icd->time, NULL);
1900
1901         icd->nr = nr;
1902
1903         icd->error = 0;
1904         for (ddir = DDIR_READ; ddir < DDIR_RWDIR_CNT; ddir++)
1905                 icd->bytes_done[ddir] = 0;
1906 }
1907
1908 static void ios_completed(struct thread_data *td,
1909                           struct io_completion_data *icd)
1910 {
1911         struct io_u *io_u;
1912         int i;
1913
1914         for (i = 0; i < icd->nr; i++) {
1915                 io_u = td->io_ops->event(td, i);
1916
1917                 io_completed(td, &io_u, icd);
1918
1919                 if (io_u)
1920                         put_io_u(td, io_u);
1921         }
1922 }
1923
1924 /*
1925  * Complete a single io_u for the sync engines.
1926  */
1927 int io_u_sync_complete(struct thread_data *td, struct io_u *io_u)
1928 {
1929         struct io_completion_data icd;
1930         int ddir;
1931
1932         init_icd(td, &icd, 1);
1933         io_completed(td, &io_u, &icd);
1934
1935         if (io_u)
1936                 put_io_u(td, io_u);
1937
1938         if (icd.error) {
1939                 td_verror(td, icd.error, "io_u_sync_complete");
1940                 return -1;
1941         }
1942
1943         for (ddir = DDIR_READ; ddir < DDIR_RWDIR_CNT; ddir++)
1944                 td->bytes_done[ddir] += icd.bytes_done[ddir];
1945
1946         return 0;
1947 }
1948
1949 /*
1950  * Called to complete min_events number of io for the async engines.
1951  */
1952 int io_u_queued_complete(struct thread_data *td, int min_evts)
1953 {
1954         struct io_completion_data icd;
1955         struct timespec *tvp = NULL;
1956         int ret, ddir;
1957         struct timespec ts = { .tv_sec = 0, .tv_nsec = 0, };
1958
1959         dprint(FD_IO, "io_u_queued_completed: min=%d\n", min_evts);
1960
1961         if (!min_evts)
1962                 tvp = &ts;
1963         else if (min_evts > td->cur_depth)
1964                 min_evts = td->cur_depth;
1965
1966         /* No worries, td_io_getevents fixes min and max if they are
1967          * set incorrectly */
1968         ret = td_io_getevents(td, min_evts, td->o.iodepth_batch_complete_max, tvp);
1969         if (ret < 0) {
1970                 td_verror(td, -ret, "td_io_getevents");
1971                 return ret;
1972         } else if (!ret)
1973                 return ret;
1974
1975         init_icd(td, &icd, ret);
1976         ios_completed(td, &icd);
1977         if (icd.error) {
1978                 td_verror(td, icd.error, "io_u_queued_complete");
1979                 return -1;
1980         }
1981
1982         for (ddir = DDIR_READ; ddir < DDIR_RWDIR_CNT; ddir++)
1983                 td->bytes_done[ddir] += icd.bytes_done[ddir];
1984
1985         return ret;
1986 }
1987
1988 /*
1989  * Call when io_u is really queued, to update the submission latency.
1990  */
1991 void io_u_queued(struct thread_data *td, struct io_u *io_u)
1992 {
1993         if (!td->o.disable_slat) {
1994                 unsigned long slat_time;
1995
1996                 slat_time = utime_since(&io_u->start_time, &io_u->issue_time);
1997
1998                 if (td->parent)
1999                         td = td->parent;
2000
2001                 add_slat_sample(td, io_u->ddir, slat_time, io_u->xfer_buflen,
2002                                 io_u->offset);
2003         }
2004 }
2005
2006 /*
2007  * See if we should reuse the last seed, if dedupe is enabled
2008  */
2009 static struct frand_state *get_buf_state(struct thread_data *td)
2010 {
2011         unsigned int v;
2012
2013         if (!td->o.dedupe_percentage)
2014                 return &td->buf_state;
2015         else if (td->o.dedupe_percentage == 100) {
2016                 frand_copy(&td->buf_state_prev, &td->buf_state);
2017                 return &td->buf_state;
2018         }
2019
2020         v = rand32_between(&td->dedupe_state, 1, 100);
2021
2022         if (v <= td->o.dedupe_percentage)
2023                 return &td->buf_state_prev;
2024
2025         return &td->buf_state;
2026 }
2027
2028 static void save_buf_state(struct thread_data *td, struct frand_state *rs)
2029 {
2030         if (td->o.dedupe_percentage == 100)
2031                 frand_copy(rs, &td->buf_state_prev);
2032         else if (rs == &td->buf_state)
2033                 frand_copy(&td->buf_state_prev, rs);
2034 }
2035
2036 void fill_io_buffer(struct thread_data *td, void *buf, unsigned int min_write,
2037                     unsigned int max_bs)
2038 {
2039         struct thread_options *o = &td->o;
2040
2041         if (o->compress_percentage || o->dedupe_percentage) {
2042                 unsigned int perc = td->o.compress_percentage;
2043                 struct frand_state *rs;
2044                 unsigned int left = max_bs;
2045                 unsigned int this_write;
2046
2047                 do {
2048                         rs = get_buf_state(td);
2049
2050                         min_write = min(min_write, left);
2051
2052                         if (perc) {
2053                                 this_write = min_not_zero(min_write,
2054                                                         td->o.compress_chunk);
2055
2056                                 fill_random_buf_percentage(rs, buf, perc,
2057                                         this_write, this_write,
2058                                         o->buffer_pattern,
2059                                         o->buffer_pattern_bytes);
2060                         } else {
2061                                 fill_random_buf(rs, buf, min_write);
2062                                 this_write = min_write;
2063                         }
2064
2065                         buf += this_write;
2066                         left -= this_write;
2067                         save_buf_state(td, rs);
2068                 } while (left);
2069         } else if (o->buffer_pattern_bytes)
2070                 fill_buffer_pattern(td, buf, max_bs);
2071         else if (o->zero_buffers)
2072                 memset(buf, 0, max_bs);
2073         else
2074                 fill_random_buf(get_buf_state(td), buf, max_bs);
2075 }
2076
2077 /*
2078  * "randomly" fill the buffer contents
2079  */
2080 void io_u_fill_buffer(struct thread_data *td, struct io_u *io_u,
2081                       unsigned int min_write, unsigned int max_bs)
2082 {
2083         io_u->buf_filled_len = 0;
2084         fill_io_buffer(td, io_u->buf, min_write, max_bs);
2085 }