Lines Matching refs:oper
296 static void oper_list_add(struct io_oper *oper, struct io_oper **list)
299 *list = oper;
300 oper->prev = oper->next = oper;
304 oper->prev = (*list)->prev;
305 oper->next = *list;
307 (*list)->prev->next = oper;
308 (*list)->prev = oper;
311 static void oper_list_del(struct io_oper *oper, struct io_oper **list)
318 oper->prev->next = oper->next;
319 oper->next->prev = oper->prev;
321 if (*list == oper)
322 *list = oper->next;
369 static int grab_iou(struct io_unit *io, struct io_oper *oper)
376 io->io_oper = oper;
397 static inline double oper_mb_trans(struct io_oper *oper)
399 return ((double)oper->started_ios * (double)oper->reclen) / (double)(1024 * 1024);
402 static void print_time(struct io_oper *oper)
408 runtime = time_since_now(&oper->start_time);
409 mb = oper_mb_trans(oper);
413 stage_name(oper->rw), oper->file_name, tput, mb, runtime);
460 struct io_oper *oper = io->io_oper;
467 oper->num_pending--;
471 if (oper->num_pending == 0 &&
472 (oper->started_ios == oper->total_ios || oper->stonewalled)) {
473 print_time(oper);
508 static struct io_unit *find_iou(struct thread_info *t, struct io_oper *oper)
518 if (grab_iou(event_io, oper))
536 static int io_oper_wait(struct thread_info *t, struct io_oper *oper)
541 if (!oper)
544 if (oper->num_pending == 0)
558 if (oper->num_pending == 0)
562 if (oper->num_err)
563 tst_res(TINFO, "%u errors on oper, last %u", oper->num_err, oper->last_err);
568 static off_t random_byte_offset(struct io_oper *oper)
571 off_t rand_byte = oper->start;
575 range = (oper->end - oper->start) / (1024 * 1024);
596 if (rand_byte + oper->reclen > oper->end)
597 rand_byte -= oper->reclen;
603 * build an aio iocb for an operation, based on oper->rw and the
610 static struct io_unit *build_iocb(struct thread_info *t, struct io_oper *oper)
615 io = find_iou(t, oper);
619 switch (oper->rw) {
621 io_prep_pwrite(&io->iocb, oper->fd, io->buf, oper->reclen, oper->last_offset);
622 oper->last_offset += oper->reclen;
625 io_prep_pread(&io->iocb, oper->fd, io->buf, oper->reclen, oper->last_offset);
626 oper->last_offset += oper->reclen;
629 rand_byte = random_byte_offset(oper);
630 oper->last_offset = rand_byte;
631 io_prep_pread(&io->iocb, oper->fd, io->buf, oper->reclen, rand_byte);
634 rand_byte = random_byte_offset(oper);
635 oper->last_offset = rand_byte;
636 io_prep_pwrite(&io->iocb, oper->fd, io->buf, oper->reclen, rand_byte);
648 static int finish_oper(struct thread_info *t, struct io_oper *oper)
652 io_oper_wait(t, oper);
654 last_err = oper->last_err;
656 if (oper->num_pending > 0)
657 tst_res(TINFO, "oper num_pending is %d", oper->num_pending);
659 SAFE_CLOSE(oper->fd);
660 free(oper);
672 struct io_oper *oper;
674 oper = SAFE_MALLOC(sizeof(*oper));
675 memset(oper, 0, sizeof(*oper));
677 oper->depth = depth;
678 oper->start = start;
679 oper->end = end;
680 oper->last_offset = oper->start;
681 oper->fd = fd;
682 oper->reclen = reclen;
683 oper->rw = rw;
684 oper->total_ios = (oper->end - oper->start) / oper->reclen;
685 oper->file_name = file_name;
687 return oper;
694 static int build_oper(struct thread_info *t, struct io_oper *oper, int num_ios,
700 if (oper->started_ios == 0)
701 gettimeofday(&oper->start_time, NULL);
704 num_ios = oper->total_ios;
706 if ((oper->started_ios + num_ios) > oper->total_ios)
707 num_ios = oper->total_ios - oper->started_ios;
710 io = build_iocb(t, oper);
722 * counters in the associated oper struct
784 * changes oper->rw to the next in a command sequence, or returns zero
787 static int restart_oper(struct io_oper *oper)
791 if (oper->last_err)
794 if (oper->rw == WRITE && (stages & (1 << READ)))
797 if (oper->rw == READ && (!new_rw && stages & (1 << RWRITE)))
800 if (oper->rw == RWRITE && (!new_rw && stages & (1 << RREAD)))
804 oper->started_ios = 0;
805 oper->last_offset = oper->start;
806 oper->stonewalled = 0;
812 if (oper->num_pending)
813 print_time(oper);
815 oper->rw = new_rw;
822 static int oper_runnable(struct io_oper *oper)
829 if (oper->started_ios || oper->start == 0)
833 if (oper->rw >= RWRITE)
836 SAFE_FSTAT(oper->fd, &buf);
837 if (S_ISREG(buf.st_mode) && buf.st_size < oper->start)
856 struct io_oper *oper;
862 oper = t->active_opers;
864 while (oper) {
865 if (!oper_runnable(oper)) {
866 oper = oper->next;
867 if (oper == t->active_opers)
872 ret = build_oper(t, oper, io_iter, my_iocbs);
876 oper_list_del(oper, &t->active_opers);
877 oper_list_add(oper, &built_opers);
878 oper = t->active_opers;
891 oper = built_opers;
892 oper_list_del(oper, &built_opers);
893 oper_list_add(oper, &t->active_opers);
894 if (oper->started_ios == oper->total_ios) {
895 oper_list_del(oper, &t->active_opers);
896 oper_list_add(oper, &t->finished_opers);
1038 struct io_oper *oper;
1073 oper = t->finished_opers;
1075 if (!oper)
1077 io_oper_wait(t, oper);
1078 oper = oper->next;
1079 } while (oper != t->finished_opers);
1084 oper = t->finished_opers;
1085 while (oper) {
1087 SAFE_FSYNC(oper->fd);
1089 t->stage_mb_trans += oper_mb_trans(oper);
1091 if (restart_oper(oper)) {
1092 oper_list_del(oper, &t->finished_opers);
1093 oper_list_add(oper, &t->active_opers);
1094 oper = t->finished_opers;
1098 oper = oper->next;
1100 if (oper == t->finished_opers)
1123 oper = t->finished_opers;
1124 oper_list_del(oper, &t->finished_opers);
1125 status = finish_oper(t, oper);
1234 struct io_oper *oper;
1311 oper = create_oper(rwfd, first_stage, j * context_offset,
1314 if (!oper)
1317 oper_list_add(oper, &t[thread_index].active_opers);