summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2017-11-22 20:05:10 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2017-11-23 07:25:59 +0000
commit374216eecdf05cfe0aa04b58cf54e675b4b8b795 (patch)
treeac0d8a1641928887e47d1b92aff50640838ef83d /tests
parentfe9cf277f0975c9b5dceb83190a21535eb381903 (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.c23
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)