gettime-thread: set and allow multiple CPUs
authorJens Axboe <axboe@fb.com>
Wed, 17 Dec 2014 03:38:53 +0000 (20:38 -0700)
committerJens Axboe <axboe@fb.com>
Wed, 17 Dec 2014 03:38:53 +0000 (20:38 -0700)
Also use the new option checking framework instead of carrying
a flag for whether it's set or not.

Signed-off-by: Jens Axboe <axboe@fb.com>
cconv.c
gettime-thread.c
gettime.h
init.c
options.c
server.h
thread_options.h

diff --git a/cconv.c b/cconv.c
index 0de2f5c7fd6e177081da95ef90e06c3e4eff574b..0fca764e97865b8e4bd9fbaf869a6d9c489c71ec 100644 (file)
--- a/cconv.c
+++ b/cconv.c
@@ -219,7 +219,6 @@ void convert_thread_options_to_cpu(struct thread_options *o,
        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);
@@ -381,7 +380,6 @@ void convert_thread_options_to_net(struct thread_options_pack *top,
        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);
index 95f35c32e46cff25f6b43005462f608e1975fabf..73632d0b35675510a9edd2a8c52cf0f15bec71e2 100644 (file)
@@ -8,11 +8,14 @@
 
 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");
@@ -31,10 +34,16 @@ static void fio_gtod_update(void)
        }
 }
 
+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);
 
        /*
@@ -84,4 +93,7 @@ err:
        return ret;
 }
 
-
+void fio_gtod_set_cpu(unsigned int cpu)
+{
+       fio_cpu_set(&fio_gtod_cpumask, cpu);
+}
index f5412286e3bad41dd32111f8885d647af20fad75..b775ef3a42d1964b998c51cb9f2348213bec67e9 100644 (file)
--- a/gettime.h
+++ b/gettime.h
@@ -38,4 +38,6 @@ static inline int fio_gettime_offload(struct timeval *tv)
        return 1;
 }
 
+extern void fio_gtod_set_cpu(unsigned int cpu);
+
 #endif
diff --git a/init.c b/init.c
index f606087e42c942e565314f20a57a038be2535d68..427768c3531669999f04b044fa991764dbce2d76 100644 (file)
--- a/init.c
+++ b/init.c
@@ -758,6 +758,12 @@ static int fixup_options(struct thread_data *td)
                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;
 }
 
@@ -2385,12 +2391,6 @@ int parse_options(int argc, char *argv[])
                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);
 
index a01b2d9b0c574621e127c1262ce965fc102e73f7..80a7047ee65179b3a47af37f031543d18b9feb81 100644 (file)
--- a/options.c
+++ b/options.c
@@ -1079,16 +1079,6 @@ static int str_gtod_reduce_cb(void *data, int *il)
        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;
@@ -3404,7 +3394,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .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,
index cd3f999384120f41e70e205d61a2f2715f99b8ac..dc5a69e82ad6821d96e7a7c5f9e5ca2d6b9524cd 100644 (file)
--- a/server.h
+++ b/server.h
@@ -38,7 +38,7 @@ struct fio_net_cmd_reply {
 };
 
 enum {
-       FIO_SERVER_VER                  = 41,
+       FIO_SERVER_VER                  = 42,
 
        FIO_SERVER_MAX_FRAGMENT_PDU     = 1024,
        FIO_SERVER_MAX_CMD_MB           = 2048,
index 530dd9a6f460e7b33a2c86efa62a6f0d45ffb93b..611f8e7376fab6eff15272bb08adb62ec09270ab 100644 (file)
@@ -195,7 +195,6 @@ struct thread_options {
        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;
@@ -419,7 +418,6 @@ struct thread_options_pack {
        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;
@@ -428,6 +426,7 @@ struct thread_options_pack {
        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];
@@ -480,10 +479,10 @@ struct thread_options_pack {
        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));