[igt-dev] [i-g-t] Fixing the latency of hrtimer
Umesh Nerlige Ramappa
umesh.nerlige.ramappa at intel.com
Fri Aug 28 19:56:28 UTC 2020
On Fri, Aug 28, 2020 at 10:44:27PM +0300, Lionel Landwerlin wrote:
>On 28/08/2020 22:34, Umesh Nerlige Ramappa wrote:
>>On Thu, Aug 27, 2020 at 06:22:40PM +0300, Lionel Landwerlin wrote:
>>>On 27/08/2020 18:09, Sowmya Kaparthi wrote:
>>>>This test undergoes sanity check that we are not spending more than
>>>>1/100th of the time awake in the kernel. The right thing would be to
>>>>adjust that value by the number of expected wakeups. We expect the
>>>>kernel time not to exceed 1/100th of the total test duration at the
>>>>default hrtimer of 200Hz/every5ms. Scale that by the provided
>>>>hrtimer if
>>>>applicable.
>>>>
>>>>Cc: Landwerlin, Lionel G <lionel.g.landwerlin at intel.com>
>>>>Signed-off-by: Sowmya Kaparthi <sowmyax.kaparthi at intel.com>
>>>>---
>>>> tests/i915/perf.c | 16 ++++++++++++++--
>>>> 1 file changed, 14 insertions(+), 2 deletions(-)
>>>>
>>>>diff --git a/tests/i915/perf.c b/tests/i915/perf.c
>>>>index a894fd38..0caa9fe0 100644
>>>>--- a/tests/i915/perf.c
>>>>+++ b/tests/i915/perf.c
>>>>@@ -1993,6 +1993,7 @@ test_blocking(uint64_t
>>>>requested_oa_period, bool set_kernel_hrtimer, uint64_t ke
>>>> int64_t start, end;
>>>> int n = 0;
>>>>+ uint64_t max_expected_kernel_ns;
>>>> stream_fd = __perf_open(drm_fd, ¶m, true /* prevent_pm */);
>>>>@@ -2098,7 +2099,12 @@ test_blocking(uint64_t
>>>>requested_oa_period, bool set_kernel_hrtimer, uint64_t ke
>>>> */
>>>> igt_assert(n > (min_iterations + n_extra_iterations));
>>>>- igt_assert(kernel_ns <= (test_duration_ns / 100ull));
>>>>+ if (set_kernel_hrtimer)
>>>>+ max_expected_kernel_ns = kernel_hrtimer *
>>>>(test_duration_ns / 100)
>>>>+ /(5 * 1000 * 1000);
>>>>+ else
>>>>+ max_expected_kernel_ns = test_duration_ns / 100;
>>>>+ igt_assert(kernel_ns <= max_expected_kernel_ns);
>>>
>>
>>Sorry, a little late to comment on this, but here it is anyways:
>>
>>I agree that we should ideally scale the check so that different
>>values of hrtimer can be accounted for. One of the values that
>>should factor into this calculation is the average time taken by a
>>read on a particular platform. For example, we saw an average 30 us
>>on TGL and this was counting up to around 150 ms in kernel_ns, so
>>test failed. That said, this is time taken by the cpu and I am not
>>sure we can guarantee this time. If the cpu frequency is scaled, we
>>have different values. Also different platforms would have
>>different results. Unless we can enforce a cpu frequency from IGT
>>and calibrate the kernel_ns for each platform, this check is going
>>to be buggy.
>>
>>For the *-parameterized tests alone, I would recommend not checking
>>kernel_ns at all because the intent of the test is to make sure we
>>are woken up a predetermined number of times for different values of
>>hrtimer.
>>
>>Thoughts?
>>
>>Thanks,
>>Umesh
>
>
>Agreed, those checks are pretty old and I'm struggling to find a good
>way to find whether the kernel is doing the right thing.
>
>Tracepoints maybe?
TGL values were measured with kernel function level ftrace. The time
taken by the read remained very close between the 2 cases that the
polling-parameterized test ran, so failure itself had nothing to do with
the value of hrtimer, but was rather due to the number of wakeups.
>
>
>If you want to drop the checks that would be fine.
Great, Let's drop the checks only for the parameterized tests.
Thanks,
Umesh
>
>
>Thanks,
>
>
>-Lionel
>
>
>>
>>>
>>>Thanks, looks good. Just a small coding style issue.
>>>
>>>Multiline blocks in if/for/while() needs to be surrounded by {}.
>>>
>>>
>>>With that fixed:
>>>
>>>
>>>Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
>>>
>>>
>>>Cheers,
>>>
>>>
>>>-Lionel
>>>
>>>
>>>> __perf_close(stream_fd);
>>>> }
>>>>@@ -2152,6 +2158,7 @@ test_polling(uint64_t requested_oa_period,
>>>>bool set_kernel_hrtimer, uint64_t ker
>>>> int min_iterations = (test_duration_ns / (oa_period +
>>>>(kernel_hrtimer + kernel_hrtimer / 5)));
>>>> int64_t start, end;
>>>> int n = 0;
>>>>+ uint64_t max_expected_kernel_ns;
>>>> stream_fd = __perf_open(drm_fd, ¶m, true /* prevent_pm */);
>>>>@@ -2286,7 +2293,12 @@ test_polling(uint64_t
>>>>requested_oa_period, bool set_kernel_hrtimer, uint64_t ker
>>>> */
>>>> igt_assert(n > (min_iterations + n_extra_iterations));
>>>>- igt_assert(kernel_ns <= (test_duration_ns / 100ull));
>>>>+ if (set_kernel_hrtimer)
>>>>+ max_expected_kernel_ns = kernel_hrtimer *
>>>>(test_duration_ns / 100)
>>>>+ / (5 * 1000 * 1000);
>>>>+ else
>>>>+ max_expected_kernel_ns = test_duration_ns / 100;
>>>>+ igt_assert(kernel_ns <= max_expected_kernel_ns);
>>>> __perf_close(stream_fd);
>>>> }
>>>
>>>
>
More information about the igt-dev
mailing list