dma-buf: fix timeout handling in dma_resv_wait_timeout v2
authorChristian König <christian.koenig@amd.com>
Tue, 28 Jan 2025 09:47:48 +0000 (10:47 +0100)
committerChristian König <christian.koenig@amd.com>
Mon, 30 Jun 2025 11:15:44 +0000 (13:15 +0200)
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.

v2: improve code readability

Reported-by: Marek Olšák <marek.olsak@amd.com>
Reported-by: Lucas Stach <l.stach@pengutronix.de>
Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Lucas Stach <l.stach@pengutronix.de>
Cc: <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/20250129105841.1806-1-christian.koenig@amd.com
drivers/dma-buf/dma-resv.c

index b1ef4546346d443a11f042a3c7a7aed1c7ef151f..bea3e9858aca568807230084f24a867478659b5c 100644 (file)
@@ -685,11 +685,13 @@ 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 */
+               if (timeout)
+                       timeout = ret;
        }
        dma_resv_iter_end(&cursor);