[PATCH i-g-t v2 14/21] lib/igt_drm_clients: Move engine fields to substruct
Tvrtko Ursulin
tursulin at ursulin.net
Fri Apr 26 11:05:17 UTC 2024
On 24/04/2024 00:44, Lucas De Marchi wrote:
> Instead of keep adding arrays, move all the arrays indexed by engine to
> a substruct.
>
> Signed-off-by: Lucas De Marchi <lucas.demarchi at intel.com>
> ---
> lib/igt_drm_clients.c | 19 ++++++++-----------
> lib/igt_drm_clients.h | 6 ++++--
> tools/gputop.c | 2 +-
> tools/intel_gpu_top.c | 14 +++++++-------
> 4 files changed, 20 insertions(+), 21 deletions(-)
>
> diff --git a/lib/igt_drm_clients.c b/lib/igt_drm_clients.c
> index 940c95381..71a938b18 100644
> --- a/lib/igt_drm_clients.c
> +++ b/lib/igt_drm_clients.c
> @@ -109,13 +109,13 @@ igt_drm_client_update(struct igt_drm_client *c, unsigned int pid, char *name,
> for (i = 0; i <= c->engines->max_engine_id; i++) {
> assert(i < ARRAY_SIZE(info->busy));
>
> - if (info->busy[i] < c->last_busy[i])
> + if (info->busy[i] < c->u[i].last_busy)
> continue; /* It will catch up soon. */
>
> c->total_runtime += info->busy[i];
> - c->delta_busy[i] = info->busy[i] - c->last_busy[i];
> - c->last_runtime += c->delta_busy[i];
> - c->last_busy[i] = info->busy[i];
> + c->u[i].delta_busy = info->busy[i] - c->u[i].last_busy;
Another tiny bike shed to consider c->util, or c->utilization. I find
'u' needlessly short but no big deal either way.
Regards,
Tvrtko
> + c->last_runtime += c->u[i].delta_busy;
> + c->u[i].last_busy = info->busy[i];
> }
>
> /* Memory regions */
> @@ -183,11 +183,9 @@ igt_drm_client_add(struct igt_drm_clients *clients,
> c->engines->max_engine_id = i;
> }
>
> - c->delta_busy = calloc(c->engines->max_engine_id + 1,
> - sizeof(*c->delta_busy));
> - c->last_busy = calloc(c->engines->max_engine_id + 1,
> - sizeof(*c->last_busy));
> - assert(c->delta_busy && c->last_busy);
> + c->u = calloc(c->engines->max_engine_id + 1,
> + sizeof(*c->u));
> + assert(c->u);
>
> /* Memory regions */
> c->regions = calloc(1, sizeof(*c->regions));
> @@ -225,8 +223,7 @@ void igt_drm_client_free(struct igt_drm_client *c, bool clear)
> }
> free(c->engines);
>
> - free(c->delta_busy);
> - free(c->last_busy);
> + free(c->u);
>
> if (c->regions) {
> for (i = 0; i <= c->regions->max_region_id; i++)
> diff --git a/lib/igt_drm_clients.h b/lib/igt_drm_clients.h
> index 06b29cfd1..5c6130ff1 100644
> --- a/lib/igt_drm_clients.h
> +++ b/lib/igt_drm_clients.h
> @@ -65,8 +65,10 @@ struct igt_drm_client {
> unsigned int samples; /* Count of times scanning updated this client. */
> unsigned long total_runtime; /* Aggregate busyness on all engines since client start. */
> unsigned long last_runtime; /* Aggregate busyness on all engines since previous scan. */
> - unsigned long *delta_busy; /* Array of engine busyness data, relative to previous scan. */
> - uint64_t *last_busy; /* Array of engine busyness data as parsed from fdinfo. */
> + struct igt_drm_client_utilization {
> + unsigned long delta_busy; /* Engine busyness data, relative to previous scan. */
> + uint64_t last_busy; /* Engine busyness data as parsed from fdinfo. */
> + } *u; /* Array of engine utilization */
> struct drm_client_meminfo *memory; /* Array of region memory utilisation as parsed from fdinfo. */
> };
>
> diff --git a/tools/gputop.c b/tools/gputop.c
> index 2946aaa5e..bca7f4bc7 100644
> --- a/tools/gputop.c
> +++ b/tools/gputop.c
> @@ -208,7 +208,7 @@ print_client(struct igt_drm_client *c, struct igt_drm_client **prevc,
> if (!c->engines->capacity[i])
> continue;
>
> - pct = (double)c->delta_busy[i] / period_us / 1e3 * 100 /
> + pct = (double)c->u[i].delta_busy / period_us / 1e3 * 100 /
> c->engines->capacity[i];
>
> /*
> diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
> index adc95a95e..a4aa8414b 100644
> --- a/tools/intel_gpu_top.c
> +++ b/tools/intel_gpu_top.c
> @@ -893,9 +893,9 @@ static struct igt_drm_clients *display_clients(struct igt_drm_clients *clients)
> strcpy(ac->pid_str, c->pid_str);
> strcpy(ac->print_name, c->print_name);
> ac->engines = c->engines;
> - ac->delta_busy = calloc(c->engines->max_engine_id + 1,
> - sizeof(ac->delta_busy[0]));
> - assert(ac->delta_busy);
> + ac->u = calloc(c->engines->max_engine_id + 1,
> + sizeof(*ac->u));
> + assert(ac->u);
> ac->regions = c->regions;
> ac->memory = calloc(c->regions->max_region_id + 1,
> sizeof(ac->memory[0]));
> @@ -912,7 +912,7 @@ static struct igt_drm_clients *display_clients(struct igt_drm_clients *clients)
> ac->last_runtime += c->last_runtime;
>
> for (i = 0; i <= c->engines->max_engine_id; i++)
> - ac->delta_busy[i] += c->delta_busy[i];
> + ac->u[i].delta_busy += c->u[i].delta_busy;
>
> for (i = 0; i <= c->regions->max_region_id; i++) {
> ac->memory[i].total += c->memory[i].total;
> @@ -946,7 +946,7 @@ static void free_display_clients(struct igt_drm_clients *clients)
> * or borrowed fields which we don't want the library to try and free.
> */
> igt_for_each_drm_client(clients, c, tmp) {
> - free(c->delta_busy);
> + free(c->u);
> free(c->memory);
> }
>
> @@ -2161,7 +2161,7 @@ print_client(struct igt_drm_client *c, struct engines *engines, double t, int li
> continue;
> }
>
> - pct = (double)c->delta_busy[i] / period_us / 1e3 * 100;
> + pct = (double)c->u[i].delta_busy / period_us / 1e3 * 100;
>
> /*
> * Guard against possible time-drift between sampling
> @@ -2235,7 +2235,7 @@ print_client(struct igt_drm_client *c, struct engines *engines, double t, int li
> iclients->classes.names[i]);
> pops->open_struct(buf);
>
> - pct = (double)c->delta_busy[i] / period_us / 1e3 * 100;
> + pct = (double)c->u[i].delta_busy / period_us / 1e3 * 100;
> snprintf(buf, sizeof(buf), "%f", pct);
> __json_add_member("busy", buf);
>
More information about the igt-dev
mailing list