diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/perf.c | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/tests/perf.c b/tests/perf.c index c8537f00..36e6f231 100644 --- a/tests/perf.c +++ b/tests/perf.c @@ -2372,7 +2372,8 @@ test_blocking(void) DRM_I915_PERF_PROP_OA_EXPONENT, oa_exponent, }; struct drm_i915_perf_open_param param = { - .flags = I915_PERF_FLAG_FD_CLOEXEC, + .flags = I915_PERF_FLAG_FD_CLOEXEC | + I915_PERF_FLAG_DISABLED, .num_properties = sizeof(properties) / 16, .properties_ptr = to_user_pointer(properties), }; @@ -2397,16 +2398,17 @@ test_blocking(void) */ int min_iterations = (test_duration_ns / (oa_period + 6000000ull)); - int64_t start; + int64_t start, end; int n = 0; stream_fd = __perf_open(drm_fd, ¶m); times(&start_times); - igt_debug("tick length = %dns, test duration = %"PRIu64"ns, min iter. = %d, max iter. = %d\n", + igt_debug("tick length = %dns, test duration = %"PRIu64"ns, min iter. = %d," + " estimated max iter. = %d, oa_period = %"PRIu64"ns\n", (int)tick_ns, test_duration_ns, - min_iterations, max_iterations); + min_iterations, max_iterations, oa_period); /* In the loop we perform blocking polls while the HW is sampling at * ~25Hz, with the expectation that we spend most of our time blocked @@ -2425,8 +2427,13 @@ test_blocking(void) * floor(real_stime)). * * We Loop for 1000 x tick_ns so one tick corresponds to 0.1% + * + * Also enable the stream just before poll/read to minimize + * the error delta. */ - for (start = get_time(); (get_time() - start) < test_duration_ns; /* nop */) { + start = get_time(); + do_ioctl(stream_fd, I915_PERF_IOCTL_ENABLE, 0); + for (/* nop */; ((end = get_time()) - start) < test_duration_ns; /* nop */) { struct drm_i915_perf_record_header *header; bool timer_report_read = false; bool non_timer_report_read = false; @@ -2468,6 +2475,12 @@ test_blocking(void) n++; } + /* Updated the maximum of iterations based on the time spent + * in the loop. + */ + max_iterations = (end - start) / oa_period + 1; + igt_debug("adjusted max iter. = %d\n", max_iterations); + times(&end_times); /* Using nanosecond units is fairly silly here, given the tick in- @@ -2524,6 +2537,7 @@ test_polling(void) }; struct drm_i915_perf_open_param param = { .flags = I915_PERF_FLAG_FD_CLOEXEC | + I915_PERF_FLAG_DISABLED | I915_PERF_FLAG_FD_NONBLOCK, .num_properties = sizeof(properties) / 16, .properties_ptr = to_user_pointer(properties), @@ -2548,7 +2562,7 @@ test_polling(void) * to check for data and giving some time to read(). */ int min_iterations = (test_duration_ns / (oa_period + 6000000ull)); - int64_t start; + int64_t start, end; int n = 0; stream_fd = __perf_open(drm_fd, ¶m); @@ -2576,8 +2590,13 @@ test_polling(void) * floor(real_stime)). * * We Loop for 1000 x tick_ns so one tick corresponds to 0.1% + * + * Also enable the stream just before poll/read to minimize + * the error delta. */ - for (start = get_time(); (get_time() - start) < test_duration_ns; /* nop */) { + start = get_time(); + do_ioctl(stream_fd, I915_PERF_IOCTL_ENABLE, 0); + for (/* nop */; ((end = get_time()) - start) < test_duration_ns; /* nop */) { struct pollfd pollfd = { .fd = stream_fd, .events = POLLIN }; struct drm_i915_perf_record_header *header; bool timer_report_read = false; @@ -2625,8 +2644,7 @@ test_polling(void) if (header->type == DRM_I915_PERF_RECORD_SAMPLE) { uint32_t *report = (void *)(header + 1); - if (oa_report_is_periodic(oa_exponent, - report)) + if (oa_report_is_periodic(oa_exponent, report)) timer_report_read = true; else non_timer_report_read = true; @@ -2650,6 +2668,12 @@ test_polling(void) n++; } + /* Updated the maximum of iterations based on the time spent + * in the loop. + */ + max_iterations = (end - start) / oa_period + 1; + igt_debug("adjusted max iter. = %d\n", max_iterations); + times(&end_times); /* Using nanosecond units is fairly silly here, given the tick in- |