[Intel-gfx] [PATCH igt] igt/perf_pmu: Avoid underflow in measured_sleep()

Chris Wilson chris at chris-wilson.co.uk
Wed Nov 22 20:14:23 UTC 2017


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)
-- 
2.15.0



More information about the Intel-gfx mailing list