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 |
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 --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);
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(-)