[PATCH 1/1] reservation: wait only with non-zero timeout specified (v2)
When the timeout value passed to reservation_object_wait_timeout_rcu is zero, no wait should be done if the fences are not signaled. Return '1' for idle and '0' for busy if the specified timeout is '0' to keep consistent with the case of non-zero timeout. v2: call fence_put if not signaled in the case of timeout==0 Signed-off-by: Jammy Zhou Reviewed-by: Christian König Reviewed-by: Alex Deucher --- drivers/dma-buf/reservation.c | 9 - 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/dma-buf/reservation.c b/drivers/dma-buf/reservation.c index 3c97c8f..b1d554f 100644 --- a/drivers/dma-buf/reservation.c +++ b/drivers/dma-buf/reservation.c @@ -380,12 +380,19 @@ retry: } rcu_read_unlock(); - if (fence) { + if (fence && timeout) { ret = fence_wait_timeout(fence, intr, ret); fence_put(fence); if (ret > 0 && wait_all && (i + 1 < shared_count)) goto retry; } + + if (fence && !timeout) + fence_put(fence); + + if (!fence && !timeout) + ret = 1; + return ret; unlock_retry: -- 1.9.1
[PATCH 1/1] reservation: wait only with non-zero timeout specified (v2)
Op 13-01-15 om 08:59 schreef Zhou, Jammy: > Hi Maarten, > >> Can't you simply add if (!timeout) return >> !reservation_object_test_signaled_rcu(obj, wait_all); to the beginning >> instead? > Hmm, after looking into it, I think that can achieve the same purpose. I will > update the patch with this. > >> Also why do you need this? Why not simply return 0 with timeout = 0. > The major purpose here is to use reservation_object_wait_timeout_rcu to > handle all possible timeout values (and just to check status with > timeout==0). If we simply return 0, we cannot determine the fence is signaled > or not with the return value. You can't anyway when calling with timeout = 0. * fence_wait_timeout - sleep until the fence gets signaled * * Returns -ERESTARTSYS if interrupted, 0 if the wait timed out, or the * remaining timeout in jiffies on success. Other error values may be * returned on custom implementations. Since you have 0 returning jiffies, you would get 0 regardless of fence_wait being succesful or not. I think the only right way to handle this is by returning 0 immediately if timeout is 0. Why do you need it to return 1? Why not use reservation_object_test_signaled_rcu directly? ~Maarten
[PATCH 1/1] reservation: wait only with non-zero timeout specified (v2)
> You can't anyway when calling with timeout = 0. For consistency, we can always return 0 for busy (not signaled), and return '>0' for idle (signaled). This rule should be common for reservation_object_wait_timeout_rcu. So in my previous patch, '1' is returned for signaled case when specified timeout is zero. > Since you have 0 returning jiffies, you would get 0 regardless of fence_wait > being succesful or not. IMHO, fence_wait_timeout shouldn't be called per se when timeout==0. > Why do you need it to return 1? Why not use > reservation_object_test_signaled_rcu directly? Just as I mentioned above, return 1 is to make the returning values of reservation_object_wait_timeout_rcu consistent for both cases. And we can call reservation_object_test_signaled_rcu directly in driver side, but it will be better if we can also add 'timeout==0' support in reservation_object_wait_timeout_rcu (sometimes it isn't preventable). Regards, Jammy -Original Message- From: Maarten Lankhorst [mailto:maarten.lankho...@canonical.com] Sent: Tuesday, January 13, 2015 4:05 PM To: Zhou, Jammy Cc: dri-devel at lists.freedesktop.org; Christian König; Deucher, Alexander Subject: Re: [PATCH 1/1] reservation: wait only with non-zero timeout specified (v2) Op 13-01-15 om 08:59 schreef Zhou, Jammy: > Hi Maarten, > >> Can't you simply add if (!timeout) return >> !reservation_object_test_signaled_rcu(obj, wait_all); to the beginning >> instead? > Hmm, after looking into it, I think that can achieve the same purpose. I will > update the patch with this. > >> Also why do you need this? Why not simply return 0 with timeout = 0. > The major purpose here is to use reservation_object_wait_timeout_rcu to > handle all possible timeout values (and just to check status with > timeout==0). If we simply return 0, we cannot determine the fence is signaled > or not with the return value. You can't anyway when calling with timeout = 0. * fence_wait_timeout - sleep until the fence gets signaled * * Returns -ERESTARTSYS if interrupted, 0 if the wait timed out, or the * remaining timeout in jiffies on success. Other error values may be * returned on custom implementations. Since you have 0 returning jiffies, you would get 0 regardless of fence_wait being succesful or not. I think the only right way to handle this is by returning 0 immediately if timeout is 0. Why do you need it to return 1? Why not use reservation_object_test_signaled_rcu directly? ~Maarten
[PATCH 1/1] reservation: wait only with non-zero timeout specified (v2)
Hi Maarten, > Can't you simply add if (!timeout) return > !reservation_object_test_signaled_rcu(obj, wait_all); to the beginning > instead? Hmm, after looking into it, I think that can achieve the same purpose. I will update the patch with this. > Also why do you need this? Why not simply return 0 with timeout = 0. The major purpose here is to use reservation_object_wait_timeout_rcu to handle all possible timeout values (and just to check status with timeout==0). If we simply return 0, we cannot determine the fence is signaled or not with the return value. Regards, Jammy -Original Message- From: Maarten Lankhorst [mailto:maarten.lankho...@canonical.com] Sent: Tuesday, January 13, 2015 2:50 PM To: Zhou, Jammy Cc: dri-devel at lists.freedesktop.org; Christian König; Deucher, Alexander Subject: Re: [PATCH 1/1] reservation: wait only with non-zero timeout specified (v2) Hey, Can't you simply add if (!timeout) return !reservation_object_test_signaled_rcu(obj, wait_all); to the beginning instead? Waiting with timeout = 0 is not really defined. Look at fence_default_wait for example. It returns timeout if the fence is signaled, but since this is 0 you can't distinguish between timed out wait and succesful wait. Also why do you need this? Why not simply return 0 with timeout = 0. ~Maarten On 13-01-15 06:50, Jammy Zhou wrote: > When the timeout value passed to reservation_object_wait_timeout_rcu > is zero, no wait should be done if the fences are not signaled. > > Return '1' for idle and '0' for busy if the specified timeout is '0' > to keep consistent with the case of non-zero timeout. > > v2: call fence_put if not signaled in the case of timeout==0 > > Signed-off-by: Jammy Zhou > Reviewed-by: Christian König > Reviewed-by: Alex Deucher > --- > drivers/dma-buf/reservation.c | 9 - > 1 file changed, 8 insertions(+), 1 deletion(-) > > diff --git a/drivers/dma-buf/reservation.c > b/drivers/dma-buf/reservation.c index 3c97c8f..b1d554f 100644 > --- a/drivers/dma-buf/reservation.c > +++ b/drivers/dma-buf/reservation.c > @@ -380,12 +380,19 @@ retry: > } > > rcu_read_unlock(); > - if (fence) { > + if (fence && timeout) { > ret = fence_wait_timeout(fence, intr, ret); > fence_put(fence); > if (ret > 0 && wait_all && (i + 1 < shared_count)) > goto retry; > } > + > + if (fence && !timeout) > + fence_put(fence); > + > + if (!fence && !timeout) > + ret = 1; > + > return ret; > > unlock_retry: >
[PATCH 1/1] reservation: wait only with non-zero timeout specified (v2)
Hey, Can't you simply add if (!timeout) return !reservation_object_test_signaled_rcu(obj, wait_all); to the beginning instead? Waiting with timeout = 0 is not really defined. Look at fence_default_wait for example. It returns timeout if the fence is signaled, but since this is 0 you can't distinguish between timed out wait and succesful wait. Also why do you need this? Why not simply return 0 with timeout = 0. ~Maarten On 13-01-15 06:50, Jammy Zhou wrote: > When the timeout value passed to reservation_object_wait_timeout_rcu > is zero, no wait should be done if the fences are not signaled. > > Return '1' for idle and '0' for busy if the specified timeout is '0' > to keep consistent with the case of non-zero timeout. > > v2: call fence_put if not signaled in the case of timeout==0 > > Signed-off-by: Jammy Zhou > Reviewed-by: Christian König > Reviewed-by: Alex Deucher > --- > drivers/dma-buf/reservation.c | 9 - > 1 file changed, 8 insertions(+), 1 deletion(-) > > diff --git a/drivers/dma-buf/reservation.c b/drivers/dma-buf/reservation.c > index 3c97c8f..b1d554f 100644 > --- a/drivers/dma-buf/reservation.c > +++ b/drivers/dma-buf/reservation.c > @@ -380,12 +380,19 @@ retry: > } > > rcu_read_unlock(); > - if (fence) { > + if (fence && timeout) { > ret = fence_wait_timeout(fence, intr, ret); > fence_put(fence); > if (ret > 0 && wait_all && (i + 1 < shared_count)) > goto retry; > } > + > + if (fence && !timeout) > + fence_put(fence); > + > + if (!fence && !timeout) > + ret = 1; > + > return ret; > > unlock_retry: >