[PATCH i-g-t 1/2] lib/xe/oa: Add observation type input to intel_xe_perf_ioctl and intel_xe_perf_ioctl_err

Harish Chegondi harish.chegondi at intel.com
Tue Dec 31 09:46:28 UTC 2024


In order to reuse intel_xe_perf_ioctl() and intel_xe_perf_ioctl_err()
functions for EU stall sampling, add observation type as an input
parameter to these functions and set the input observation type to
observation_type in struct drm_xe_observation_param.

Signed-off-by: Harish Chegondi <harish.chegondi at intel.com>
---
 lib/xe/xe_oa.c                   | 18 +++++++---
 lib/xe/xe_oa.h                   | 11 ++++--
 tests/intel/xe_oa.c              | 57 +++++++++++++++++++++-----------
 tools/xe-perf/xe_perf_configs.c  |  2 +-
 tools/xe-perf/xe_perf_recorder.c |  3 +-
 5 files changed, 63 insertions(+), 28 deletions(-)

diff --git a/lib/xe/xe_oa.c b/lib/xe/xe_oa.c
index db614b732..b40a5a1db 100644
--- a/lib/xe/xe_oa.c
+++ b/lib/xe/xe_oa.c
@@ -691,7 +691,8 @@ load_metric_set_config(struct intel_xe_perf_metric_set *metric_set, int drm_fd)
 	memcpy(regs, metric_set->flex_regs, 2 * metric_set->n_flex_regs * sizeof(u32));
 	regs += 2 * metric_set->n_flex_regs * sizeof(u32);
 
-	ret = intel_xe_perf_ioctl(drm_fd, DRM_XE_OBSERVATION_OP_ADD_CONFIG, &config);
+	ret = intel_xe_perf_ioctl(drm_fd, DRM_XE_OBSERVATION_TYPE_OA,
+				  DRM_XE_OBSERVATION_OP_ADD_CONFIG, &config);
 	if (ret >= 0)
 		metric_set->perf_oa_metrics_set = ret;
 
@@ -1054,7 +1055,10 @@ void intel_xe_oa_prop_to_ext(struct intel_xe_oa_open_prop *properties,
 		ext[j].base.next_extension = to_user_pointer(&ext[j + 1]);
 }
 
-int intel_xe_perf_ioctl(int fd, enum drm_xe_observation_op op, void *arg)
+int intel_xe_perf_ioctl(int fd,
+			enum drm_xe_observation_type type,
+			enum drm_xe_observation_op op,
+			void *arg)
 {
 #define XE_OA_MAX_SET_PROPERTIES 16
 
@@ -1063,7 +1067,7 @@ int intel_xe_perf_ioctl(int fd, enum drm_xe_observation_op op, void *arg)
 	/* Chain the PERF layer struct */
 	struct drm_xe_observation_param p = {
 		.extensions = 0,
-		.observation_type = DRM_XE_OBSERVATION_TYPE_OA,
+		.observation_type = type,
 		.observation_op = op,
 		.param = to_user_pointer((op == DRM_XE_OBSERVATION_OP_STREAM_OPEN) ? ext : arg),
 	};
@@ -1078,9 +1082,13 @@ int intel_xe_perf_ioctl(int fd, enum drm_xe_observation_op op, void *arg)
 	return igt_ioctl(fd, DRM_IOCTL_XE_OBSERVATION, &p);
 }
 
-void intel_xe_perf_ioctl_err(int fd, enum drm_xe_observation_op op, void *arg, int err)
+void intel_xe_perf_ioctl_err(int fd,
+			     enum drm_xe_observation_type type,
+			     enum drm_xe_observation_op op,
+			     void *arg,
+			     int err)
 {
-	igt_assert_eq(intel_xe_perf_ioctl(fd, op, arg), -1);
+	igt_assert_eq(intel_xe_perf_ioctl(fd, type, op, arg), -1);
 	igt_assert_eq(errno, err);
 	errno = 0;
 }
diff --git a/lib/xe/xe_oa.h b/lib/xe/xe_oa.h
index 7d3d07456..598ea7427 100644
--- a/lib/xe/xe_oa.h
+++ b/lib/xe/xe_oa.h
@@ -400,8 +400,15 @@ const char *intel_xe_perf_read_report_reason(const struct intel_xe_perf *perf,
 
 void intel_xe_oa_prop_to_ext(struct intel_xe_oa_open_prop *properties,
 			     struct drm_xe_ext_set_property *extn);
-int intel_xe_perf_ioctl(int fd, enum drm_xe_observation_op op, void *arg);
-void intel_xe_perf_ioctl_err(int fd, enum drm_xe_observation_op op, void *arg, int err);
+int intel_xe_perf_ioctl(int fd,
+			enum drm_xe_observation_type type,
+			enum drm_xe_observation_op op,
+			void *arg);
+void intel_xe_perf_ioctl_err(int fd,
+			     enum drm_xe_observation_type type,
+			     enum drm_xe_observation_op op,
+			     void *arg,
+			     int err);
 
 #ifdef __cplusplus
 };
diff --git a/tests/intel/xe_oa.c b/tests/intel/xe_oa.c
index 492a6b5d6..3984837bb 100644
--- a/tests/intel/xe_oa.c
+++ b/tests/intel/xe_oa.c
@@ -489,7 +489,8 @@ __perf_open(int fd, struct intel_xe_oa_open_prop *param, bool prevent_pm)
 		pm_fd = -1;
 	}
 
-	ret = intel_xe_perf_ioctl(fd, DRM_XE_OBSERVATION_OP_STREAM_OPEN, param);
+	ret = intel_xe_perf_ioctl(fd, DRM_XE_OBSERVATION_TYPE_OA,
+				  DRM_XE_OBSERVATION_OP_STREAM_OPEN, param);
 
 	igt_assert_lte(0, ret);
 	errno = 0;
@@ -1125,7 +1126,8 @@ static void test_system_wide_paranoid(void)
 
 		igt_drop_root();
 
-		intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_OP_STREAM_OPEN, &param, EACCES);
+		intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_TYPE_OA,
+					DRM_XE_OBSERVATION_OP_STREAM_OPEN, &param, EACCES);
 	}
 
 	igt_waitchildren();
@@ -1182,10 +1184,12 @@ static void test_invalid_oa_metric_set_id(void)
 		.properties_ptr = to_user_pointer(properties),
 	};
 
-	intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_OP_STREAM_OPEN, &param, EINVAL);
+	intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_TYPE_OA,
+				DRM_XE_OBSERVATION_OP_STREAM_OPEN, &param, EINVAL);
 
 	properties[ARRAY_SIZE(properties) - 1] = 0; /* ID 0 is also be reserved as invalid */
-	intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_OP_STREAM_OPEN, &param, EINVAL);
+	intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_TYPE_OA,
+				DRM_XE_OBSERVATION_OP_STREAM_OPEN, &param, EINVAL);
 
 	/* Check that we aren't just seeing false positives... */
 	properties[ARRAY_SIZE(properties) - 1] = default_test_set->perf_oa_metrics_set;
@@ -1194,7 +1198,8 @@ static void test_invalid_oa_metric_set_id(void)
 
 	/* There's no valid default OA metric set ID... */
 	param.num_properties--;
-	intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_OP_STREAM_OPEN, &param, EINVAL);
+	intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_TYPE_OA,
+				DRM_XE_OBSERVATION_OP_STREAM_OPEN, &param, EINVAL);
 }
 
 /**
@@ -1219,10 +1224,12 @@ static void test_invalid_oa_format_id(void)
 		.properties_ptr = to_user_pointer(properties),
 	};
 
-	intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_OP_STREAM_OPEN, &param, EINVAL);
+	intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_TYPE_OA,
+				DRM_XE_OBSERVATION_OP_STREAM_OPEN, &param, EINVAL);
 
 	properties[ARRAY_SIZE(properties) - 1] = __ff(0); /* ID 0 is also be reserved as invalid */
-	intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_OP_STREAM_OPEN, &param, EINVAL);
+	intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_TYPE_OA,
+				DRM_XE_OBSERVATION_OP_STREAM_OPEN, &param, EINVAL);
 
 	/* Check that we aren't just seeing false positives... */
 	properties[ARRAY_SIZE(properties) - 1] = __ff(default_test_set->perf_oa_format);
@@ -1230,7 +1237,8 @@ static void test_invalid_oa_format_id(void)
 	__perf_close(stream_fd);
 	/* There's no valid default OA format... */
 	param.num_properties--;
-	intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_OP_STREAM_OPEN, &param, EINVAL);
+	intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_TYPE_OA,
+				DRM_XE_OBSERVATION_OP_STREAM_OPEN, &param, EINVAL);
 }
 
 /**
@@ -1254,7 +1262,8 @@ static void test_missing_sample_flags(void)
 		.properties_ptr = to_user_pointer(properties),
 	};
 
-	intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_OP_STREAM_OPEN, &param, EINVAL);
+	intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_TYPE_OA,
+				DRM_XE_OBSERVATION_OP_STREAM_OPEN, &param, EINVAL);
 }
 
 static void
@@ -1839,7 +1848,8 @@ static void test_invalid_oa_exponent(void)
 
 	for (int i = 32; i < 65; i++) {
 		properties[7] = i;
-		intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_OP_STREAM_OPEN, &param, EINVAL);
+		intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_TYPE_OA,
+					DRM_XE_OBSERVATION_OP_STREAM_OPEN, &param, EINVAL);
 	}
 }
 
@@ -3491,7 +3501,8 @@ test_stress_open_close(const struct drm_xe_engine_class_instance *hwe)
 
 static int __xe_oa_add_config(int fd, struct drm_xe_oa_config *config)
 {
-	int ret = intel_xe_perf_ioctl(fd, DRM_XE_OBSERVATION_OP_ADD_CONFIG, config);
+	int ret = intel_xe_perf_ioctl(fd, DRM_XE_OBSERVATION_TYPE_OA,
+				      DRM_XE_OBSERVATION_OP_ADD_CONFIG, config);
 	if (ret < 0)
 		ret = -errno;
 	return ret;
@@ -3509,13 +3520,15 @@ static int xe_oa_add_config(int fd, struct drm_xe_oa_config *config)
 
 static void xe_oa_remove_config(int fd, uint64_t config_id)
 {
-	igt_assert_eq(intel_xe_perf_ioctl(fd, DRM_XE_OBSERVATION_OP_REMOVE_CONFIG, &config_id), 0);
+	igt_assert_eq(intel_xe_perf_ioctl(fd, DRM_XE_OBSERVATION_TYPE_OA,
+					  DRM_XE_OBSERVATION_OP_REMOVE_CONFIG, &config_id), 0);
 }
 
 static bool has_xe_oa_userspace_config(int fd)
 {
 	uint64_t config = 0;
-	int ret = intel_xe_perf_ioctl(fd, DRM_XE_OBSERVATION_OP_REMOVE_CONFIG, &config);
+	int ret = intel_xe_perf_ioctl(fd, DRM_XE_OBSERVATION_TYPE_OA,
+				      DRM_XE_OBSERVATION_OP_REMOVE_CONFIG, &config);
 	igt_assert_eq(ret, -1);
 
 	igt_debug("errno=%i\n", errno);
@@ -3613,12 +3626,14 @@ test_invalid_remove_userspace_config(void)
 	igt_fork(child, 1) {
 		igt_drop_root();
 
-		intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_OP_REMOVE_CONFIG, &config_id, EACCES);
+		intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_TYPE_OA,
+					DRM_XE_OBSERVATION_OP_REMOVE_CONFIG, &config_id, EACCES);
 	}
 	igt_waitchildren();
 
 	/* Removing invalid config ID should fail. */
-	intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_OP_REMOVE_CONFIG, &wrong_config_id, ENOENT);
+	intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_TYPE_OA,
+				DRM_XE_OBSERVATION_OP_REMOVE_CONFIG, &wrong_config_id, ENOENT);
 
 	xe_oa_remove_config(drm_fd, config_id);
 }
@@ -3797,7 +3812,8 @@ test_whitelisted_registers_userspace_config(void)
 	config.regs_ptr = (uintptr_t) regs;
 
 	/* Create a new config */
-	ret = intel_xe_perf_ioctl(drm_fd, DRM_XE_OBSERVATION_OP_ADD_CONFIG, &config);
+	ret = intel_xe_perf_ioctl(drm_fd, DRM_XE_OBSERVATION_TYPE_OA,
+				  DRM_XE_OBSERVATION_OP_ADD_CONFIG, &config);
 	igt_assert_lt(0, ret); /* Config 0 should be used by the kernel */
 	config_id = ret;
 
@@ -4183,7 +4199,8 @@ test_oa_unit_exclusive_stream(bool exponent)
 		properties[5] = test_set->perf_oa_metrics_set;
 		properties[7] = __ff(test_set->perf_oa_format);
 		properties[9] = hwe->engine_instance;
-		perf_fd[i] = intel_xe_perf_ioctl(drm_fd, DRM_XE_OBSERVATION_OP_STREAM_OPEN, &param);
+		perf_fd[i] = intel_xe_perf_ioctl(drm_fd, DRM_XE_OBSERVATION_TYPE_OA,
+						 DRM_XE_OBSERVATION_OP_STREAM_OPEN, &param);
 		igt_assert(perf_fd[i] >= 0);
 		poau += sizeof(*oau) + oau->num_engines * sizeof(oau->eci[0]);
 	}
@@ -4213,7 +4230,8 @@ test_oa_unit_exclusive_stream(bool exponent)
 		properties[9] = hwe->engine_instance;
 		properties[10] = DRM_XE_OA_PROPERTY_OA_PERIOD_EXPONENT;
 		properties[11] = oa_exp_1_millisec;
-		intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_OP_STREAM_OPEN, &param, EBUSY);
+		intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_TYPE_OA,
+					DRM_XE_OBSERVATION_OP_STREAM_OPEN, &param, EBUSY);
 
 		/* case 2: concurrent access to non-OAG unit should fail */
 		igt_debug("try with exec_q with c:i %d:%d\n",
@@ -4222,7 +4240,8 @@ test_oa_unit_exclusive_stream(bool exponent)
 		properties[10] = DRM_XE_OA_PROPERTY_EXEC_QUEUE_ID;
 		properties[11] = exec_q[i];
 		errno = 0;
-		err = intel_xe_perf_ioctl(drm_fd, DRM_XE_OBSERVATION_OP_STREAM_OPEN, &param);
+		err = intel_xe_perf_ioctl(drm_fd, DRM_XE_OBSERVATION_TYPE_OA,
+					  DRM_XE_OBSERVATION_OP_STREAM_OPEN, &param);
 		igt_assert_lt(err, 0);
 		igt_assert(errno == EBUSY || errno == ENODEV);
 		poau += sizeof(*oau) + oau->num_engines * sizeof(oau->eci[0]);
diff --git a/tools/xe-perf/xe_perf_configs.c b/tools/xe-perf/xe_perf_configs.c
index bd37fef5c..3531217b7 100644
--- a/tools/xe-perf/xe_perf_configs.c
+++ b/tools/xe-perf/xe_perf_configs.c
@@ -228,7 +228,7 @@ main(int argc, char *argv[])
 			continue;
 
 		if (purge) {
-			if (intel_xe_perf_ioctl(drm_fd, DRM_XE_OBSERVATION_OP_REMOVE_CONFIG, &metric_id) == 0)
+			if (intel_xe_perf_ioctl(drm_fd, DRM_XE_OBSERVATION_TYPE_OA, DRM_XE_OBSERVATION_OP_REMOVE_CONFIG, &metric_id) == 0)
 				fprintf(stdout, "\tRemoved config %s id=%03" PRIu64 " name=%s\n",
 					entry->d_name, metric_id, metric_name(perf, entry->d_name));
 			else
diff --git a/tools/xe-perf/xe_perf_recorder.c b/tools/xe-perf/xe_perf_recorder.c
index 9cf51f3e1..411557200 100644
--- a/tools/xe-perf/xe_perf_recorder.c
+++ b/tools/xe-perf/xe_perf_recorder.c
@@ -443,7 +443,8 @@ perf_open(struct recording_context *ctx)
 		.properties_ptr = to_user_pointer(properties),
 	};
 
-	stream_fd = intel_xe_perf_ioctl(ctx->drm_fd, DRM_XE_OBSERVATION_OP_STREAM_OPEN, &param);
+	stream_fd = intel_xe_perf_ioctl(ctx->drm_fd, DRM_XE_OBSERVATION_TYPE_OA,
+					DRM_XE_OBSERVATION_OP_STREAM_OPEN, &param);
 	if (stream_fd < 0) {
 		errno = 0;
 		goto exit;
-- 
2.47.1



More information about the igt-dev mailing list