diff mbox

[1/1] reservation: wait only with non-zero timeout specified (v2)

Message ID 1421128234-11968-1-git-send-email-Jammy.Zhou@amd.com (mailing list archive)
State New, archived
Headers show

Commit Message

Jammy Zhou Jan. 13, 2015, 5:50 a.m. UTC
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 <Jammy.Zhou@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
---
 drivers/dma-buf/reservation.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

Comments

Maarten Lankhorst Jan. 13, 2015, 6:50 a.m. UTC | #1
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 <Jammy.Zhou@amd.com>
> Reviewed-by: Christian König <christian.koenig@amd.com>
> Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
> ---
>  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:
>
Jammy Zhou Jan. 13, 2015, 7:59 a.m. UTC | #2
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.lankhorst@canonical.com] 

Sent: Tuesday, January 13, 2015 2:50 PM
To: Zhou, Jammy
Cc: dri-devel@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 <Jammy.Zhou@amd.com>

> Reviewed-by: Christian König <christian.koenig@amd.com>

> Reviewed-by: Alex Deucher <alexander.deucher@amd.com>

> ---

>  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:

>
Maarten Lankhorst Jan. 13, 2015, 8:05 a.m. UTC | #3
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
Jammy Zhou Jan. 13, 2015, 8:53 a.m. UTC | #4
> 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.lankhorst@canonical.com] 

Sent: Tuesday, January 13, 2015 4:05 PM
To: Zhou, Jammy
Cc: dri-devel@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
diff mbox

Patch

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: