};
#endif
+enum {
+ IO_U_F_FREE = 1 << 0,
+ IO_U_F_FLIGHT = 1 << 1,
+};
+
/*
* The io unit
*/
unsigned int seen;
};
+ unsigned int flags;
+
struct fio_file *file;
struct list_head list;
struct fio_file *files;
unsigned int nr_files;
unsigned int nr_uniq_files;
- unsigned int next_file;
+ union {
+ unsigned int next_file;
+ os_random_state_t next_file_state;
+ };
int error;
pid_t pid;
char *orig_buffer;
unsigned int rwmixread;
unsigned int rwmixwrite;
unsigned int nice;
+ unsigned int file_service_type;
char *read_iolog_file;
char *write_iolog_file;
*/
struct list_head io_hist_list;
struct list_head io_log_list;
+
+ /*
+ * timeout handling
+ */
+ struct timeval timeout_end;
+ struct itimerval timer;
};
-#define __td_verror(td, err, msg) \
+/*
+ * roundrobin available files, or choose one at random.
+ */
+enum {
+ FIO_FSERVICE_RANDOM = 1,
+ FIO_FSERVICE_RR = 2,
+};
+
+/*
+ * 30 second per-io_u timeout, with 5 second intervals to avoid resetting
+ * the timer on each queue operation.
+ */
+#define IO_U_TIMEOUT_INC 5
+#define IO_U_TIMEOUT 30
+
+#define __td_verror(td, err, msg, func) \
do { \
if ((td)->error) \
break; \
int e = (err); \
(td)->error = e; \
- snprintf(td->verror, sizeof(td->verror) - 1, "file:%s:%d, error=%s", __FILE__, __LINE__, (msg)); \
+ snprintf(td->verror, sizeof(td->verror) - 1, "file:%s:%d, func=%s, error=%s", __FILE__, __LINE__, (func), (msg)); \
} while (0)
-#define td_verror(td, err) __td_verror((td), (err), strerror((err)))
-#define td_vmsg(td, err, msg) __td_verror((td), (err), (msg))
+#define td_verror(td, err, func) \
+ __td_verror((td), (err), strerror((err)), (func))
+#define td_vmsg(td, err, msg, func) \
+ __td_verror((td), (err), (msg), (func))
extern int exitall_on_terminate;
extern int thread_number;
extern void rate_throttle(struct thread_data *, unsigned long, unsigned int, int);
extern void fill_start_time(struct timeval *);
extern void fio_gettime(struct timeval *, void *);
+extern void set_genesis_time(void);
/*
* Init functions
extern long __must_check io_u_sync_complete(struct thread_data *, struct io_u *, endio_handler *);
extern long __must_check io_u_queued_complete(struct thread_data *, int, endio_handler *);
extern void io_u_queued(struct thread_data *, struct io_u *);
+extern void io_u_init_timeout(void);
+extern void io_u_set_timeout(struct thread_data *);
/*
* io engine entry points