summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/igt_aux.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/lib/igt_aux.c b/lib/igt_aux.c
index b32297ee5..01654f002 100644
--- a/lib/igt_aux.c
+++ b/lib/igt_aux.c
@@ -42,6 +42,7 @@
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
+#include <sys/time.h>
#include <sys/types.h>
#include <sys/syscall.h>
#include <sys/utsname.h>
@@ -502,21 +503,27 @@ enum igt_runtime_pm_status igt_get_runtime_pm_status(void)
* Waits until for the driver to switch to into the desired runtime PM status,
* with a 10 second timeout.
*
+ * Some subtests call this function while the signal helper is active, so we
+ * can't assume each usleep() call will sleep for 100ms.
+ *
* Returns:
* True if the desired runtime PM status was attained, false if the operation
* timed out.
*/
bool igt_wait_for_pm_status(enum igt_runtime_pm_status status)
{
- int i;
- int hundred_ms = 100 * 1000, ten_s = 10 * 1000 * 1000;
+ struct timeval start, end, diff;
- for (i = 0; i < ten_s; i += hundred_ms) {
+ igt_assert(gettimeofday(&start, NULL) == 0);
+ do {
if (igt_get_runtime_pm_status() == status)
return true;
- usleep(hundred_ms);
- }
+ usleep(100 * 1000);
+
+ igt_assert(gettimeofday(&end, NULL) == 0);
+ timersub(&end, &start, &diff);
+ } while (diff.tv_sec < 10);
return false;
}