[PATCH i-g-t] tools/gputop: Fix engine columns with amdgpu

Lucas De Marchi lucas.demarchi at intel.com
Wed Apr 3 20:27:33 UTC 2024


On Wed, Apr 03, 2024 at 04:00:57PM +0100, Tvrtko Ursulin wrote:
>From: Tvrtko Ursulin <tvrtko.ursulin at igalia.com>
>
>Amdgpu kernel driver skips output of fdinfo keys for unused engines. That
>is completely legal but corrupts the column formatting in the current
>code.
>
>Fix it by simply treating change in detected engines used by a client
>as trigger to re-emit a new header. This ensures columns are always

That would be kind of ugly if each client uses a different engine.

Why not outputing all the engine classes regardless of what the
clients are using?

Lucas De Marchi

>correctly aligned, albeit with a cost of potentially duplicating the
>header for the same DRM minor.
>
>This is considered good enough for a reference implementation. The
>alternative would be to add some real per DRM minor state tracking which
>sounds like an overkill, at least until gputop gains a nicer (any) UI.
>
>Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at igalia.com>
>---
> tools/gputop.c | 27 ++++++++++++++++++++++++++-
> 1 file changed, 26 insertions(+), 1 deletion(-)
>
>diff --git a/tools/gputop.c b/tools/gputop.c
>index 71e28f43ee4c..76075c5dde8b 100644
>--- a/tools/gputop.c
>+++ b/tools/gputop.c
>@@ -119,11 +119,36 @@ print_client_header(struct igt_drm_client *c, int lines, int con_w, int con_h,
> 	return lines;
> }
>
>+static bool
>+engines_identical(const struct igt_drm_client *c,
>+		  const struct igt_drm_client *pc)
>+{
>+	unsigned int i;
>+
>+	if (c->engines->num_engines != pc->engines->num_engines ||
>+	    c->engines->max_engine_id != pc->engines->max_engine_id)
>+		return false;
>+
>+	for (i = 0; i <= c->engines->max_engine_id; i++)
>+		if (c->engines->capacity[i] != pc->engines->capacity[i] ||
>+		    !!c->engines->names[i] != !!pc->engines->names[i] ||
>+		    strcmp(c->engines->names[i], pc->engines->names[i]))
>+			return false;
>+
>+	return true;
>+}
>
> static bool
> newheader(const struct igt_drm_client *c, const struct igt_drm_client *pc)
> {
>-	return !pc || c->drm_minor != pc->drm_minor;
>+	return !pc || c->drm_minor != pc->drm_minor ||
>+	       /*
>+		* Below is a a hack for drivers like amdgpu which omit listing
>+		* unused engines. Simply treat them as separate minors which
>+		* will ensure the per-engine columns are correctly sized in all
>+		* cases.
>+		*/
>+	       !engines_identical(c, pc);
> }
>
> static int
>-- 
>2.44.0
>


More information about the igt-dev mailing list