diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2017-11-22 20:05:10 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2017-11-23 07:25:59 +0000 |
commit | 374216eecdf05cfe0aa04b58cf54e675b4b8b795 (patch) | |
tree | ac0d8a1641928887e47d1b92aff50640838ef83d /tests | |
parent | fe9cf277f0975c9b5dceb83190a21535eb381903 (diff) |
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 <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/perf_pmu.c | 23 |
1 files changed, 9 insertions, 14 deletions
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) |