mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
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:
committed by
Jan Höppner
parent
3eb9711021
commit
3eb09e8842
@@ -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. */
|
||||
|
||||
@@ -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. */
|
||||
|
||||
Reference in New Issue
Block a user