Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

+7 -5
+7 -5
drivers/dma-buf/dma-resv.c
··· 685 685 dma_resv_iter_begin(&cursor, obj, usage); 686 686 dma_resv_for_each_fence_unlocked(&cursor, fence) { 687 687 688 - ret = dma_fence_wait_timeout(fence, intr, ret); 689 - if (ret <= 0) { 690 - dma_resv_iter_end(&cursor); 691 - return ret; 692 - } 688 + ret = dma_fence_wait_timeout(fence, intr, timeout); 689 + if (ret <= 0) 690 + break; 691 + 692 + /* Even for zero timeout the return value is 1 */ 693 + if (timeout) 694 + timeout = ret; 693 695 } 694 696 dma_resv_iter_end(&cursor); 695 697