#include "ioengines.h"
#include "iolog.h"
#include "helpers.h"
+#include "minmax.h"
#include "options.h"
#include "profile.h"
#include "fio_time.h"
#include "io_u_queue.h"
#include "workqueue.h"
#include "steadystate.h"
+#include "lib/nowarn_snprintf.h"
#ifdef CONFIG_SOLARISAIO
#include <sys/asynch.h>
#include <cuda.h>
#endif
-struct fio_mutex;
+struct fio_sem;
/*
* offset generator types
__TD_F_READ_IOLOG,
__TD_F_REFILL_BUFFERS,
__TD_F_SCRAMBLE_BUFFERS,
- __TD_F_VER_NONE,
+ __TD_F_DO_VERIFY,
__TD_F_PROFILE_OPS,
__TD_F_COMPRESS,
__TD_F_COMPRESS_LOG,
TD_F_READ_IOLOG = 1U << __TD_F_READ_IOLOG,
TD_F_REFILL_BUFFERS = 1U << __TD_F_REFILL_BUFFERS,
TD_F_SCRAMBLE_BUFFERS = 1U << __TD_F_SCRAMBLE_BUFFERS,
- TD_F_VER_NONE = 1U << __TD_F_VER_NONE,
+ TD_F_DO_VERIFY = 1U << __TD_F_DO_VERIFY,
TD_F_PROFILE_OPS = 1U << __TD_F_PROFILE_OPS,
TD_F_COMPRESS = 1U << __TD_F_COMPRESS,
TD_F_COMPRESS_LOG = 1U << __TD_F_COMPRESS_LOG,
struct timespec iops_sample_time;
volatile int update_rusage;
- struct fio_mutex *rusage_sem;
+ struct fio_sem *rusage_sem;
struct rusage ru_start;
struct rusage ru_end;
uint64_t this_io_bytes[DDIR_RWDIR_CNT];
uint64_t io_skip_bytes;
uint64_t zone_bytes;
- struct fio_mutex *mutex;
+ struct fio_sem *sem;
uint64_t bytes_done[DDIR_RWDIR_CNT];
/*
struct flist_head trim_list;
unsigned long trim_entries;
- struct flist_head next_rand_list;
-
/*
* for fileservice, how often to switch to a new file
*/
break; \
(td)->error = ____e; \
if (!(td)->first_error) \
- snprintf(td->verror, sizeof(td->verror), "file:%s:%d, func=%s, error=%s", __FILE__, __LINE__, (func), (msg)); \
+ nowarn_snprintf(td->verror, sizeof(td->verror), \
+ "file:%s:%d, func=%s, error=%s", \
+ __FILE__, __LINE__, (func), (msg)); \
} while (0)
static inline void fio_ro_check(const struct thread_data *td, struct io_u *io_u)
{
- assert(!(io_u->ddir == DDIR_WRITE && !td_write(td)));
+ assert(!(io_u->ddir == DDIR_WRITE && !td_write(td)) &&
+ !(io_u->ddir == DDIR_TRIM && !td_trim(td)));
}
#define REAL_MAX_JOBS 4096
extern int fio_show_option_help(const char *);
extern void fio_options_set_ioengine_opts(struct option *long_options, struct thread_data *td);
extern void fio_options_dup_and_init(struct option *);
+extern char *fio_option_dup_subs(const char *);
extern void fio_options_mem_dupe(struct thread_data *);
extern void td_fill_rand_seeds(struct thread_data *);
extern void td_fill_verify_state_seed(struct thread_data *);
return false;
}
-static inline bool __should_check_rate(struct thread_data *td,
- enum fio_ddir ddir)
+static inline bool __should_check_rate(struct thread_data *td)
{
return (td->flags & TD_F_CHECK_RATE) != 0;
}
static inline bool should_check_rate(struct thread_data *td)
{
- if (__should_check_rate(td, DDIR_READ) && td->bytes_done[DDIR_READ])
- return true;
- if (__should_check_rate(td, DDIR_WRITE) && td->bytes_done[DDIR_WRITE])
- return true;
- if (__should_check_rate(td, DDIR_TRIM) && td->bytes_done[DDIR_TRIM])
- return true;
+ if (!__should_check_rate(td))
+ return false;
- return false;
+ return ddir_rw_sum(td->bytes_done) != 0;
}
static inline unsigned int td_max_bs(struct thread_data *td)