Even the kerneldoc says that with a zero timeout the function should not
wait for anything, but still return 1 to indicate that the fences are
signaled now.

Unfortunately that isn't what was implemented, instead of only returning
1 we also waited for at least one jiffies.

Fix that by adjusting the handling to what the function is actually
documented to do.

Reported-by: Marek Olšák <marek.ol...@amd.com>
Reported-by: Lucas Stach <l.st...@pengutronix.de>
Signed-off-by: Christian König <christian.koe...@amd.com>
Cc: <sta...@vger.kernel.org>
---
 drivers/dma-buf/dma-resv.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/dma-buf/dma-resv.c b/drivers/dma-buf/dma-resv.c
index 5f8d010516f0..ae92d9d2394d 100644
--- a/drivers/dma-buf/dma-resv.c
+++ b/drivers/dma-buf/dma-resv.c
@@ -684,11 +684,12 @@ long dma_resv_wait_timeout(struct dma_resv *obj, enum 
dma_resv_usage usage,
        dma_resv_iter_begin(&cursor, obj, usage);
        dma_resv_for_each_fence_unlocked(&cursor, fence) {
 
-               ret = dma_fence_wait_timeout(fence, intr, ret);
-               if (ret <= 0) {
-                       dma_resv_iter_end(&cursor);
-                       return ret;
-               }
+               ret = dma_fence_wait_timeout(fence, intr, timeout);
+               if (ret <= 0)
+                       break;
+
+               /* Even for zero timeout the return value is 1 */
+               timeout = min(timeout, ret);
        }
        dma_resv_iter_end(&cursor);
 
-- 
2.34.1

Reply via email to