From 374216eecdf05cfe0aa04b58cf54e675b4b8b795 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Wed, 22 Nov 2017 20:05:10 +0000 Subject: igt/perf_pmu: Avoid underflow in measured_sleep() 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 Cc: Tvrtko Ursulin Reviewed-by: Tvrtko Ursulin --- tests/perf_pmu.c | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) (limited to 'tests') diff --git a/tests/perf_pmu.c b/tests/perf_pmu.c index 5258f4ce..382b77d2 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) -- cgit v1.2.3