* This describes a single thread/process executing a fio job.
*/
struct thread_data {
- struct thread_options o;
struct flist_head opt_list;
unsigned long flags;
+ struct thread_options o;
void *eo;
- char verror[FIO_VERROR_SIZE];
pthread_t thread;
unsigned int thread_number;
unsigned int subjob_number;
struct io_log *slat_log;
struct io_log *clat_log;
+ struct io_log *clat_hist_log;
struct io_log *lat_log;
struct io_log *bw_log;
struct io_log *iops_log;
*/
struct ioengine_ops *io_ops;
+ /*
+ * IO engine private data and dlhandle.
+ */
+ void *io_ops_data;
+ void *io_ops_dlhandle;
+
/*
* Queue depth of io_u's that fio MIGHT do
*/
void *prof_data;
void *pinned_mem;
+
+ char verror[FIO_VERROR_SIZE];
};
/*
TD_EXITED,
TD_REAPED,
TD_LAST,
+ TD_NR,
};
+#define TD_ENG_FLAG_SHIFT 16
+#define TD_ENG_FLAG_MASK ((1U << 16) - 1)
+
+static inline enum fio_ioengine_flags td_ioengine_flags(struct thread_data *td)
+{
+ return (td->flags >> TD_ENG_FLAG_SHIFT) & TD_ENG_FLAG_MASK;
+}
+
+static inline void td_set_ioengine_flags(struct thread_data *td)
+{
+ td->flags |= (td->io_ops->flags << TD_ENG_FLAG_SHIFT);
+}
+
+static inline bool td_ioengine_flagged(struct thread_data *td, unsigned int val)
+{
+ return ((td->flags >> TD_ENG_FLAG_SHIFT) & val) != 0;
+}
+
extern void td_set_runstate(struct thread_data *, int);
extern int td_bump_runstate(struct thread_data *, int);
extern void td_restore_runstate(struct thread_data *, int);
return min(td->o.min_bs[DDIR_TRIM], min_bs);
}
-static inline int td_async_processing(struct thread_data *td)
+static inline bool td_async_processing(struct thread_data *td)
{
return (td->flags & TD_F_NEED_LOCK) != 0;
}
pthread_cond_signal(&td->free_cond);
}
+static inline void td_flags_clear(struct thread_data *td, unsigned int *flags,
+ unsigned int value)
+{
+ if (!td_async_processing(td))
+ *flags &= ~value;
+ else
+ __sync_fetch_and_and(flags, ~value);
+}
+
+static inline void td_flags_set(struct thread_data *td, unsigned int *flags,
+ unsigned int value)
+{
+ if (!td_async_processing(td))
+ *flags |= value;
+ else
+ __sync_fetch_and_or(flags, value);
+}
+
extern const char *fio_get_arch_string(int);
extern const char *fio_get_os_string(int);