chpstat: Fix DPU utilization calculation

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 <vneethv@linux.ibm.com>
Signed-off-by: Peter Oberparleiter <oberpar@linux.ibm.com>
Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com>
This commit is contained in:
Peter Oberparleiter
2025-05-23 15:51:35 +02:00
committed by Jan Höppner
parent 3eb9711021
commit 3eb09e8842
2 changed files with 12 additions and 8 deletions

View File

@@ -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. */

View File

@@ -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. */