diff mbox series

dma-buf: fix timeout handling in dma_resv_wait_timeout v2

Message ID 20250129105841.1806-1-christian.koenig@amd.com (mailing list archive)
State New
Headers show
Series dma-buf: fix timeout handling in dma_resv_wait_timeout v2 | expand

Commit Message

Christian König Jan. 29, 2025, 10:58 a.m. UTC
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>
Cc: <stable@vger.kernel.org>
---
 drivers/dma-buf/dma-resv.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

Comments

Lucas Stach Jan. 29, 2025, 1:08 p.m. UTC | #1
Am Mittwoch, dem 29.01.2025 um 11:58 +0100 schrieb Christian König:
> 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>
> Cc: <stable@vger.kernel.org>

Reviewed-by: Lucas Stach <l.stach@pengutronix.de>

> ---
>  drivers/dma-buf/dma-resv.c | 12 +++++++-----
>  1 file changed, 7 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/dma-buf/dma-resv.c b/drivers/dma-buf/dma-resv.c
> index 5f8d010516f0..c78cdae3deaf 100644
> --- a/drivers/dma-buf/dma-resv.c
> +++ b/drivers/dma-buf/dma-resv.c
> @@ -684,11 +684,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);
>
diff mbox series

Patch

diff --git a/drivers/dma-buf/dma-resv.c b/drivers/dma-buf/dma-resv.c
index 5f8d010516f0..c78cdae3deaf 100644
--- a/drivers/dma-buf/dma-resv.c
+++ b/drivers/dma-buf/dma-resv.c
@@ -684,11 +684,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);