[Intel-gfx] [PATCH igt] igt/perf_pmu: Avoid underflow in measured_sleep()
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Thu Nov 23 07:04:57 UTC 2017
On 22/11/2017 20:14, Chris Wilson wrote:
> Be careful not to underflow into a very large positive usec value and so
> sleep forever^W until boredom kicks in.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> ---
> tests/perf_pmu.c | 23 +++++++++--------------
> 1 file changed, 9 insertions(+), 14 deletions(-)
>
> diff --git a/tests/perf_pmu.c b/tests/perf_pmu.c
> index 5d5f2b30..e153aaf3 100644
> --- a/tests/perf_pmu.c
> +++ b/tests/perf_pmu.c
> @@ -111,22 +111,17 @@ static void pmu_read_multi(int fd, unsigned int num, uint64_t *val)
> */
> static unsigned int measured_usleep(unsigned int usec)
> {
> - uint64_t slept = 0;
> -
> - while (usec > 0) {
> - struct timespec start = { };
> - uint64_t this_sleep;
> + struct timespec ts = { };
> + unsigned int slept;
>
> - igt_nsec_elapsed(&start);
> - usleep(usec);
> - this_sleep = igt_nsec_elapsed(&start);
> - slept += this_sleep;
> - if (this_sleep > usec * 1000)
> - break;
> - usec -= this_sleep;
> - }
> + slept = igt_nsec_elapsed(&ts);
> + igt_assert(slept == 0);
> + do {
> + usleep(usec - slept);
> + slept = igt_nsec_elapsed(&ts) / 1000;
> + } while (slept < usec);
>
> - return slept;
> + return igt_nsec_elapsed(&ts);
> }
>
> static unsigned int e2ring(int gem_fd, const struct intel_execution_engine2 *e)
>
Looks OK. Silly bug of mine and I wonder how I was so lucky not to hit
it all this time.
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Regards,
Tvrtko
More information about the Intel-gfx
mailing list