Re: [Intel-gfx] [PATCH v4 i-g-t] igt/perf: add tests to verify create/destroy userspace configs
On 18/07/17 19:14, Chris Wilson wrote: Quoting Lionel Landwerlin (2017-07-18 18:18:52) v2: Add tests regarding removing configs (Matthew) Add tests regarding adding/removing configs without permissions (Matthew) v3: Add some flex registers (Matthew) v4: memset oa_config to 0 (Lionel) Change error code for removing unexisting config EINVAL->ENOENT (Lionel) Signed-off-by: Lionel Landwerlin --- tests/perf.c | 208 +++ 1 file changed, 208 insertions(+) diff --git a/tests/perf.c b/tests/perf.c index 1c5cf351..66ec731a 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_CONFIG0x38 + +#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,175 @@ 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); Create little stubs like int __i915_perf_add_config(int fd, config) { int err; err = 0; if (igt_ioctl(fd, DRM_IOCTL_I915_PERF_ADD_CONFIG, config)) err = -errno; return err; } void i915_perf_add_config(int fd, config) { igt_assert_eq(__i915_perf_add_config(fd, config), 0); } and here use igt_assert_eq(__i915_perf_add_config(fd, config), -EINVAL); The benefit is that if you ever do hit the error, the message is much more understandable than the macro expansion of DRM_IOCTL_I915_PERF_ADD_CONFIG. -Chris Done. ___ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Re: [Intel-gfx] [PATCH v4 i-g-t] igt/perf: add tests to verify create/destroy userspace configs
Quoting Lionel Landwerlin (2017-07-18 18:18:52) > v2: Add tests regarding removing configs (Matthew) > Add tests regarding adding/removing configs without permissions > (Matthew) > > v3: Add some flex registers (Matthew) > > v4: memset oa_config to 0 (Lionel) > Change error code for removing unexisting config EINVAL->ENOENT (Lionel) > > Signed-off-by: Lionel Landwerlin > --- > tests/perf.c | 208 > +++ > 1 file changed, 208 insertions(+) > > diff --git a/tests/perf.c b/tests/perf.c > index 1c5cf351..66ec731a 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_CONFIG0x38 > + > +#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,175 @@ 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); Create little stubs like int __i915_perf_add_config(int fd, config) { int err; err = 0; if (igt_ioctl(fd, DRM_IOCTL_I915_PERF_ADD_CONFIG, config)) err = -errno; return err; } void i915_perf_add_config(int fd, config) { igt_assert_eq(__i915_perf_add_config(fd, config), 0); } and here use igt_assert_eq(__i915_perf_add_config(fd, config), -EINVAL); The benefit is that if you ever do hit the error, the message is much more understandable than the macro expansion of DRM_IOCTL_I915_PERF_ADD_CONFIG. -Chris ___ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx
[Intel-gfx] [PATCH v4 i-g-t] igt/perf: add tests to verify create/destroy userspace configs
v2: Add tests regarding removing configs (Matthew) Add tests regarding adding/removing configs without permissions (Matthew) v3: Add some flex registers (Matthew) v4: memset oa_config to 0 (Lionel) Change error code for removing unexisting config EINVAL->ENOENT (Lionel) Signed-off-by: Lionel Landwerlin --- tests/perf.c | 208 +++ 1 file changed, 208 insertions(+) diff --git a/tests/perf.c b/tests/perf.c index 1c5cf351..66ec731a 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_CONFIG0x38 + +#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,175 @@ 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 = 9; + 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, ENOENT); + + igt_assert(igt_ioctl(drm_fd, DRM_IOCTL_I915_PERF_REMOVE_CONFIG, &config_id) == 0); +} +