static int pre_read_file(struct thread_data *td, struct fio_file *f) { int r, did_open = 0, old_runstate; unsigned long long left; unsigned int bs; char *b; if (td->io_ops->flags & FIO_PIPEIO) return 0; if (!fio_file_open(f)) { if (td->io_ops->open_file(td, f)) { log_err("fio: cannot pre-read, failed to open file\n"); return 1; } did_open = 1; } old_runstate = td->runstate; td_set_runstate(td, TD_PRE_READING); bs = td->o.max_bs[DDIR_READ]; b = malloc(bs); memset(b, 0, bs); lseek(f->fd, f->file_offset, SEEK_SET); left = f->io_size; while (left && !td->terminate) { if (bs > left) bs = left; r = read(f->fd, b, bs); if (r == (int) bs) { left -= bs; continue; } else { td_verror(td, EIO, "pre_read"); break; } } td_set_runstate(td, old_runstate); if (did_open) td->io_ops->close_file(td, f); free(b); return 0; }
static int fio_rdmaio_setup_listen(struct thread_data *td, short port) { struct rdmaio_data *rd = td->io_ops->data; struct ibv_recv_wr *bad_wr; int state = td->runstate; td_set_runstate(td, TD_SETTING_UP); rd->addr.sin_family = AF_INET; rd->addr.sin_addr.s_addr = htonl(INADDR_ANY); rd->addr.sin_port = htons(port); /* rdma_listen */ if (rdma_bind_addr(rd->cm_id, (struct sockaddr *)&rd->addr) != 0) { log_err("fio: rdma_bind_addr fail\n"); return 1; } if (rdma_listen(rd->cm_id, 3) != 0) { log_err("fio: rdma_listen fail\n"); return 1; } log_info("fio: waiting for connection\n"); /* wait for CONNECT_REQUEST */ if (get_next_channel_event (td, rd->cm_channel, RDMA_CM_EVENT_CONNECT_REQUEST) != 0) { log_err("fio: wait for RDMA_CM_EVENT_CONNECT_REQUEST\n"); return 1; } if (fio_rdmaio_setup_qp(td) != 0) return 1; if (fio_rdmaio_setup_control_msg_buffers(td) != 0) return 1; /* post recv buf */ if (ibv_post_recv(rd->qp, &rd->rq_wr, &bad_wr) != 0) { log_err("fio: ibv_post_recv fail\n"); return 1; } td_set_runstate(td, state); return 0; }
static void parent_update_ramp(struct thread_data *td) { struct thread_data *parent = td->parent; if (!parent || parent->ramp_time_over) return; reset_all_stats(parent); parent->ramp_time_over = 1; td_set_runstate(parent, TD_RAMP); }
static void free_worker(struct submit_worker *sw) { struct thread_data *td = &sw->td; fio_options_free(td); close_and_free_files(td); if (td->io_ops) close_ioengine(td); td_set_runstate(td, TD_EXITED); pthread_cond_destroy(&sw->cond); pthread_mutex_destroy(&sw->lock); }
static void io_workqueue_exit_worker_fn(struct submit_worker *sw, unsigned int *sum_cnt) { struct thread_data *td = sw->priv; (*sum_cnt)++; sum_thread_stats(&sw->wq->td->ts, &td->ts, *sum_cnt == 1); fio_options_free(td); close_and_free_files(td); if (td->io_ops) close_ioengine(td); td_set_runstate(td, TD_EXITED); }
static int init_submit_worker(struct submit_worker *sw) { struct thread_data *parent = sw->wq->td; struct thread_data *td = &sw->td; int fio_unused ret; memcpy(&td->o, &parent->o, sizeof(td->o)); memcpy(&td->ts, &parent->ts, sizeof(td->ts)); td->o.uid = td->o.gid = -1U; dup_files(td, parent); td->eo = parent->eo; fio_options_mem_dupe(td); if (ioengine_load(td)) goto err; if (td->o.odirect) td->io_ops->flags |= FIO_RAWIO; td->pid = gettid(); INIT_FLIST_HEAD(&td->io_log_list); INIT_FLIST_HEAD(&td->io_hist_list); INIT_FLIST_HEAD(&td->verify_list); INIT_FLIST_HEAD(&td->trim_list); INIT_FLIST_HEAD(&td->next_rand_list); td->io_hist_tree = RB_ROOT; td->o.iodepth = 1; if (td_io_init(td)) goto err_io_init; fio_gettime(&td->epoch, NULL); fio_getrusage(&td->ru_start); clear_io_state(td); td_set_runstate(td, TD_RUNNING); td->flags |= TD_F_CHILD; td->parent = parent; return 0; err_io_init: close_ioengine(td); err: return 1; }
int ramp_time_over(struct thread_data *td) { struct timeval tv; if (!td->o.ramp_time || td->ramp_time_over) return 1; fio_gettime(&tv, NULL); if (mtime_since(&td->epoch, &tv) >= td->o.ramp_time * 1000) { td->ramp_time_over = 1; reset_all_stats(td); td_set_runstate(td, TD_RAMP); return 1; } return 0; }
static int io_workqueue_init_worker_fn(struct submit_worker *sw) { struct thread_data *parent = sw->wq->td; struct thread_data *td = sw->priv; memcpy(&td->o, &parent->o, sizeof(td->o)); memcpy(&td->ts, &parent->ts, sizeof(td->ts)); td->o.uid = td->o.gid = -1U; dup_files(td, parent); td->eo = parent->eo; fio_options_mem_dupe(td); if (ioengine_load(td)) goto err; td->pid = gettid(); INIT_FLIST_HEAD(&td->io_log_list); INIT_FLIST_HEAD(&td->io_hist_list); INIT_FLIST_HEAD(&td->verify_list); INIT_FLIST_HEAD(&td->trim_list); td->io_hist_tree = RB_ROOT; td->o.iodepth = 1; if (td_io_init(td)) goto err_io_init; set_epoch_time(td, td->o.log_unix_epoch); fio_getrusage(&td->ru_start); clear_io_state(td, 1); td_set_runstate(td, TD_RUNNING); td->flags |= TD_F_CHILD | TD_F_NEED_LOCK; td->parent = parent; return 0; err_io_init: close_ioengine(td); err: return 1; }