[PATCH i-g-t v2 15/21] lib/igt_drm_clients: Record total cycles

Lucas De Marchi lucas.demarchi at intel.com
Fri Apr 26 13:28:41 UTC 2024


On Fri, Apr 26, 2024 at 12:11:33PM GMT, Tvrtko Ursulin wrote:
>
>On 24/04/2024 00:44, Lucas De Marchi wrote:
>>If the fdinfo data indicates there's drm-total-cycles, use it to
>>propagate the engine utilization. Also add an assert in intel_gpu_top
>>since it only knows how to deal with with engine time busyness.
>>
>>Signed-off-by: Lucas De Marchi <lucas.demarchi at intel.com>
>>---
>>  lib/igt_drm_clients.c | 47 +++++++++++++++++++++++++++++++++++--------
>>  lib/igt_drm_clients.h |  7 +++++--
>>  lib/igt_drm_fdinfo.c  |  2 ++
>>  tools/intel_gpu_top.c |  1 +
>>  4 files changed, 47 insertions(+), 10 deletions(-)
>>
>>diff --git a/lib/igt_drm_clients.c b/lib/igt_drm_clients.c
>>index 71a938b18..8b1959ae1 100644
>>--- a/lib/igt_drm_clients.c
>>+++ b/lib/igt_drm_clients.c
>>@@ -106,16 +106,41 @@ igt_drm_client_update(struct igt_drm_client *c, unsigned int pid, char *name,
>>  	c->last_runtime = 0;
>>  	c->total_runtime = 0;
>>+	/*
>>+	 * Make sure utilization type doesn't change between any 2 samples,
>>+	 * otherwise the units don't match
>>+	 */
>>+	assert(c->dcut | info->dcut);
>>+
>>  	for (i = 0; i <= c->engines->max_engine_id; i++) {
>>  		assert(i < ARRAY_SIZE(info->busy));
>>-
>>-		if (info->busy[i] < c->u[i].last_busy)
>>-			continue; /* It will catch up soon. */
>>-
>>-		c->total_runtime += info->busy[i];
>>-		c->u[i].delta_busy = info->busy[i] - c->u[i].last_busy;
>>-		c->last_runtime += c->u[i].delta_busy;
>>-		c->u[i].last_busy = info->busy[i];
>>+		assert(i < ARRAY_SIZE(info->cycles));
>>+		assert(i < ARRAY_SIZE(info->total_cycles));
>>+
>>+		switch (c->dcut) {
>>+		case DCUT_ENGINE_TIME:
>>+			if (info->busy[i] < c->u[i].last_busy)
>>+				continue; /* It will catch up soon. */
>>+
>>+			c->total_runtime += info->busy[i];
>>+			c->u[i].delta_busy = info->busy[i] - c->u[i].last_busy;
>>+			c->last_runtime += c->u[i].delta_busy;
>>+			c->u[i].last_busy = info->busy[i];
>>+			break;
>>+		case DCUT_GPU_TOTAL_CYCLES:
>>+			if (info->cycles[i] < c->u[i].last_busy)
>>+				continue; /* It will catch up soon. */
>>+
>>+			c->total_runtime += info->cycles[i];
>>+			c->u[i].delta_busy = info->cycles[i] - c->u[i].last_busy;
>>+			c->last_runtime += c->u[i].delta_busy;
>>+			c->u[i].last_busy = info->cycles[i];
>>+
>>+			c->u[i].delta_total_cycles = info->total_cycles[i]
>>+							- c->u[i].last_total_cycles;
>>+			c->u[i].last_total_cycles = info->total_cycles[i];
>>+			break;
>>+		}
>>  	}
>>  	/* Memory regions */
>>@@ -207,6 +232,12 @@ igt_drm_client_add(struct igt_drm_clients *clients,
>>  	c->memory = calloc(c->regions->max_region_id + 1, sizeof(*c->memory));
>>  	assert(c->memory);
>>+	/* Prefer using GPU_TOTAL_CYCLES if available */
>>+	if (info->dcut & DCUT_GPU_TOTAL_CYCLES)
>>+		c->dcut = DCUT_GPU_TOTAL_CYCLES;
>>+	else
>>+		c->dcut = DCUT_ENGINE_TIME;
>
>Hmm I have a feeling igt_drm_client shouldn't be making this decision 
>but just tracking all available keys.
>
>As such I would suggest making these flags instead of types.
>
>(And with "dcut" naming spreading now I really think it is too obscure 
>to stay.)
>
>Something like:
>
>if (info->utilisation_type & DRM_FDINFO_UTILISATION_TOTAL_CYCLES)

I guess this will start a war on british/american spelling :)

more seriously, see below

>	c->utilisation_type |= DRM_CLIENT_TOTAL_CYCLES;
>if (info->utilisation_type & DRM_FDINFO_UTILISATION_TIME)
>	c->utilisation_type |= DRM_CLIENT_ENGINE_TIME;
>
>Intel_gpu_top and gputop then pick when they know to work with, with 
>the priority the application chooses.
>
>Regards,
>
>Tvrtko
>
>>+
>>  	igt_drm_client_update(c, pid, name, info);
>>  }
>>diff --git a/lib/igt_drm_clients.h b/lib/igt_drm_clients.h
>>index 5c6130ff1..5ab6f6e2e 100644
>>--- a/lib/igt_drm_clients.h
>>+++ b/lib/igt_drm_clients.h
>>@@ -65,9 +65,12 @@ 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. */
>>+	enum drm_client_utilization_type dcut; /* Select method to calculate engine utiliazation */
>>  	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. */
>>+		unsigned long delta_busy; /* Engine busyness (either drm-cycles or drm-engine data), relative to previous scan. */

I was trying to spare yet another counter here since application
has to use one or the other.... but I see your point. Maybe we have too
many layers of abstractions here for what it's doing?
drm_fdinfo/drm_clients could be just one layer rather than 2.

Anyway, agreed with your points. I will change on next version.

thanks
Lucas De Marchi


More information about the igt-dev mailing list