summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2025-01-28 10:47:48 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2025-07-17 18:30:52 +0200
commit09064e6d659729d01742744efecd9131cdd93c24 (patch)
tree65d03093648f6203681e3fea86c19e1c58695d41
parent419192cb11f29a13ba671317f9b77019409d0b04 (diff)
downloadlinux-09064e6d659729d01742744efecd9131cdd93c24.tar.gz
linux-09064e6d659729d01742744efecd9131cdd93c24.tar.bz2
linux-09064e6d659729d01742744efecd9131cdd93c24.zip
dma-buf: fix timeout handling in dma_resv_wait_timeout v2
[ Upstream commit 2b95a7db6e0f75587bffddbb490399cbb87e4985 ] 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 Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r--drivers/dma-buf/dma-resv.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/dma-buf/dma-resv.c b/drivers/dma-buf/dma-resv.c
index 8db368c7d35c..cafaa54c3d9f 100644
--- a/drivers/dma-buf/dma-resv.c
+++ b/drivers/dma-buf/dma-resv.c
@@ -619,11 +619,13 @@ long dma_resv_wait_timeout(struct dma_resv *obj, bool wait_all, bool intr,
dma_resv_iter_begin(&cursor, obj, wait_all);
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);