From 3eb09e88423210052f4d279375ed07a8ec40b351 Mon Sep 17 00:00:00 2001 From: Peter Oberparleiter Date: Fri, 23 May 2025 15:51:35 +0200 Subject: [PATCH] chpstat: Fix DPU utilization calculation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit chpstat reports incorrect DPU utilization values for CMG 4 and 5 channel-paths. Calculated values are too high due to counters being interpreted as units of seconds while they are reported in units of timer ticks. Also, a zero partition channel-path utilization value (DPU PART) is incorrectly displayed as unavailable (-). Fix this by using the correct timer unit in DPU utilization calculations and making sure that zero DPU PART values are reported correctly. Reviewed-by: Vineeth Vijayan Signed-off-by: Peter Oberparleiter Signed-off-by: Jan Höppner --- zconf/chp/chpstat/cmg4.c | 10 ++++++---- zconf/chp/chpstat/cmg5.c | 10 ++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/zconf/chp/chpstat/cmg4.c b/zconf/chp/chpstat/cmg4.c index 67646d20..0f47787d 100644 --- a/zconf/chp/chpstat/cmg4.c +++ b/zconf/chp/chpstat/cmg4.c @@ -264,7 +264,7 @@ static void calc_metrics(struct cmg_data_t *data, double seconds) } /* Calculate metrics base on CMG 4 extended CUEs. */ -static void calc_ext_metrics(struct cmg_data_t *data, double seconds) +static void calc_ext_metrics(struct cmg_data_t *data, u32 ticks) { struct metrics4_t *m = get_metrics(data); struct ext_cue4_t *ext_a = get_ext_cue(data, util_a); @@ -283,11 +283,11 @@ static void calc_ext_metrics(struct cmg_data_t *data, double seconds) /* dpu_util = dpu_exec_time_cpc / (t * dpu_num_cores) */ delta = field_delta(dpu_exec_time_cpc, ext_a, ext_b); - m->dpu_util = delta / (seconds * cmcb->dpu_num_cores); + m->dpu_util = delta / ((double)ticks * cmcb->dpu_num_cores); /* dpu_util_total = dpu_channel_exec_time_cpc / (t * dpu_num_cores) */ delta = field_delta(dpu_channel_exec_time_cpc, ext_a, ext_b); - m->dpu_util_total = delta / (seconds * cmcb->dpu_num_cores); + m->dpu_util_total = delta / ((double)ticks * cmcb->dpu_num_cores); /* dpu_util_part = dpu_util_total * channel_work_units / * channel_work_units_cpc */ @@ -297,6 +297,8 @@ static void calc_ext_metrics(struct cmg_data_t *data, double seconds) delta2 = field_delta(channel_work_units_cpc, a, b); if (delta2 != 0.0) m->dpu_util_part = m->dpu_util_total * delta / delta2; + else + m->dpu_util_part = 0.0; } } @@ -318,7 +320,7 @@ static void update_metrics(struct cmg_data_t *data) m->interval = tick_to_s(ticks); calc_metrics(data, m->interval); - calc_ext_metrics(data, m->interval); + calc_ext_metrics(data, ticks); } /* Object defining this CMG. */ diff --git a/zconf/chp/chpstat/cmg5.c b/zconf/chp/chpstat/cmg5.c index 03730455..fc451b4f 100644 --- a/zconf/chp/chpstat/cmg5.c +++ b/zconf/chp/chpstat/cmg5.c @@ -297,7 +297,7 @@ static void calc_metrics(struct cmg_data_t *data, double seconds) } /* Calculate metrics base on CMG 5 extended CUEs. */ -static void calc_ext_metrics(struct cmg_data_t *data, double seconds) +static void calc_ext_metrics(struct cmg_data_t *data, double seconds, u32 ticks) { struct ext_cue5_t *ext_a = get_ext_cue(data, util_a); struct ext_cue5_t *ext_b = get_ext_cue(data, util_b); @@ -349,11 +349,11 @@ static void calc_ext_metrics(struct cmg_data_t *data, double seconds) /* dpu_util = dpu_exec_time_cpc / (t * dpu_num_cores) */ delta = field_delta(dpu_exec_time_cpc, ext_a, ext_b); - m->dpu_util = delta / (seconds * cmcb->dpu_num_cores); + m->dpu_util = delta / ((double)ticks * cmcb->dpu_num_cores); /* dpu_util_total = dpu_channel_exec_time_cpc / (t * dpu_num_cores) */ delta = field_delta(dpu_channel_exec_time_cpc, ext_a, ext_b); - m->dpu_util_total = delta / (seconds * cmcb->dpu_num_cores); + m->dpu_util_total = delta / ((double)ticks * cmcb->dpu_num_cores); /* dpu_util_part = dpu_util_total * channel_work_units / * channel_work_units_cpc */ @@ -363,6 +363,8 @@ static void calc_ext_metrics(struct cmg_data_t *data, double seconds) delta2 = field_delta(channel_work_units_cpc, a, b); if (delta2 != 0.0) m->dpu_util_part = m->dpu_util_total * delta / delta2; + else + m->dpu_util_part = 0.0; } } @@ -384,7 +386,7 @@ static void update_metrics(struct cmg_data_t *data) m->interval = tick_to_s(ticks); calc_metrics(data, m->interval); - calc_ext_metrics(data, m->interval); + calc_ext_metrics(data, m->interval, ticks); } /* Object defining this CMG. */