Re: [PATCH v2 i-g-t] igt/perf: add tests to verify create/destroy userspace configs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 14/07/17 18:09, Matthew Auld wrote:
On 13 July 2017 at 12:16, Lionel Landwerlin
<lionel.g.landwerlin@xxxxxxxxx> wrote:
v2: Add tests regarding removing configs (Matthew)
     Add tests regarding adding/removing configs without permissions
     (Matthew)

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@xxxxxxxxx>
---
  tests/perf.c | 201 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1 file changed, 201 insertions(+)
I still think it would be nice to have at least have some flex tests,
especially if we consider the issue with not reserving enough dwords,
even if it's a pita...

Well the current test were testing exactly that, and we didn't see any errors. Because in most cases, the back of the batchbuffer will just get rewritten by the next batch.

Apart from testing the if (reg >= xxx && reg =< yyy), I don't know that we can test anything interesting here :(



diff --git a/tests/perf.c b/tests/perf.c
index db28ba1f..47caf1c6 100644
--- a/tests/perf.c
+++ b/tests/perf.c
@@ -146,6 +146,36 @@ enum drm_i915_perf_record_type {
  };
  #endif /* !DRM_I915_PERF_OPEN */

+#ifndef DRM_IOCTL_I915_PERF_ADD_CONFIG
+
+#define DRM_I915_PERF_ADD_CONFIG       0x37
+#define DRM_I915_PERF_REMOVE_CONFIG    0x38
+
+#define DRM_IOCTL_I915_PERF_ADD_CONFIG DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_PERF_ADD_CONFIG, struct drm_i915_perf_oa_config)
+#define DRM_IOCTL_I915_PERF_REMOVE_CONFIG      DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_PERF_REMOVE_CONFIG, __u64)
+
+/**
+ * Structure to upload perf dynamic configuration into the kernel.
+ */
+struct drm_i915_perf_oa_config {
+       /** String formatted like "%08x-%04x-%04x-%04x-%012x" */
+       __u64 uuid;
+
+       __u32 n_mux_regs;
+       __u32 pad0;
+       __u64 mux_regs;
+
+       __u32 n_boolean_regs;
+       __u32 pad1;
+       __u64 boolean_regs;
+
+       __u32 n_flex_regs;
+       __u32 pad2;
+       __u64 flex_regs;
+};
+
+#endif /* !DRM_IOCTL_I915_PERF_ADD_CONFIG */
+
  struct accumulator {
  #define MAX_RAW_OA_COUNTERS 62
         enum drm_i915_oa_format format;
@@ -4001,6 +4031,168 @@ test_rc6_disable(void)
         igt_assert_neq(n_events_end - n_events_start, 0);
  }

+static void
+test_invalid_userspace_config_create(void)
+{
+       struct drm_i915_perf_oa_config config;
+       const char *uuid = "01234567-0123-0123-0123-0123456789ab";
+       const char *invalid_uuid = "blablabla-wrong";
+       uint32_t mux_regs[] = { 0x9888 /* NOA_WRITE */, 0x0 };
+       uint32_t invalid_mux_regs[] = { 0x12345678 /* invalid register */, 0x0 };
+
+       memset(&config, 0, sizeof(config));
+
+       /* invalid uuid */
+       config.uuid = to_user_pointer(invalid_uuid);
+       config.n_mux_regs = 1;
+       config.mux_regs = to_user_pointer(mux_regs);
+       config.n_boolean_regs = 0;
+       config.n_flex_regs = 0;
+
+       do_ioctl_err(drm_fd, DRM_IOCTL_I915_PERF_ADD_CONFIG, &config, EINVAL);
+
+       /* invalid mux_regs */
+       config.uuid = to_user_pointer(uuid);
+       config.n_mux_regs = 1;
+       config.mux_regs = to_user_pointer(invalid_mux_regs);
+       config.n_boolean_regs = 0;
+       config.n_flex_regs = 0;
+
+       do_ioctl_err(drm_fd, DRM_IOCTL_I915_PERF_ADD_CONFIG, &config, EINVAL);
+
+       /* empty config */
+       config.uuid = to_user_pointer(uuid);
+       config.n_mux_regs = 0;
+       config.mux_regs = to_user_pointer(mux_regs);
+       config.n_boolean_regs = 0;
+       config.n_flex_regs = 0;
+
+       do_ioctl_err(drm_fd, DRM_IOCTL_I915_PERF_ADD_CONFIG, &config, EINVAL);
+
+       /* empty config with null pointers */
+       config.uuid = to_user_pointer(uuid);
+       config.n_mux_regs = 1;
+       config.mux_regs = to_user_pointer(NULL);
+       config.n_boolean_regs = 2;
+       config.boolean_regs = to_user_pointer(NULL);
+       config.n_flex_regs = 3;
+       config.flex_regs = to_user_pointer(NULL);
+
+       do_ioctl_err(drm_fd, DRM_IOCTL_I915_PERF_ADD_CONFIG, &config, EINVAL);
+}
+
+static void
+test_invalid_userspace_config_remove(void)
+{
+       struct drm_i915_perf_oa_config config;
+       const char *uuid = "01234567-0123-0123-0123-0123456789ab";
+       uint32_t mux_regs[] = { 0x9888 /* NOA_WRITE */, 0x0 };
+       uint64_t config_id, wrong_config_id = 999999999;
+       char path[512];
+       int ret;
+
+       snprintf(path, sizeof(path), "/sys/class/drm/card%d/metrics/%s/id", card, uuid);
+
+       /* Destroy previous configuration if present */
+       if (try_read_u64_file(path, &config_id))
+         igt_assert(igt_ioctl(drm_fd, DRM_IOCTL_I915_PERF_REMOVE_CONFIG, &config_id) == 0);
+
+       memset(&config, 0, sizeof(config));
+
+       config.uuid = to_user_pointer(uuid);
+
+       config.n_mux_regs = 1;
+       config.mux_regs = to_user_pointer(mux_regs);
+       config.n_boolean_regs = 0;
+       config.n_flex_regs = 0;
+
+       ret = igt_ioctl(drm_fd, DRM_IOCTL_I915_PERF_ADD_CONFIG, &config);
+       igt_assert(ret > 0);
+       config_id = ret;
+
+       /* Removing configs without permissions should fail. */
+       igt_fork(child, 1) {
+               igt_drop_root();
+
+               do_ioctl_err(drm_fd, DRM_IOCTL_I915_PERF_REMOVE_CONFIG, &config_id, EACCES);
+       }
+       igt_waitchildren();
+
+       /* Removing invalid config ID should fail. */
+       do_ioctl_err(drm_fd, DRM_IOCTL_I915_PERF_REMOVE_CONFIG, &wrong_config_id, EINVAL);
+
+       igt_assert(igt_ioctl(drm_fd, DRM_IOCTL_I915_PERF_REMOVE_CONFIG, &config_id) == 0);
+}
+
+static void
+test_create_destroy_userspace_config(void)
+{
+       struct drm_i915_perf_oa_config config;
+       const char *uuid = "01234567-0123-0123-0123-0123456789ab";
+       uint32_t mux_regs[] = { 0x9888 /* NOA_WRITE */, 0x0 };
+       int ret;
+       uint64_t config_id;
+       uint64_t properties[] = {
+               DRM_I915_PERF_PROP_OA_METRICS_SET, 0, /* Filled later */
+
+               /* OA unit configuration */
+               DRM_I915_PERF_PROP_SAMPLE_OA, true,
+               DRM_I915_PERF_PROP_OA_FORMAT, test_oa_format,
+               DRM_I915_PERF_PROP_OA_EXPONENT, oa_exp_1_millisec,
+               DRM_I915_PERF_PROP_OA_METRICS_SET
+       };
+       struct drm_i915_perf_open_param param = {
+               .flags = I915_PERF_FLAG_FD_CLOEXEC |
+               I915_PERF_FLAG_FD_NONBLOCK |
+               I915_PERF_FLAG_DISABLED,
+               .num_properties = ARRAY_SIZE(properties) / 2,
+               .properties_ptr = to_user_pointer(properties),
+       };
+       char path[512];
+
+       snprintf(path, sizeof(path), "/sys/class/drm/card%d/metrics/%s/id", card, uuid);
+
+       /* Destroy previous configuration if present */
+       if (try_read_u64_file(path, &config_id))
+         igt_assert(igt_ioctl(drm_fd, DRM_IOCTL_I915_PERF_REMOVE_CONFIG, &config_id) == 0);
+
+       config.uuid = to_user_pointer(uuid);
+
+       config.n_mux_regs = 1;
+       config.mux_regs = to_user_pointer(mux_regs);
+       config.n_boolean_regs = 0;
+       config.n_flex_regs = 0;
+
+       /* Creating configs without permissions shouldn't work. */
+       igt_fork(child, 1) {
+               igt_drop_root();
+
+               do_ioctl_err(drm_fd, DRM_IOCTL_I915_PERF_ADD_CONFIG, &config, EACCES);
+       }
+       igt_waitchildren();
+
+       /* Create a new config */
+       ret = igt_ioctl(drm_fd, DRM_IOCTL_I915_PERF_ADD_CONFIG, &config);
+       igt_assert(ret > 0); /* Config 0 should be used by the kernel */
+       config_id = ret;
+
+       /* Verify that adding the another config with the same uuid fails. */
+       do_ioctl_err(drm_fd, DRM_IOCTL_I915_PERF_ADD_CONFIG, &config, EADDRINUSE);
+
+       /* Try to use the new config */
+       properties[1] = config_id;
+       stream_fd = __perf_open(drm_fd, &param);
+
+       /* Verify that destroying the config doesn't work while it's being
+        * used.
+        */
+       do_ioctl_err(drm_fd, DRM_IOCTL_I915_PERF_REMOVE_CONFIG, &config_id, EADDRINUSE);
+
+       __perf_close(stream_fd);
+
+       igt_assert(igt_ioctl(drm_fd, DRM_IOCTL_I915_PERF_REMOVE_CONFIG, &config_id) == 0);
+}
+
  static unsigned
  read_i915_module_ref(void)
  {
@@ -4223,6 +4415,15 @@ igt_main
         igt_subtest("rc6-disable")
                 test_rc6_disable();

+       igt_subtest("invalid-userspace-config-create")
+               test_invalid_userspace_config_create();
+
+       igt_subtest("invalid-userspace-config-remove")
+               test_invalid_userspace_config_remove();
+
+       igt_subtest("create-destroy-userspace-config")
+               test_create_destroy_userspace_config();
+
         igt_fixture {
                 /* leave sysctl options in their default state... */
                 write_u64_file("/proc/sys/dev/i915/oa_max_sample_rate", 100000);
--
2.13.2
_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/intel-gfx




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux