lima: actually wait for bo in lima_bo_wait
authorErico Nunes <nunes.erico@gmail.com>
Wed, 14 Aug 2019 20:39:33 +0000 (22:39 +0200)
committerErico Nunes <nunes.erico@gmail.com>
Fri, 16 Aug 2019 14:31:29 +0000 (16:31 +0200)
PIPE_TIMEOUT_INFINITE is unsigned and gets assigned to signed fields
where it ends up as -1. When this reaches the kernel as a timeout it
gets translated as no timeout, which cause the waiting functions to
return immediately and not actually wait for a completion.

This seems to cause unstable results with lima where even piglit tests
randomly fail.

Handle this by setting the signed max value in case of infinite timeout.

Signed-off-by: Erico Nunes <nunes.erico@gmail.com>
Reviewed-by: Qiang Yu <yuq825@gmail.com>
src/gallium/drivers/lima/lima_bo.c
src/gallium/drivers/lima/lima_submit.c

index 1d6dd720602a8abb3c1dd2c3a38462252a40acf5..bd1f6cf8c8c9cb3d58e48fd9db218de01b8457dc 100644 (file)
@@ -327,6 +327,9 @@ struct lima_bo *lima_bo_import(struct lima_screen *screen,
 bool lima_bo_wait(struct lima_bo *bo, uint32_t op, uint64_t timeout_ns)
 {
    int64_t abs_timeout = os_time_get_absolute_timeout(timeout_ns);
+   if (abs_timeout == OS_TIMEOUT_INFINITE)
+      abs_timeout = INT64_MAX;
+
    struct drm_lima_gem_wait req = {
       .handle = bo->handle,
       .op = op,
index 3b5145f3bc4874f731fbd1ad7d4e69867e33a95b..92909451db4926c33084867d23d2b448db615471 100644 (file)
@@ -155,6 +155,8 @@ bool lima_submit_start(struct lima_submit *submit, void *frame, uint32_t size)
 bool lima_submit_wait(struct lima_submit *submit, uint64_t timeout_ns)
 {
    int64_t abs_timeout = os_time_get_absolute_timeout(timeout_ns);
+   if (abs_timeout == OS_TIMEOUT_INFINITE)
+      abs_timeout = INT64_MAX;
 
    return !drmSyncobjWait(submit->screen->fd, &submit->out_sync, 1, abs_timeout, 0, NULL);
 }