On 2/1/22 06:13, Niklas Cassel wrote: > From: Niklas Cassel <niklas.cassel@xxxxxxx> > > To be able to report clat stats on a per priority granularity (instead of > only high/low priority), we need to be able to get the priority value that > was used for the stats in clat_stat. > > When a thread is using a single priority (e.g. option prio/prioclass is > used (without any cmdprio options)), all the clat stats for this thread > will be stored in clat_stat. The problem with this is sum_thread_stats() > does not know the priority value that corresponds to the stats stored in > clat_stat. > > Since we cannot access td->ioprio from sum_thread_stats(), simply mirror > td->ioprio inside struct thread_stat. > > This way, sum_thread_stats() will be able to reuse the global clat stats > in clat_stat, without the need to duplicate the data for per priority > stats, in the case where there is only a single priority in use. > > Signed-off-by: Niklas Cassel <niklas.cassel@xxxxxxx> > --- > backend.c | 1 + > client.c | 1 + > server.c | 1 + > stat.h | 3 +++ > 4 files changed, 6 insertions(+) > > diff --git a/backend.c b/backend.c > index f7398b23..abaaeeb8 100644 > --- a/backend.c > +++ b/backend.c > @@ -1786,6 +1786,7 @@ static void *thread_main(void *data) > goto err; > } > td->ioprio = ioprio_value(o->ioprio_class, o->ioprio); > + td->ts.ioprio = td->ioprio; > } > > if (td_io_init(td)) > diff --git a/client.c b/client.c > index be8411d8..381af054 100644 > --- a/client.c > +++ b/client.c > @@ -953,6 +953,7 @@ static void convert_ts(struct thread_stat *dst, struct thread_stat *src) > dst->pid = le32_to_cpu(src->pid); > dst->members = le32_to_cpu(src->members); > dst->unified_rw_rep = le32_to_cpu(src->unified_rw_rep); > + dst->ioprio = le32_to_cpu(src->ioprio); > > for (i = 0; i < DDIR_RWDIR_CNT; i++) { > convert_io_stat(&dst->clat_stat[i], &src->clat_stat[i]); > diff --git a/server.c b/server.c > index 90c52e01..af94cd78 100644 > --- a/server.c > +++ b/server.c > @@ -1483,6 +1483,7 @@ void fio_server_send_ts(struct thread_stat *ts, struct group_run_stats *rs) > p.ts.pid = cpu_to_le32(ts->pid); > p.ts.members = cpu_to_le32(ts->members); > p.ts.unified_rw_rep = cpu_to_le32(ts->unified_rw_rep); > + p.ts.ioprio = cpu_to_le32(ts->ioprio); > > for (i = 0; i < DDIR_RWDIR_CNT; i++) { > convert_io_stat(&p.ts.clat_stat[i], &ts->clat_stat[i]); > diff --git a/stat.h b/stat.h > index 15ca4eff..3ce821a7 100644 > --- a/stat.h > +++ b/stat.h > @@ -252,6 +252,9 @@ struct thread_stat { > fio_fp64_t ss_deviation; > fio_fp64_t ss_criterion; > > + /* A mirror of td->ioprio. */ > + uint32_t ioprio; > + > uint64_t io_u_plat_high_prio[DDIR_RWDIR_CNT][FIO_IO_U_PLAT_NR] __attribute__((aligned(8)));; > uint64_t io_u_plat_low_prio[DDIR_RWDIR_CNT][FIO_IO_U_PLAT_NR]; > struct io_stat clat_high_prio_stat[DDIR_RWDIR_CNT] __attribute__((aligned(8))); Reviewed-by: Damien Le Moal <damien.lemoal@xxxxxxxxxxxxxxxxxx> -- Damien Le Moal Western Digital Research