fio: add for_each_rw_ddir() macro
PATCH 1/1 fio: add for_each_rw_ddir() macro
Make it slightly easier to add DDIR_APPEND as fully fledged I/O type.
---
backend.c | 16 +++++++--------- eta.c | 12 +++++------- init.c | 62 ++++++++++++++++++++++++++------------------------------------ io_ddir.h | 2 ++ stat.c | 16 +++++++--------- 5 files changed, 47 insertions(+), 61 deletions(-)
backend.c +7 -9
@@ -223,12 +223,10 @@ static bool check_min_rate(struct thread_data *td, struct timespec *now) {bool ret = false; -if (td->bytes_done[DDIR_READ ]) - ret |=__check_min_rate (td, now,DDIR_READ ); -if (td->bytes_done[DDIR_WRITE ]) - ret |=__check_min_rate (td, now,DDIR_WRITE ); -if (td->bytes_done[DDIR_TRIM ]) - ret |=__check_min_rate (td, now,DDIR_TRIM ); +for_each_rw_ddir (ddir) { +if (td->bytes_done[ddir]) + ret |=__check_min_rate (td, now, ddir); + }return ret; }
@@ -1876,9 +1874,9 @@ static void *thread_main(void *data)update_rusage_stat (td); td->ts.total_run_time =mtime_since_now (&td->epoch); - td->ts.io_bytes[DDIR_READ ] = td->io_bytes[DDIR_READ ]; - td->ts.io_bytes[DDIR_WRITE ] = td->io_bytes[DDIR_WRITE ]; - td->ts.io_bytes[DDIR_TRIM ] = td->io_bytes[DDIR_TRIM ]; +for_each_rw_ddir (ddir) { + td->ts.io_bytes[ddir] = td->io_bytes[ddir]; + }if (td->o.verify_state_save && !(td->flags &TD_F_VSTATE_SAVED ) && (td->o.verify !=VERIFY_NONE &&td_write (td)))
eta.c +5 -7
@@ -383,8 +383,8 @@ bool calc_thread_status(struct jobs_eta *je, int force)struct thread_data *td;int i, unified_rw_rep;uint64_t rate_time, disp_time, bw_avg_time, *eta_secs; -unsigned long long io_bytes[DDIR_RWDIR_CNT ]; -unsigned long long io_iops[DDIR_RWDIR_CNT ]; +unsigned long long io_bytes[DDIR_RWDIR_CNT ] = {}; +unsigned long long io_iops[DDIR_RWDIR_CNT ] = {};struct timespec now;static unsigned long long rate_io_bytes[DDIR_RWDIR_CNT ];
@@ -413,8 +413,6 @@ bool calc_thread_status(struct jobs_eta *je, int force) je->elapsed_sec = (mtime_since_genesis () +999 ) /1000 ; - io_bytes[DDIR_READ ] = io_bytes[DDIR_WRITE ] = io_bytes[DDIR_TRIM ] =0 ; - io_iops[DDIR_READ ] = io_iops[DDIR_WRITE ] = io_iops[DDIR_TRIM ] =0 ; bw_avg_time =ULONG_MAX ; unified_rw_rep =0 ;for_each_td (td, i) {
@@ -509,9 +507,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 (sample_val (je->rate[DDIR_READ ]),DDIR_READ ,0 ,0 ); -add_agg_sample (sample_val (je->rate[DDIR_WRITE ]),DDIR_WRITE ,0 ,0 ); -add_agg_sample (sample_val (je->rate[DDIR_TRIM ]),DDIR_TRIM ,0 ,0 ); +for_each_rw_ddir (ddir) { +add_agg_sample (sample_val (je->rate[ddir]), ddir,0 ,0 ); + } } disp_time =mtime_since (&disp_prev_time, &now);
init.c +26 -36
84 lines not on this page · raw message
io_ddir.h +2 -0
@@ -16,6 +16,8 @@ enum fio_ddir { DDIR_RWDIR_SYNC_CNT = 4, }; +#define for_each_rw_ddir (ddir) for (enum fio_ddir ddir = 0; ddir < DDIR_RWDIR_CNT; ddir++) +static inline const char *io_ddir_name (enum fio_ddir ddir) {static const char *name[] = {"read" ,"write" ,"trim" ,"sync" ,
stat.c +7 -9
@@ -1078,12 +1078,10 @@ static void show_thread_status_normal(struct thread_stat *ts,if (strlen (ts->description))log_buf (out," Description : [%s]\n" , ts->description); -if (ts->io_bytes[DDIR_READ ]) -show_ddir_status (rs, ts,DDIR_READ , out); -if (ts->io_bytes[DDIR_WRITE ]) -show_ddir_status (rs, ts,DDIR_WRITE , out); -if (ts->io_bytes[DDIR_TRIM ]) -show_ddir_status (rs, ts,DDIR_TRIM , out); +for_each_rw_ddir (ddir) { +if (ts->io_bytes[ddir]) +show_ddir_status (rs, ts, ddir, out); + }show_latencies (ts, out);
@@ -2315,9 +2313,9 @@ void __show_running_run_stats(void)for_each_td (td, i) { td->update_rusage =1 ; - td->ts.io_bytes[DDIR_READ ] = td->io_bytes[DDIR_READ ]; - td->ts.io_bytes[DDIR_WRITE ] = td->io_bytes[DDIR_WRITE ]; - td->ts.io_bytes[DDIR_TRIM ] = td->io_bytes[DDIR_TRIM ]; +for_each_rw_ddir (ddir) { + td->ts.io_bytes[ddir] = td->io_bytes[ddir]; + } td->ts.total_run_time =mtime_since (&td->epoch, &ts); rt[i] =mtime_since (&td->start, &ts);
Quoted 15 lines
-----Original Message-----
From: [email protected] <[email protected]> On Behalf Of Alexey Dobriyan
Sent: Wednesday, August 12, 2020 10:26 AM
To: [email protected]
Cc: [email protected]
Subject: [PATCH] fio: addfor_each_rw_ddir()macroMake it slightly easier to add
DDIR_APPENDas fully fledged I/O type.Signed-off-by Alexey Dobriyan <[email protected]>---
...
Quoted 2 lines
(quoted diff) +0
-0@@ -662,31 +660,25 @@ static int fixup_options(struct thread_data *td)
...
Quoted 6 lines
init.c +0
-3/* * For random IO, allow blockalign offset other than min_bs. */ -if (!o->ba[DDIR_READ ] || !td_random (td)) - o->ba[DDIR_READ ] = o->min_bs[DDIR_READ ]; -if (!o->ba[DDIR_WRITE ] || !td_random (td))
init.c static int fixup_options(struct thread_data *td) · line 684
Quoted 10 lines
init.c +4
-3- o->ba[DDIR_WRITE ] = o->min_bs[DDIR_WRITE ]; -if (!o->ba[DDIR_TRIM ] || !td_random (td)) - o->ba[DDIR_TRIM ] = o->min_bs[DDIR_TRIM ]; +for_each_rw_ddir (ddir) { +if (!o->ba[ddir] || !td_random (td)) + o->ba[ddir] = o->min_bs[ddir]; + } if ((o->ba[DDIR_READ] != o->min_bs[DDIR_READ] || o->ba[DDIR_WRITE] != o->min_bs[DDIR_WRITE] ||
continues as:
o->ba[DDIR_TRIM] != o->min_bs[DDIR_TRIM]) &&
!o->norandommap) {which should be updated too.
Quoted 11 lines
init.c +0
-5@@ -765,14 +757,12 @@ static int fixup_options(struct thread_data *td)log_err ("fio: rate and rate_iops are mutually exclusive\n"); ret |=1 ; } - if ((o->rate[DDIR_READ] && (o->rate[DDIR_READ] < o->ratemin[DDIR_READ])) || - (o->rate[DDIR_WRITE] && (o->rate[DDIR_WRITE] < o->ratemin[DDIR_WRITE])) || - (o->rate[DDIR_TRIM] && (o->rate[DDIR_TRIM] < o->ratemin[DDIR_TRIM])) || - (o->rate_iops[DDIR_READ] && (o->rate_iops[DDIR_READ] < o->rate_iops_min[DDIR_READ])) || - (o->rate_iops[DDIR_WRITE] && (o->rate_iops[DDIR_WRITE] < o->rate_iops_min[DDIR_WRITE])) ||
init.c static int fixup_options(struct thread_data · line 768
Quoted 10 lines
init.c +6
-3- (o->rate_iops[DDIR_TRIM] && (o->rate_iops[DDIR_TRIM] < o->rate_iops_min[DDIR_TRIM]))) { -log_err ("fio: minimum rate exceeds rate\n" ); - ret |=1 ; +for_each_rw_ddir (ddir) { +if ((o->rate[ddir] && (o->rate[ddir] < o->ratemin[ddir])) || + (o->rate_iops[ddir] && (o->rate_iops[ddir] < o->rate_iops_min[ddir]))) { +log_err ("fio: minimum rate exceeds rate\n" ); + ret |=1 ; + } }
That changes the behavior slightly - you can now get up to three of those messages. Printing the value of ddir would help identify the problem(s) and be more informative than the current single message.
Quoted 24 lines · Robert (Servers)
Quoted 24 lines
-----Original Message-----
From: [email protected] <[email protected]> On Behalf Of Alexey Dobriyan
Sent: Wednesday, August 12, 2020 10:26 AM
To: [email protected]
Cc: [email protected]
Subject: [PATCH] fio: addfor_each_rw_ddir()macroMake it slightly easier to add
DDIR_APPENDas fully fledged I/O type.init.c +4
-6/* * For random IO, allow blockalign offset other than min_bs. */ -if (!o->ba[DDIR_READ ] || !td_random (td)) - o->ba[DDIR_READ ] = o->min_bs[DDIR_READ ]; -if (!o->ba[DDIR_WRITE ] || !td_random (td)) - o->ba[DDIR_WRITE ] = o->min_bs[DDIR_WRITE ]; -if (!o->ba[DDIR_TRIM ] || !td_random (td)) - o->ba[DDIR_TRIM ] = o->min_bs[DDIR_TRIM ]; +for_each_rw_ddir (ddir) { +if (!o->ba[ddir] || !td_random (td)) + o->ba[ddir] = o->min_bs[ddir]; + }
Quoted 8 lines
init.c static int fixup_options(struct thread_data *td) · line 684
Quoted 2 lines
init.c +0
-0if ((o->ba[DDIR_READ] != o->min_bs[DDIR_READ] || o->ba[DDIR_WRITE] != o->min_bs[DDIR_WRITE] ||continues as:
o->ba[DDIR_TRIM] != o->min_bs[DDIR_TRIM]) && !o->norandommap) {which should be updated too.
Actually it should not. This error message doesn't make sense for Append:
if ((o->ba[DDIR_READ] != o->min_bs[DDIR_READ] ||
o->ba[DDIR_WRITE] != o->min_bs[DDIR_WRITE] ||
o->ba[DDIR_TRIM] != o->min_bs[DDIR_TRIM]) &&
!o->norandommap) {
log_err("fio: Any use of blockalign= turns off randommap\n");
o->norandommap = 1;
ret |= warnings_fatal;
}ba= should be ignored for Append (maybe with a non-fatal warning message).
Quoted 17 lines
Quoted 17 lines
init.c +3
-8@@ -765,14 +757,12 @@ static int fixup_options(struct thread_data *td)log_err ("fio: rate and rate_iops are mutually exclusive\n"); ret |=1 ; } -if ((o->rate[DDIR_READ ] && (o->rate[DDIR_READ ] < o->ratemin[DDIR_READ ])) || - (o->rate[DDIR_WRITE ] && (o->rate[DDIR_WRITE ] < o->ratemin[DDIR_WRITE ])) || - (o->rate[DDIR_TRIM ] && (o->rate[DDIR_TRIM ] < o->ratemin[DDIR_TRIM ])) || - (o->rate_iops[DDIR_READ ] && (o->rate_iops[DDIR_READ ] < o->rate_iops_min[DDIR_READ ])) || - (o->rate_iops[DDIR_WRITE ] && (o->rate_iops[DDIR_WRITE ] < o->rate_iops_min[DDIR_WRITE ])) || - (o->rate_iops[DDIR_TRIM ] && (o->rate_iops[DDIR_TRIM ] < o->rate_iops_min[DDIR_TRIM ]))) { -log_err ("fio: minimum rate exceeds rate\n" ); - ret |=1 ; +for_each_rw_ddir (ddir) { +if ((o->rate[ddir] && (o->rate[ddir] < o->ratemin[ddir])) || + (o->rate_iops[ddir] && (o->rate_iops[ddir] < o->rate_iops_min[ddir]))) {
Quoted 8 lines
init.c static int fixup_options(struct thread_data *td) · line 766
Quoted 4 lines
init.c +3
-0+log_err ("fio: minimum rate exceeds rate\n" ); + ret |=1 ; + } }That changes the behavior slightly - you can now get up to three of those messages. Printing the value of ddir would help identify the problem(s) and be more informative than the current single message.
OK.
PATCH v2 1/1 fio: add for_each_rw_ddir() macro
In reply to Elliott, Robert (Servers)Make it slightly easier to add Zone Append as fully fledged I/O type.
---
backend.c | 16 +++++++--------- eta.c | 12 +++++------- init.c | 62 ++++++++++++++++++++++++++------------------------------------ io_ddir.h | 2 ++ stat.c | 16 +++++++--------- 5 files changed, 47 insertions(+), 61 deletions(-)
backend.c +7 -9
@@ -223,12 +223,10 @@ static bool check_min_rate(struct thread_data *td, struct timespec *now) {bool ret = false; -if (td->bytes_done[DDIR_READ ]) - ret |=__check_min_rate (td, now,DDIR_READ ); -if (td->bytes_done[DDIR_WRITE ]) - ret |=__check_min_rate (td, now,DDIR_WRITE ); -if (td->bytes_done[DDIR_TRIM ]) - ret |=__check_min_rate (td, now,DDIR_TRIM ); +for_each_rw_ddir (ddir) { +if (td->bytes_done[ddir]) + ret |=__check_min_rate (td, now, ddir); + }return ret; }
@@ -1876,9 +1874,9 @@ static void *thread_main(void *data)update_rusage_stat (td); td->ts.total_run_time =mtime_since_now (&td->epoch); - td->ts.io_bytes[DDIR_READ ] = td->io_bytes[DDIR_READ ]; - td->ts.io_bytes[DDIR_WRITE ] = td->io_bytes[DDIR_WRITE ]; - td->ts.io_bytes[DDIR_TRIM ] = td->io_bytes[DDIR_TRIM ]; +for_each_rw_ddir (ddir) { + td->ts.io_bytes[ddir] = td->io_bytes[ddir]; + }if (td->o.verify_state_save && !(td->flags &TD_F_VSTATE_SAVED ) && (td->o.verify !=VERIFY_NONE &&td_write (td)))
eta.c +5 -7
@@ -383,8 +383,8 @@ bool calc_thread_status(struct jobs_eta *je, int force)struct thread_data *td;int i, unified_rw_rep;uint64_t rate_time, disp_time, bw_avg_time, *eta_secs; -unsigned long long io_bytes[DDIR_RWDIR_CNT ]; -unsigned long long io_iops[DDIR_RWDIR_CNT ]; +unsigned long long io_bytes[DDIR_RWDIR_CNT ] = {}; +unsigned long long io_iops[DDIR_RWDIR_CNT ] = {};struct timespec now;static unsigned long long rate_io_bytes[DDIR_RWDIR_CNT ];
@@ -413,8 +413,6 @@ bool calc_thread_status(struct jobs_eta *je, int force) je->elapsed_sec = (mtime_since_genesis () +999 ) /1000 ; - io_bytes[DDIR_READ ] = io_bytes[DDIR_WRITE ] = io_bytes[DDIR_TRIM ] =0 ; - io_iops[DDIR_READ ] = io_iops[DDIR_WRITE ] = io_iops[DDIR_TRIM ] =0 ; bw_avg_time =ULONG_MAX ; unified_rw_rep =0 ;for_each_td (td, i) {
@@ -509,9 +507,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 (sample_val (je->rate[DDIR_READ ]),DDIR_READ ,0 ,0 ); -add_agg_sample (sample_val (je->rate[DDIR_WRITE ]),DDIR_WRITE ,0 ,0 ); -add_agg_sample (sample_val (je->rate[DDIR_TRIM ]),DDIR_TRIM ,0 ,0 ); +for_each_rw_ddir (ddir) { +add_agg_sample (sample_val (je->rate[ddir]), ddir,0 ,0 ); + } } disp_time =mtime_since (&disp_prev_time, &now);
init.c +26 -36
84 lines not on this page · raw message
io_ddir.h +2 -0
@@ -16,6 +16,8 @@ enum fio_ddir { DDIR_RWDIR_SYNC_CNT = 4, }; +#define for_each_rw_ddir (ddir) for (enum fio_ddir ddir = 0; ddir < DDIR_RWDIR_CNT; ddir++) +static inline const char *io_ddir_name (enum fio_ddir ddir) {static const char *name[] = {"read" ,"write" ,"trim" ,"sync" ,
stat.c +7 -9
@@ -1078,12 +1078,10 @@ static void show_thread_status_normal(struct thread_stat *ts,if (strlen (ts->description))log_buf (out," Description : [%s]\n" , ts->description); -if (ts->io_bytes[DDIR_READ ]) -show_ddir_status (rs, ts,DDIR_READ , out); -if (ts->io_bytes[DDIR_WRITE ]) -show_ddir_status (rs, ts,DDIR_WRITE , out); -if (ts->io_bytes[DDIR_TRIM ]) -show_ddir_status (rs, ts,DDIR_TRIM , out); +for_each_rw_ddir (ddir) { +if (ts->io_bytes[ddir]) +show_ddir_status (rs, ts, ddir, out); + }show_latencies (ts, out);
@@ -2315,9 +2313,9 @@ void __show_running_run_stats(void)for_each_td (td, i) { td->update_rusage =1 ; - td->ts.io_bytes[DDIR_READ ] = td->io_bytes[DDIR_READ ]; - td->ts.io_bytes[DDIR_WRITE ] = td->io_bytes[DDIR_WRITE ]; - td->ts.io_bytes[DDIR_TRIM ] = td->io_bytes[DDIR_TRIM ]; +for_each_rw_ddir (ddir) { + td->ts.io_bytes[ddir] = td->io_bytes[ddir]; + } td->ts.total_run_time =mtime_since (&td->epoch, &ts); rt[i] =mtime_since (&td->start, &ts);
Jens Axboe
AppliedQuoted 1 line · Alexey Dobriyan
Make it slightly easier to add Zone Append as fully fledged I/O type.
Applied, thanks.
Signature · 1 line
Jens Axboe