From: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
To: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>,
igt-dev@lists.freedesktop.org,
Chris Wilson <chris.p.wilson@intel.com>
Subject: Re: [igt-dev] [PATCH i-g-t] test/perf: Add test to verify OA TLB invalidation
Date: Tue, 10 Mar 2020 11:02:00 +0200 [thread overview]
Message-ID: <a96e4004-3c72-d39e-4ba7-02c582ff6538@intel.com> (raw)
In-Reply-To: <20200310030741.13164-1-umesh.nerlige.ramappa@intel.com>
On 10/03/2020 05:07, Umesh Nerlige Ramappa wrote:
> Run 2 polling tests back to back and compare the number of OA reports
> captured. Make sure the number of reports are almost same.
>
> Signed-off-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
> ---
> tests/perf.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 97 insertions(+)
>
> diff --git a/tests/perf.c b/tests/perf.c
> index 5e818030..2394adc4 100644
> --- a/tests/perf.c
> +++ b/tests/perf.c
> @@ -2265,6 +2265,97 @@ test_polling(void)
> __perf_close(stream_fd);
> }
>
> +static int
> +num_valid_reports_captured(struct drm_i915_perf_open_param *param)
> +{
> + uint8_t buf[1024 * 1024];
> + int64_t tick_ns = 1000000000 / sysconf(_SC_CLK_TCK);
> + int64_t test_duration_ns = tick_ns * 5 * 100; /* 5 seconds */
> + int64_t start, end;
> + int num_reports = 0;
> +
> + stream_fd = __perf_open(drm_fd, param, true);
> +
> + igt_debug("tick length = %dns, test duration = %"PRIu64"ns\n",
> + (int)tick_ns, test_duration_ns);
> +
> + 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;
> + int ret;
> +
> + while ((ret = poll(&pollfd, 1, -1)) < 0 &&
> + errno == EINTR)
> + ;
> + igt_assert_eq(ret, 1);
> + igt_assert(pollfd.revents & POLLIN);
I guess you can drop the poll() if you drop the
I915_PERF_FLAG_FD_NONBLOCK below.
That way your reads are blocking.
Or if you want more accuracy, you can compute the amount of poll()
timeout based of test_duration_ns and exit the loop earlier.
> +
> + while ((ret = read(stream_fd, buf, sizeof(buf))) < 0 &&
> + errno == EINTR)
> + ;
> +
> + /* poll checks if the tail has advanced on the OA buffer, but
> + * does not check if the reports are valid. On read, the driver
> + * checks if the reports are valid or not. if none of the
> + * reports are valid, it returns EAGAIN. EAGAIN should also
> + * suffice to show that the TLB invalidation failed, but we will
> + * try for a more concrete check. Ignore read errors here.
> + */
> + if (ret < 0)
> + continue;
> +
> + for (int offset = 0; offset < ret; offset += header->size) {
> + header = (void *)(buf + offset);
> +
> + if (header->type == DRM_I915_PERF_RECORD_SAMPLE) {
> + uint32_t *report = (void *)(header + 1);
> +
> + if ((report[0] >> OAREPORT_REASON_SHIFT) &
> + OAREPORT_REASON_TIMER)
> + num_reports++;
> + }
> + }
> + }
> + __perf_close(stream_fd);
> +
> + return num_reports;
> +}
> +
> +static void
> +gen12_test_oa_tlb_invalidate(void)
> +{
> + int oa_exponent = max_oa_exponent_for_period_lte(30000000);
> + uint64_t properties[] = {
> + DRM_I915_PERF_PROP_SAMPLE_OA, true,
> +
> + DRM_I915_PERF_PROP_OA_METRICS_SET, test_set->perf_oa_metrics_set,
> + DRM_I915_PERF_PROP_OA_FORMAT, test_set->perf_oa_format,
> + DRM_I915_PERF_PROP_OA_EXPONENT, oa_exponent,
> + };
> + 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),
> + };
> + int num_reports1, num_reports2;
> +
> + /* Capture reports for 5 seconds twice and then make sure you get around
> + * the same number of reports. In the case of failure, the number of
> + * reports will vary largely since the beginning of the OA buffer
> + * will have invalid entries.
> + */
I thought you were also noticing corruption in the data.
Seems like it would be an easier characterization of the failure than
the number of reports (since the number can vary for a other reasons).
What do you think?
-Lionel
> + num_reports1 = num_valid_reports_captured(¶m);
> + num_reports2 = num_valid_reports_captured(¶m);
> +
> + igt_debug("num_reports1 = %d, num_reports2 = %d\n", num_reports1, num_reports2);
> + igt_assert(num_reports2 > 0.95 * num_reports1);
> +}
> +
> +
> static void
> test_buffer_fill(void)
> {
> @@ -4622,6 +4713,12 @@ igt_main
> gen8_test_single_ctx_render_target_writes_a_counter();
> }
>
> + igt_describe("Test OA TLB invalidate");
> + igt_subtest("gen12-oa-tlb-invalidate") {
> + igt_require(intel_gen(devid) >= 12);
> + gen12_test_oa_tlb_invalidate();
> + }
> +
> igt_describe("Measure performance for a specific context using OAR in Gen 12");
> igt_subtest("gen12-unprivileged-single-ctx-counters") {
> igt_require(intel_gen(devid) >= 12);
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
next prev parent reply other threads:[~2020-03-10 9:02 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-10 3:07 [igt-dev] [PATCH i-g-t] test/perf: Add test to verify OA TLB invalidation Umesh Nerlige Ramappa
2020-03-10 9:02 ` Lionel Landwerlin [this message]
2020-03-10 17:57 ` Umesh Nerlige Ramappa
2020-03-12 13:18 ` Lionel Landwerlin
2020-03-10 13:14 ` [igt-dev] ✓ Fi.CI.BAT: success for " Patchwork
2020-03-10 17:22 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
-- strict thread matches above, loose matches on Subject: below --
2020-03-10 19:00 [igt-dev] [PATCH i-g-t] " Umesh Nerlige Ramappa
2020-03-12 13:28 ` Lionel Landwerlin
2020-03-13 17:42 Umesh Nerlige Ramappa
2020-03-13 17:51 ` Chris Wilson
2020-03-16 9:52 ` Lionel Landwerlin
2020-03-14 0:00 Umesh Nerlige Ramappa
2020-03-14 10:36 ` Lionel Landwerlin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=a96e4004-3c72-d39e-4ba7-02c582ff6538@intel.com \
--to=lionel.g.landwerlin@intel.com \
--cc=chris.p.wilson@intel.com \
--cc=igt-dev@lists.freedesktop.org \
--cc=umesh.nerlige.ramappa@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox