[Intel-gfx] [PATCH i-g-t] igt/perf: add tests to verify create/destroy userspace configs
Lionel Landwerlin
lionel.g.landwerlin at intel.com
Thu Jul 13 11:12:07 UTC 2017
On 10/07/17 12:55, Matthew Auld wrote:
> On 7 July 2017 at 17:57, Lionel Landwerlin
> <lionel.g.landwerlin at intel.com> wrote:
>> Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
>> ---
>> tests/perf.c | 135 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 135 insertions(+)
>>
>> diff --git a/tests/perf.c b/tests/perf.c
>> index db28ba1f..14bbb361 100644
>> --- a/tests/perf.c
>> +++ b/tests/perf.c
>> @@ -146,6 +146,33 @@ 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;
>> + __u64 mux_regs;
>> +
>> + __u32 n_boolean_regs;
>> + __u64 boolean_regs;
>> +
>> + __u32 n_flex_regs;
>> + __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 +4028,108 @@ test_rc6_disable(void)
>> igt_assert_neq(n_events_end - n_events_start, 0);
>> }
>>
>> +static void
>> +test_create_destroy_userspace_invalid_config(void)
>> +{
>> + struct drm_i915_perf_oa_config userspace_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 };
> Maybe also test for bool/flex?
It's a bit tricky because this is per generation stuff...
>
>> +
>> + memset(&userspace_config, 0, sizeof(userspace_config));
>> +
>> + /* invalid uuid */
>> + userspace_config.uuid = to_user_pointer(invalid_uuid);
>> + userspace_config.n_mux_regs = 1;
>> + userspace_config.mux_regs = to_user_pointer(mux_regs);
>> + userspace_config.n_boolean_regs = 0;
>> + userspace_config.n_flex_regs = 0;
> Test for adding two configs with conflicting uuid's?
Done.
>
>> +
>> + do_ioctl_err(drm_fd, DRM_IOCTL_I915_PERF_ADD_CONFIG, &userspace_config, EINVAL);
>> +
>> + /* invalid mux_regs */
>> + userspace_config.uuid = to_user_pointer(uuid);
>> + userspace_config.n_mux_regs = 1;
>> + userspace_config.mux_regs = to_user_pointer(invalid_mux_regs);
>> + userspace_config.n_boolean_regs = 0;
>> + userspace_config.n_flex_regs = 0;
>> +
>> + do_ioctl_err(drm_fd, DRM_IOCTL_I915_PERF_ADD_CONFIG, &userspace_config, EINVAL);
>> +
>> + /* empty config */
>> + userspace_config.uuid = to_user_pointer(uuid);
>> + userspace_config.n_mux_regs = 0;
>> + userspace_config.mux_regs = to_user_pointer(mux_regs);
>> + userspace_config.n_boolean_regs = 0;
>> + userspace_config.n_flex_regs = 0;
>> +
>> + do_ioctl_err(drm_fd, DRM_IOCTL_I915_PERF_ADD_CONFIG, &userspace_config, EINVAL);
>> +
>> + /* empty config with null pointers */
>> + userspace_config.uuid = to_user_pointer(uuid);
>> + userspace_config.n_mux_regs = 1;
>> + userspace_config.mux_regs = to_user_pointer(NULL);
>> + userspace_config.n_boolean_regs = 2;
>> + userspace_config.boolean_regs = to_user_pointer(NULL);
>> + userspace_config.n_flex_regs = 3;
>> + userspace_config.flex_regs = to_user_pointer(NULL);
>> +
>> + do_ioctl_err(drm_fd, DRM_IOCTL_I915_PERF_ADD_CONFIG, &userspace_config, EINVAL);
>> +}
> Maybe we also want some invalid tests for removing a config?
>
> Also add/remove without root?
Done.
>
>> +
>> +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;
> int config_id;
The kernel interface takes a uint64_t.
>
>> + 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 = (uintptr_t) uuid;
>> +
>> + config.n_mux_regs = 1;
>> + config.mux_regs = (uintptr_t) mux_regs;
>> + config.n_boolean_regs = 0;
>> + config.n_flex_regs = 0;
>> +
>> + /* 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;
>> +
>> + /* Try to use the new config */
>> + properties[1] = config_id;
>> + stream_fd = __perf_open(drm_fd, ¶m);
>> + __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 +4352,12 @@ igt_main
>> igt_subtest("rc6-disable")
>> test_rc6_disable();
>>
>> + igt_subtest("invalid-userspace-config")
>> + test_create_destroy_userspace_invalid_config();
>> +
>> + 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 at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
More information about the Intel-gfx
mailing list