diff options
| author | Christian König <christian.koenig@amd.com> | 2025-01-28 10:47:48 +0100 |
|---|---|---|
| committer | Christian König <christian.koenig@amd.com> | 2025-06-30 13:15:44 +0200 |
| commit | 2b95a7db6e0f75587bffddbb490399cbb87e4985 (patch) | |
| tree | 31e423e4a89a7bd41497fabed6118b90aacf3acd | |
| parent | 615cc4223fcbe1e0e6f68b8494b26bb6c08d917a (diff) | |
dma-buf: fix timeout handling in dma_resv_wait_timeout v2
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
| -rw-r--r-- | drivers/dma-buf/dma-resv.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/dma-buf/dma-resv.c b/drivers/dma-buf/dma-resv.c index b1ef4546346d..bea3e9858aca 100644 --- a/drivers/dma-buf/dma-resv.c +++ b/drivers/dma-buf/dma-resv.c @@ -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); |
