From: Sitsofe Wheeler Date: Sun, 27 Nov 2016 17:07:10 +0000 (+0000) Subject: stat: Change access to io_sample union X-Git-Tag: fio-2.16~15 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=af2fde1961fe6847b7f3dbbc74aa46ec09d0e129 stat: Change access to io_sample union Compiling on certain platforms produces warnings like stat.c: In function ‘add_clat_sample’: stat.c:2241:28: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] because the size of a pointer is different to that of a long. Work around this by explicitly naming the union used in io_sample, forcing the "val" in the union to be a uint64_t, changing function parameters to accept a union (rather than an unsigned long) and adding helper functions to wrap values into a union. Signed-off-by: Sitsofe Wheeler --- diff --git a/client.c b/client.c index 9a8cf17e..c6138871 100644 --- a/client.c +++ b/client.c @@ -1276,7 +1276,7 @@ static void client_flush_hist_samples(FILE *f, int hist_coarseness, void *sample s = (struct io_sample *)((char *)__get_sample(samples, log_offset, i) + i * sizeof(struct io_u_plat_entry)); - entry = s->plat_entry; + entry = s->data.plat_entry; io_u_plat = entry->io_u_plat; fprintf(f, "%lu, %u, %u, ", (unsigned long) s->time, @@ -1552,7 +1552,7 @@ static struct cmd_iolog_pdu *convert_iolog(struct fio_net_cmd *cmd, s = (struct io_sample *)((void *)s + sizeof(struct io_u_plat_entry) * i); s->time = le64_to_cpu(s->time); - s->val = le64_to_cpu(s->val); + s->data.val = le64_to_cpu(s->data.val); s->__ddir = le32_to_cpu(s->__ddir); s->bs = le32_to_cpu(s->bs); @@ -1563,9 +1563,9 @@ static struct cmd_iolog_pdu *convert_iolog(struct fio_net_cmd *cmd, } if (ret->log_type == IO_LOG_TYPE_HIST) { - s->plat_entry = (struct io_u_plat_entry *)(((void *)s) + sizeof(*s)); - s->plat_entry->list.next = NULL; - s->plat_entry->list.prev = NULL; + s->data.plat_entry = (struct io_u_plat_entry *)(((void *)s) + sizeof(*s)); + s->data.plat_entry->list.next = NULL; + s->data.plat_entry->list.prev = NULL; } } diff --git a/eta.c b/eta.c index f39b1fe7..19afad5b 100644 --- a/eta.c +++ b/eta.c @@ -482,9 +482,9 @@ bool calc_thread_status(struct jobs_eta *je, int force) calc_rate(unified_rw_rep, rate_time, io_bytes, rate_io_bytes, je->rate); memcpy(&rate_prev_time, &now, sizeof(now)); - add_agg_sample(je->rate[DDIR_READ], DDIR_READ, 0); - add_agg_sample(je->rate[DDIR_WRITE], DDIR_WRITE, 0); - add_agg_sample(je->rate[DDIR_TRIM], DDIR_TRIM, 0); + add_agg_sample(sample_val(je->rate[DDIR_READ]), DDIR_READ, 0); + add_agg_sample(sample_val(je->rate[DDIR_WRITE]), DDIR_WRITE, 0); + add_agg_sample(sample_val(je->rate[DDIR_TRIM]), DDIR_TRIM, 0); } disp_time = mtime_since(&disp_prev_time, &now); diff --git a/iolog.c b/iolog.c index f0ce3b25..2bc3e3a1 100644 --- a/iolog.c +++ b/iolog.c @@ -720,7 +720,7 @@ static void flush_hist_samples(FILE *f, int hist_coarseness, void *samples, for (i = 0; i < nr_samples; i++) { s = __get_sample(samples, log_offset, i); - entry = (struct io_u_plat_entry *) (uintptr_t) s->val; + entry = s->data.plat_entry; io_u_plat = entry->io_u_plat; entry_before = flist_first_entry(&entry->list, struct io_u_plat_entry, list); @@ -759,16 +759,16 @@ void flush_samples(FILE *f, void *samples, uint64_t sample_size) s = __get_sample(samples, log_offset, i); if (!log_offset) { - fprintf(f, "%lu, %lu, %u, %u\n", + fprintf(f, "%lu, %" PRId64 ", %u, %u\n", (unsigned long) s->time, - (unsigned long) s->val, + s->data.val, io_sample_ddir(s), s->bs); } else { struct io_sample_offset *so = (void *) s; - fprintf(f, "%lu, %lu, %u, %u, %llu\n", + fprintf(f, "%lu, %" PRId64 ", %u, %u, %llu\n", (unsigned long) s->time, - (unsigned long) s->val, + s->data.val, io_sample_ddir(s), s->bs, (unsigned long long) so->offset); } diff --git a/iolog.h b/iolog.h index de641d54..ee289448 100644 --- a/iolog.h +++ b/iolog.h @@ -24,15 +24,21 @@ struct io_hist { struct flist_head list; }; + +union io_sample_data { + uint64_t val; + struct io_u_plat_entry *plat_entry; +}; + +#define sample_val(value) ((union io_sample_data) { .val = value }) +#define sample_plat(plat) ((union io_sample_data) { .plat_entry = plat }) + /* * A single data sample */ struct io_sample { uint64_t time; - union { - uint64_t val; - struct io_u_plat_entry *plat_entry; - }; + union io_sample_data data; uint32_t __ddir; uint32_t bs; }; diff --git a/server.c b/server.c index c520b6bb..ab3e7cf2 100644 --- a/server.c +++ b/server.c @@ -1730,7 +1730,7 @@ static int __fio_append_iolog_gz_hist(struct sk_entry *first, struct io_log *log /* Do the subtraction on server side so that client doesn't have to * reconstruct our linked list from packets. */ - cur_plat_entry = s->plat_entry; + cur_plat_entry = s->data.plat_entry; prev_plat_entry = flist_first_entry(&cur_plat_entry->list, struct io_u_plat_entry, list); cur_plat = cur_plat_entry->io_u_plat; prev_plat = prev_plat_entry->io_u_plat; @@ -1934,7 +1934,7 @@ int fio_send_iolog(struct thread_data *td, struct io_log *log, const char *name) struct io_sample *s = get_sample(log, cur_log, i); s->time = cpu_to_le64(s->time); - s->val = cpu_to_le64(s->val); + s->data.val = cpu_to_le64(s->data.val); s->__ddir = cpu_to_le32(s->__ddir); s->bs = cpu_to_le32(s->bs); diff --git a/stat.c b/stat.c index 1e889f53..423aacd1 100644 --- a/stat.c +++ b/stat.c @@ -2005,7 +2005,7 @@ static struct io_logs *get_cur_log(struct io_log *iolog) return iolog->pending; } -static void __add_log_sample(struct io_log *iolog, unsigned long val, +static void __add_log_sample(struct io_log *iolog, union io_sample_data data, enum fio_ddir ddir, unsigned int bs, unsigned long t, uint64_t offset) { @@ -2022,7 +2022,7 @@ static void __add_log_sample(struct io_log *iolog, unsigned long val, s = get_sample(iolog, cur_log, cur_log->nr_samples); - s->val = val; + s->data = data; s->time = t + (iolog->td ? iolog->td->unix_epoch : 0); io_sample_set_ddir(iolog, s, ddir); s->bs = bs; @@ -2091,14 +2091,14 @@ static void __add_stat_to_log(struct io_log *iolog, enum fio_ddir ddir, * had actual samples done. */ if (iolog->avg_window[ddir].samples) { - unsigned long val; + union io_sample_data data; if (log_max) - val = iolog->avg_window[ddir].max_val; + data.val = iolog->avg_window[ddir].max_val; else - val = iolog->avg_window[ddir].mean.u.f + 0.50; + data.val = iolog->avg_window[ddir].mean.u.f + 0.50; - __add_log_sample(iolog, val, ddir, 0, elapsed, 0); + __add_log_sample(iolog, data, ddir, 0, elapsed, 0); } reset_io_stat(&iolog->avg_window[ddir]); @@ -2114,7 +2114,7 @@ static void _add_stat_to_log(struct io_log *iolog, unsigned long elapsed, } static long add_log_sample(struct thread_data *td, struct io_log *iolog, - unsigned long val, enum fio_ddir ddir, + union io_sample_data data, enum fio_ddir ddir, unsigned int bs, uint64_t offset) { unsigned long elapsed, this_window; @@ -2128,7 +2128,7 @@ static long add_log_sample(struct thread_data *td, struct io_log *iolog, * If no time averaging, just add the log sample. */ if (!iolog->avg_msec) { - __add_log_sample(iolog, val, ddir, bs, elapsed, offset); + __add_log_sample(iolog, data, ddir, bs, elapsed, offset); return 0; } @@ -2136,7 +2136,7 @@ static long add_log_sample(struct thread_data *td, struct io_log *iolog, * Add the sample. If the time period has passed, then * add that entry to the log and clear. */ - add_stat_sample(&iolog->avg_window[ddir], val); + add_stat_sample(&iolog->avg_window[ddir], data.val); /* * If period hasn't passed, adding the above sample is all we @@ -2176,7 +2176,7 @@ void finalize_logs(struct thread_data *td, bool unit_logs) _add_stat_to_log(td->iops_log, elapsed, td->o.log_max != 0); } -void add_agg_sample(unsigned long val, enum fio_ddir ddir, unsigned int bs) +void add_agg_sample(union io_sample_data data, enum fio_ddir ddir, unsigned int bs) { struct io_log *iolog; @@ -2184,7 +2184,7 @@ void add_agg_sample(unsigned long val, enum fio_ddir ddir, unsigned int bs) return; iolog = agg_io_log[ddir]; - __add_log_sample(iolog, val, ddir, bs, mtime_since_genesis(), 0); + __add_log_sample(iolog, data, ddir, bs, mtime_since_genesis(), 0); } static void add_clat_percentile_sample(struct thread_stat *ts, @@ -2208,7 +2208,8 @@ void add_clat_sample(struct thread_data *td, enum fio_ddir ddir, add_stat_sample(&ts->clat_stat[ddir], usec); if (td->clat_log) - add_log_sample(td, td->clat_log, usec, ddir, bs, offset); + add_log_sample(td, td->clat_log, sample_val(usec), ddir, bs, + offset); if (ts->clat_percentiles) add_clat_percentile_sample(ts, usec, ddir); @@ -2238,7 +2239,7 @@ void add_clat_sample(struct thread_data *td, enum fio_ddir ddir, memcpy(&(dst->io_u_plat), io_u_plat, FIO_IO_U_PLAT_NR * sizeof(unsigned int)); flist_add(&dst->list, &hw->list); - __add_log_sample(iolog, (unsigned long)dst, ddir, bs, + __add_log_sample(iolog, sample_plat(dst), ddir, bs, elapsed, offset); /* @@ -2267,7 +2268,7 @@ void add_slat_sample(struct thread_data *td, enum fio_ddir ddir, add_stat_sample(&ts->slat_stat[ddir], usec); if (td->slat_log) - add_log_sample(td, td->slat_log, usec, ddir, bs, offset); + add_log_sample(td, td->slat_log, sample_val(usec), ddir, bs, offset); td_io_u_unlock(td); } @@ -2285,7 +2286,8 @@ void add_lat_sample(struct thread_data *td, enum fio_ddir ddir, add_stat_sample(&ts->lat_stat[ddir], usec); if (td->lat_log) - add_log_sample(td, td->lat_log, usec, ddir, bs, offset); + add_log_sample(td, td->lat_log, sample_val(usec), ddir, bs, + offset); td_io_u_unlock(td); } @@ -2306,7 +2308,8 @@ void add_bw_sample(struct thread_data *td, struct io_u *io_u, add_stat_sample(&ts->bw_stat[io_u->ddir], rate); if (td->bw_log) - add_log_sample(td, td->bw_log, rate, io_u->ddir, bytes, io_u->offset); + add_log_sample(td, td->bw_log, sample_val(rate), io_u->ddir, + bytes, io_u->offset); td->stat_io_bytes[io_u->ddir] = td->this_io_bytes[io_u->ddir]; td_io_u_unlock(td); @@ -2351,7 +2354,8 @@ static int add_bw_samples(struct thread_data *td, struct timeval *t) if (td->o.min_bs[ddir] == td->o.max_bs[ddir]) bs = td->o.min_bs[ddir]; - next = add_log_sample(td, td->bw_log, rate, ddir, bs, 0); + next = add_log_sample(td, td->bw_log, sample_val(rate), + ddir, bs, 0); next_log = min(next_log, next); } @@ -2379,7 +2383,8 @@ void add_iops_sample(struct thread_data *td, struct io_u *io_u, add_stat_sample(&ts->iops_stat[io_u->ddir], 1); if (td->iops_log) - add_log_sample(td, td->iops_log, 1, io_u->ddir, bytes, io_u->offset); + add_log_sample(td, td->iops_log, sample_val(1), io_u->ddir, + bytes, io_u->offset); td->stat_io_blocks[io_u->ddir] = td->this_io_blocks[io_u->ddir]; td_io_u_unlock(td); @@ -2424,7 +2429,8 @@ static int add_iops_samples(struct thread_data *td, struct timeval *t) if (td->o.min_bs[ddir] == td->o.max_bs[ddir]) bs = td->o.min_bs[ddir]; - next = add_log_sample(td, td->iops_log, iops, ddir, bs, 0); + next = add_log_sample(td, td->iops_log, + sample_val(iops), ddir, bs, 0); next_log = min(next_log, next); } diff --git a/stat.h b/stat.h index 7a25415a..75d1f4e6 100644 --- a/stat.h +++ b/stat.h @@ -281,7 +281,7 @@ extern void add_clat_sample(struct thread_data *, enum fio_ddir, unsigned long, unsigned int, uint64_t); extern void add_slat_sample(struct thread_data *, enum fio_ddir, unsigned long, unsigned int, uint64_t); -extern void add_agg_sample(unsigned long, enum fio_ddir, unsigned int); +extern void add_agg_sample(union io_sample_data, enum fio_ddir, unsigned int); extern void add_iops_sample(struct thread_data *, struct io_u *, unsigned int); extern void add_bw_sample(struct thread_data *, struct io_u *,