o->unified_rw_rep = le32_to_cpu(top->unified_rw_rep);
o->gtod_reduce = le32_to_cpu(top->gtod_reduce);
o->gtod_cpu = le32_to_cpu(top->gtod_cpu);
- o->gtod_offload = le32_to_cpu(top->gtod_offload);
o->clocksource = le32_to_cpu(top->clocksource);
o->no_stall = le32_to_cpu(top->no_stall);
o->trim_percentage = le32_to_cpu(top->trim_percentage);
top->unified_rw_rep = cpu_to_le32(o->unified_rw_rep);
top->gtod_reduce = cpu_to_le32(o->gtod_reduce);
top->gtod_cpu = cpu_to_le32(o->gtod_cpu);
- top->gtod_offload = cpu_to_le32(o->gtod_offload);
top->clocksource = cpu_to_le32(o->clocksource);
top->no_stall = cpu_to_le32(o->no_stall);
top->trim_percentage = cpu_to_le32(o->trim_percentage);
struct timeval *fio_tv = NULL;
int fio_gtod_offload = 0;
-int fio_gtod_cpu = -1;
+static os_cpu_mask_t fio_gtod_cpumask;
static pthread_t gtod_thread;
void fio_gtod_init(void)
{
+ if (fio_tv)
+ return;
+
fio_tv = smalloc(sizeof(struct timeval));
if (!fio_tv)
log_err("fio: smalloc pool exhausted\n");
}
}
+struct gtod_cpu_data {
+ struct fio_mutex *mutex;
+ unsigned int cpu;
+};
+
static void *gtod_thread_main(void *data)
{
struct fio_mutex *mutex = data;
+ fio_setaffinity(gettid(), fio_gtod_cpumask);
fio_mutex_up(mutex);
/*
return ret;
}
-
+void fio_gtod_set_cpu(unsigned int cpu)
+{
+ fio_cpu_set(&fio_gtod_cpumask, cpu);
+}
return 1;
}
+extern void fio_gtod_set_cpu(unsigned int cpu);
+
#endif
ret = 1;
}
+ if (fio_option_is_set(o, gtod_cpu)) {
+ fio_gtod_init();
+ fio_gtod_set_cpu(o->gtod_cpu);
+ fio_gtod_offload = 1;
+ }
+
return ret;
}
return 0;
}
- if (def_thread.o.gtod_offload) {
- fio_gtod_init();
- fio_gtod_offload = 1;
- fio_gtod_cpu = def_thread.o.gtod_cpu;
- }
-
if (output_format == FIO_OUTPUT_NORMAL)
log_info("%s\n", fio_version_string);
return 0;
}
-static int str_gtod_cpu_cb(void *data, long long *il)
-{
- struct thread_data *td = data;
- int val = *il;
-
- td->o.gtod_cpu = val;
- td->o.gtod_offload = 1;
- return 0;
-}
-
static int str_size_cb(void *data, unsigned long long *__val)
{
struct thread_data *td = data;
.name = "gtod_cpu",
.lname = "Dedicated gettimeofday() CPU",
.type = FIO_OPT_INT,
- .cb = str_gtod_cpu_cb,
+ .off1 = td_var_offset(gtod_cpu),
.help = "Set up dedicated gettimeofday() thread on this CPU",
.verify = gtod_cpu_verify,
.category = FIO_OPT_C_GENERAL,
};
enum {
- FIO_SERVER_VER = 41,
+ FIO_SERVER_VER = 42,
FIO_SERVER_MAX_FRAGMENT_PDU = 1024,
FIO_SERVER_MAX_CMD_MB = 2048,
unsigned int unified_rw_rep;
unsigned int gtod_reduce;
unsigned int gtod_cpu;
- unsigned int gtod_offload;
enum fio_cs clocksource;
unsigned int no_stall;
unsigned int trim_percentage;
uint32_t unified_rw_rep;
uint32_t gtod_reduce;
uint32_t gtod_cpu;
- uint32_t gtod_offload;
uint32_t clocksource;
uint32_t no_stall;
uint32_t trim_percentage;
uint64_t trim_backlog;
uint32_t clat_percentiles;
uint32_t percentile_precision;
+ uint32_t pad2;
fio_fp64_t percentile_list[FIO_IO_U_LIST_MAX_LEN];
uint8_t read_iolog_file[FIO_TOP_STR_MAX];
uint64_t number_ios;
uint32_t sync_file_range;
- uint32_t pad2;
uint64_t latency_target;
uint64_t latency_window;
+ uint32_t pad3;
fio_fp64_t latency_percentile;
} __attribute__((packed));