Re: [PATCH 2/2] stat: move unified=both mixed allocation and calculation to new helper

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 1/15/22 00:46, Niklas Cassel wrote:
> From: Niklas Cassel <niklas.cassel@xxxxxxx>
> 
> When using unified_rw_reporting=both, we need to print both the
> per ddir stats, as well as the mixed stats.
> 
> In order to print both, the regular printing functions are responsible
> for printing the per ddir stats from the unmodified struct thread_stat,
> and show_mixed_ddir_status(), show_mixed_ddir_status_terse()
> or add_mixed_ddir_status_json() is responsible for calculating and
> printing the mixed stats.
> 
> In order to keep the original struct thread_stat intact, these three
> functions have to allocate a new local thread_stat, where the mixed ddir
> result can be stored before printing.
> 
> Move the allocation and calculation of this new struct thread_stat to a
> new helper function, so that the code is easier to follow.
> 
> Signed-off-by: Niklas Cassel <niklas.cassel@xxxxxxx>
> ---
>  stat.c | 81 ++++++++++++++++++++--------------------------------------
>  1 file changed, 27 insertions(+), 54 deletions(-)
> 
> diff --git a/stat.c b/stat.c
> index 2b3687bb..ff2393b0 100644
> --- a/stat.c
> +++ b/stat.c
> @@ -462,6 +462,30 @@ static void display_lat(const char *name, unsigned long long min,
>  	free(maxp);
>  }
>  
> +static struct thread_stat *gen_mixed_ddir_stats_from_ts(struct thread_stat *ts)
> +{
> +	struct thread_stat *ts_lcl;
> +
> +	/*
> +	 * Handle aggregation of Reads (ddir = 0), Writes (ddir = 1), and
> +	 * Trims (ddir = 2)
> +	 */
> +	ts_lcl = malloc(sizeof(struct thread_stat));

No failed allocation check ?

> +	memset((void *)ts_lcl, 0, sizeof(struct thread_stat));

Nit: a blank line here would be nice, for readability.

> +	/* calculate mixed stats  */
> +	ts_lcl->unified_rw_rep = UNIFIED_MIXED;
> +	init_thread_stat_min_vals(ts_lcl);
> +	ts_lcl->lat_percentiles = ts->lat_percentiles;
> +	ts_lcl->clat_percentiles = ts->clat_percentiles;
> +	ts_lcl->slat_percentiles = ts->slat_percentiles;
> +	ts_lcl->percentile_precision = ts->percentile_precision;
> +	memcpy(ts_lcl->percentile_list, ts->percentile_list, sizeof(ts->percentile_list));
> +
> +	sum_thread_stats(ts_lcl, ts);
> +
> +	return ts_lcl;
> +}
> +
>  static double convert_agg_kbytes_percent(struct group_run_stats *rs, int ddir, int mean)
>  {
>  	double p_of_agg = 100.0;
> @@ -644,24 +668,7 @@ static void show_mixed_ddir_status(struct group_run_stats *rs,
>  				   struct thread_stat *ts,
>  				   struct buf_output *out)
>  {
> -	struct thread_stat *ts_lcl;
> -
> -	/*
> -	 * Handle aggregation of Reads (ddir = 0), Writes (ddir = 1), and
> -	 * Trims (ddir = 2)
> -	 */
> -	ts_lcl = malloc(sizeof(struct thread_stat));
> -	memset((void *)ts_lcl, 0, sizeof(struct thread_stat));
> -	/* calculate mixed stats  */
> -	ts_lcl->unified_rw_rep = UNIFIED_MIXED;
> -	init_thread_stat_min_vals(ts_lcl);
> -	ts_lcl->lat_percentiles = ts->lat_percentiles;
> -	ts_lcl->clat_percentiles = ts->clat_percentiles;
> -	ts_lcl->slat_percentiles = ts->slat_percentiles;
> -	ts_lcl->percentile_precision = ts->percentile_precision;
> -	memcpy(ts_lcl->percentile_list, ts->percentile_list, sizeof(ts->percentile_list));
> -
> -	sum_thread_stats(ts_lcl, ts);
> +	struct thread_stat *ts_lcl = gen_mixed_ddir_stats_from_ts(ts);
>  

If you add allocation failure check in gen_mixed_ddir_stats_from_ts(),
then a NULL check is needed here too, alnd in the following functions
below too.

>  	show_ddir_status(rs, ts_lcl, DDIR_READ, out);
>  	free(ts_lcl);
> @@ -1332,24 +1339,7 @@ static void show_mixed_ddir_status_terse(struct thread_stat *ts,
>  				   struct group_run_stats *rs,
>  				   int ver, struct buf_output *out)
>  {
> -	struct thread_stat *ts_lcl;
> -
> -	/*
> -	 * Handle aggregation of Reads (ddir = 0), Writes (ddir = 1), and
> -	 * Trims (ddir = 2)
> -	 */
> -	ts_lcl = malloc(sizeof(struct thread_stat));
> -	memset((void *)ts_lcl, 0, sizeof(struct thread_stat));
> -	/* calculate mixed stats  */
> -	ts_lcl->unified_rw_rep = UNIFIED_MIXED;
> -	init_thread_stat_min_vals(ts_lcl);
> -	ts_lcl->lat_percentiles = ts->lat_percentiles;
> -	ts_lcl->clat_percentiles = ts->clat_percentiles;
> -	ts_lcl->slat_percentiles = ts->slat_percentiles;
> -	ts_lcl->percentile_precision = ts->percentile_precision;
> -	memcpy(ts_lcl->percentile_list, ts->percentile_list, sizeof(ts->percentile_list));
> -
> -	sum_thread_stats(ts_lcl, ts);
> +	struct thread_stat *ts_lcl = gen_mixed_ddir_stats_from_ts(ts);
>  
>  	show_ddir_status_terse(ts_lcl, rs, DDIR_READ, ver, out);
>  	free(ts_lcl);
> @@ -1529,24 +1519,7 @@ static void add_ddir_status_json(struct thread_stat *ts,
>  static void add_mixed_ddir_status_json(struct thread_stat *ts,
>  		struct group_run_stats *rs, struct json_object *parent)
>  {
> -	struct thread_stat *ts_lcl;
> -
> -	/*
> -	 * Handle aggregation of Reads (ddir = 0), Writes (ddir = 1), and
> -	 * Trims (ddir = 2)
> -	 */
> -	ts_lcl = malloc(sizeof(struct thread_stat));
> -	memset((void *)ts_lcl, 0, sizeof(struct thread_stat));
> -	/* calculate mixed stats  */
> -	ts_lcl->unified_rw_rep = UNIFIED_MIXED;
> -	init_thread_stat_min_vals(ts_lcl);
> -	ts_lcl->lat_percentiles = ts->lat_percentiles;
> -	ts_lcl->clat_percentiles = ts->clat_percentiles;
> -	ts_lcl->slat_percentiles = ts->slat_percentiles;
> -	ts_lcl->percentile_precision = ts->percentile_precision;
> -	memcpy(ts_lcl->percentile_list, ts->percentile_list, sizeof(ts->percentile_list));
> -
> -	sum_thread_stats(ts_lcl, ts);
> +	struct thread_stat *ts_lcl = gen_mixed_ddir_stats_from_ts(ts);
>  
>  	/* add the aggregated stats to json parent */
>  	add_ddir_status_json(ts_lcl, rs, DDIR_READ, parent);


-- 
Damien Le Moal
Western Digital Research



[Index of Archives]     [Linux Kernel]     [Linux SCSI]     [Linux IDE]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux