[PATCH i-g-t v2 11/21] lib/igt_drm_fdinfo: Parse drm-cycles

Lucas De Marchi lucas.demarchi at intel.com
Tue Apr 23 23:44:21 UTC 2024


Read drm-cycles from fdinfo and save it for later use. Like with the mem
regions, allow the number of engines to be updated regardless if
drm-engine-* or drm-cycles-* shows up first.

Signed-off-by: Lucas De Marchi <lucas.demarchi at intel.com>
---
 lib/igt_drm_fdinfo.c | 29 +++++++++++++++++++++--------
 lib/igt_drm_fdinfo.h |  4 ++++
 2 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/lib/igt_drm_fdinfo.c b/lib/igt_drm_fdinfo.c
index 71616773c..723e2e340 100644
--- a/lib/igt_drm_fdinfo.c
+++ b/lib/igt_drm_fdinfo.c
@@ -193,6 +193,21 @@ out:
 		}							\
 	} while (0)
 
+#define UPDATE_ENGINE(idx, engine, val)					\
+	do {								\
+		if (idx >= 0) {						\
+			info->engine[idx] = val;			\
+			if (!info->capacity[idx])			\
+					info->capacity[idx] = 1;	\
+			if (!engines_found[idx]) {			\
+				info->num_engines++;			\
+				engines_found[idx] = true;		\
+				if (idx > info->last_engine_index)	\
+					info->last_engine_index = idx;	\
+			}						\
+		}							\
+	} while (0)
+
 #define strstartswith(a, b, plen__) ({					\
 		*plen__ = strlen(b);					\
 		strncmp(a, b, *plen__) == 0;				\
@@ -204,6 +219,7 @@ __igt_parse_drm_fdinfo(int dir, const char *fd, struct drm_client_fdinfo *info,
 		       const char **region_map, unsigned int region_entries)
 {
 	bool regions_found[DRM_CLIENT_FDINFO_MAX_REGIONS] = { };
+	bool engines_found[DRM_CLIENT_FDINFO_MAX_ENGINES] = { };
 	unsigned int good = 0, num_capacity = 0;
 	char buf[4096], *_buf = buf;
 	char *l, *ctx = NULL;
@@ -247,14 +263,11 @@ __igt_parse_drm_fdinfo(int dir, const char *fd, struct drm_client_fdinfo *info,
 		} else if (strstartswith(l, "drm-engine-", &keylen)) {
 			idx = parse_engine(l + keylen, info,
 					   name_map, map_entries, &val);
-			if (idx >= 0) {
-				if (!info->capacity[idx])
-					info->capacity[idx] = 1;
-				info->busy[idx] = val;
-				info->num_engines++;
-				if (idx > info->last_engine_index)
-					info->last_engine_index = idx;
-			}
+			UPDATE_ENGINE(idx, busy, val);
+		} else if (strstartswith(l, "drm-cycles-", &keylen)) {
+			idx = parse_engine(l + keylen, info,
+					   name_map, map_entries, &val);
+			UPDATE_ENGINE(idx, cycles, val);
 		} else if (strstartswith(l, "drm-total-", &keylen)) {
 			idx = parse_region(l + keylen, info,
 					   region_map, region_entries, &val);
diff --git a/lib/igt_drm_fdinfo.h b/lib/igt_drm_fdinfo.h
index 1999c4f2b..17a47f94a 100644
--- a/lib/igt_drm_fdinfo.h
+++ b/lib/igt_drm_fdinfo.h
@@ -50,7 +50,11 @@ struct drm_client_fdinfo {
 	unsigned int last_engine_index;
 	unsigned int capacity[DRM_CLIENT_FDINFO_MAX_ENGINES];
 	char names[DRM_CLIENT_FDINFO_MAX_ENGINES][256];
+
+	/* drm-engine-<engine> values */
 	uint64_t busy[DRM_CLIENT_FDINFO_MAX_ENGINES];
+	/* drm-cycles-<engine> values */
+	uint64_t cycles[DRM_CLIENT_FDINFO_MAX_ENGINES];
 
 	unsigned int num_regions;
 	unsigned int last_region_index;
-- 
2.43.0



More information about the igt-dev mailing list