From c235da56c67e01e9132fb3898e365632f41e33fe Mon Sep 17 00:00:00 2001 From: Ashutosh Dixit Date: Fri, 5 Jul 2024 14:43:05 -0700 Subject: tests/intel/xe_oa: Add some negative tests Add: "non-system-wide-paranoid" "invalid-oa-metric-set-id" "invalid-oa-format-id" "missing-sample-flags" v2: Rename xe perf layer as xe observation layer v3: Run on Xe2+ only Signed-off-by: Ashutosh Dixit Reviewed-by: Umesh Nerlige Ramappa --- tests/intel/xe_oa.c | 195 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 195 insertions(+) (limited to 'tests') diff --git a/tests/intel/xe_oa.c b/tests/intel/xe_oa.c index 34ba46bed..7f7a45194 100644 --- a/tests/intel/xe_oa.c +++ b/tests/intel/xe_oa.c @@ -303,6 +303,7 @@ struct drm_xe_engine_class_instance default_hwe; static struct intel_xe_perf *intel_xe_perf; static uint64_t oa_exp_1_millisec; struct intel_mmio_data mmio_data; +static igt_render_copyfunc_t render_copy; static struct intel_xe_perf_metric_set *metric_set(const struct drm_xe_engine_class_instance *hwe) { @@ -550,6 +551,166 @@ init_sys_info(void) return true; } +/** + * SUBTEST: non-system-wide-paranoid + * Description: CAP_SYS_ADMIN is required to open system wide metrics, unless + * sysctl parameter dev.xe.observation_paranoid == 0 + */ +static void test_system_wide_paranoid(void) +{ + igt_fork(child, 1) { + uint64_t properties[] = { + DRM_XE_OA_PROPERTY_OA_UNIT_ID, 0, + + /* Include OA reports in samples */ + DRM_XE_OA_PROPERTY_SAMPLE_OA, true, + + /* OA unit configuration */ + DRM_XE_OA_PROPERTY_OA_METRIC_SET, default_test_set->perf_oa_metrics_set, + DRM_XE_OA_PROPERTY_OA_FORMAT, __ff(default_test_set->perf_oa_format), + DRM_XE_OA_PROPERTY_OA_PERIOD_EXPONENT, oa_exp_1_millisec, + }; + struct intel_xe_oa_open_prop param = { + .num_properties = ARRAY_SIZE(properties) / 2, + .properties_ptr = to_user_pointer(properties), + }; + + write_u64_file("/proc/sys/dev/xe/observation_paranoid", 1); + + igt_drop_root(); + + intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_OP_STREAM_OPEN, ¶m, EACCES); + } + + igt_waitchildren(); + + igt_fork(child, 1) { + uint64_t properties[] = { + DRM_XE_OA_PROPERTY_OA_UNIT_ID, 0, + + /* Include OA reports in samples */ + DRM_XE_OA_PROPERTY_SAMPLE_OA, true, + + /* OA unit configuration */ + DRM_XE_OA_PROPERTY_OA_METRIC_SET, default_test_set->perf_oa_metrics_set, + DRM_XE_OA_PROPERTY_OA_FORMAT, __ff(default_test_set->perf_oa_format), + DRM_XE_OA_PROPERTY_OA_PERIOD_EXPONENT, oa_exp_1_millisec, + }; + struct intel_xe_oa_open_prop param = { + .num_properties = ARRAY_SIZE(properties) / 2, + .properties_ptr = to_user_pointer(properties), + }; + write_u64_file("/proc/sys/dev/xe/observation_paranoid", 0); + + igt_drop_root(); + + stream_fd = __perf_open(drm_fd, ¶m, false); + __perf_close(stream_fd); + } + + igt_waitchildren(); + + /* leave in paranoid state */ + write_u64_file("/proc/sys/dev/xe/observation_paranoid", 1); +} + +/** + * SUBTEST: invalid-oa-metric-set-id + * Description: Test behavior for invalid metric set id's + */ +static void test_invalid_oa_metric_set_id(void) +{ + uint64_t properties[] = { + DRM_XE_OA_PROPERTY_OA_UNIT_ID, 0, + + /* Include OA reports in samples */ + DRM_XE_OA_PROPERTY_SAMPLE_OA, true, + + /* OA unit configuration */ + DRM_XE_OA_PROPERTY_OA_FORMAT, __ff(default_test_set->perf_oa_format), + DRM_XE_OA_PROPERTY_OA_PERIOD_EXPONENT, oa_exp_1_millisec, + DRM_XE_OA_PROPERTY_OA_METRIC_SET, UINT64_MAX, + }; + struct intel_xe_oa_open_prop param = { + .num_properties = ARRAY_SIZE(properties) / 2, + .properties_ptr = to_user_pointer(properties), + }; + + intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_OP_STREAM_OPEN, ¶m, 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, ¶m, EINVAL); + + /* Check that we aren't just seeing false positives... */ + properties[ARRAY_SIZE(properties) - 1] = default_test_set->perf_oa_metrics_set; + stream_fd = __perf_open(drm_fd, ¶m, false); + __perf_close(stream_fd); + + /* 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, ¶m, EINVAL); +} + +/** + * SUBTEST: invalid-oa-format-id + * Description: Test behavior for invalid OA format fields + */ +static void test_invalid_oa_format_id(void) +{ + uint64_t properties[] = { + DRM_XE_OA_PROPERTY_OA_UNIT_ID, 0, + + /* Include OA reports in samples */ + DRM_XE_OA_PROPERTY_SAMPLE_OA, true, + + /* OA unit configuration */ + DRM_XE_OA_PROPERTY_OA_METRIC_SET, default_test_set->perf_oa_metrics_set, + DRM_XE_OA_PROPERTY_OA_PERIOD_EXPONENT, oa_exp_1_millisec, + DRM_XE_OA_PROPERTY_OA_FORMAT, UINT64_MAX, /* No __ff() here */ + }; + struct intel_xe_oa_open_prop param = { + .num_properties = ARRAY_SIZE(properties) / 2, + .properties_ptr = to_user_pointer(properties), + }; + + intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_OP_STREAM_OPEN, ¶m, 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, ¶m, EINVAL); + + /* Check that we aren't just seeing false positives... */ + properties[ARRAY_SIZE(properties) - 1] = __ff(default_test_set->perf_oa_format); + stream_fd = __perf_open(drm_fd, ¶m, false); + __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, ¶m, EINVAL); +} + +/** + * SUBTEST: missing-sample-flags + * Description: Test behavior for no SAMPLE_OA and no EXEC_QUEUE_ID + */ +static void test_missing_sample_flags(void) +{ + uint64_t properties[] = { + DRM_XE_OA_PROPERTY_OA_UNIT_ID, 0, + + /* No _PROP_SAMPLE_xyz flags */ + + /* OA unit configuration */ + DRM_XE_OA_PROPERTY_OA_METRIC_SET, default_test_set->perf_oa_metrics_set, + DRM_XE_OA_PROPERTY_OA_PERIOD_EXPONENT, oa_exp_1_millisec, + DRM_XE_OA_PROPERTY_OA_FORMAT, __ff(default_test_set->perf_oa_format), + }; + struct intel_xe_oa_open_prop param = { + .num_properties = ARRAY_SIZE(properties) / 2, + .properties_ptr = to_user_pointer(properties), + }; + + intel_xe_perf_ioctl_err(drm_fd, DRM_XE_OBSERVATION_OP_STREAM_OPEN, ¶m, EINVAL); +} + static void read_2_oa_reports(int format_id, int exponent, @@ -793,6 +954,40 @@ igt_main igt_subtest("sysctl-defaults") test_sysctl_defaults(); + igt_fixture { + /* We expect that the ref count test before these fixtures + * should have closed drm_fd... + */ + igt_assert_eq(drm_fd, -1); + + drm_fd = drm_open_driver(DRIVER_XE); + xe_device_get(drm_fd); + + devid = intel_get_drm_devid(drm_fd); + sysfs = igt_sysfs_open(drm_fd); + + igt_require(init_sys_info()); + + write_u64_file("/proc/sys/dev/xe/observation_paranoid", 1); + + render_copy = igt_get_render_copyfunc(devid); + + /* Currently only run on Xe2+ */ + igt_require(intel_graphics_ver(devid) >= IP_VER(20, 0)); + } + + igt_subtest("non-system-wide-paranoid") + test_system_wide_paranoid(); + + igt_subtest("invalid-oa-metric-set-id") + test_invalid_oa_metric_set_id(); + + igt_subtest("invalid-oa-format-id") + test_invalid_oa_format_id(); + + igt_subtest("missing-sample-flags") + test_missing_sample_flags(); + igt_fixture { /* leave sysctl options in their default state... */ write_u64_file("/proc/sys/dev/xe/observation_paranoid", 1); -- cgit v1.2.3