[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