diff mbox

dma-buf/reservation: should keep later one in add fence(v2)

Message ID 1520308390-32469-1-git-send-email-Monk.Liu@amd.com (mailing list archive)
State New, archived
Headers show

Commit Message

Liu, Monk March 6, 2018, 3:53 a.m. UTC
v2:
still check context first to avoid warning from dma_fence_is_later
apply this fix in add_shared_replace as well

Change-Id: If6a979ba9fd6c923b82212f35f07a9ff31c86767
Signed-off-by: Monk Liu <Monk.Liu@amd.com>
---
 drivers/dma-buf/reservation.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

Comments

Chunming Zhou March 6, 2018, 4:25 a.m. UTC | #1
On 2018年03月06日 11:53, Monk Liu wrote:
> v2:
> still check context first to avoid warning from dma_fence_is_later
> apply this fix in add_shared_replace as well
>
> Change-Id: If6a979ba9fd6c923b82212f35f07a9ff31c86767
> Signed-off-by: Monk Liu <Monk.Liu@amd.com>
> ---
>   drivers/dma-buf/reservation.c | 6 ++++--
>   1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/dma-buf/reservation.c b/drivers/dma-buf/reservation.c
> index 314eb10..c6e3c86 100644
> --- a/drivers/dma-buf/reservation.c
> +++ b/drivers/dma-buf/reservation.c
> @@ -118,7 +118,8 @@ reservation_object_add_shared_inplace(struct reservation_object *obj,
>   		old_fence = rcu_dereference_protected(fobj->shared[i],
>   						reservation_object_held(obj));
>   
> -		if (old_fence->context == fence->context) {
> +		if (old_fence->context == fence->context &&
> +			dma_fence_is_later(fence, old_fence)) {
>   			/* memory barrier is added by write_seqcount_begin */
>   			RCU_INIT_POINTER(fobj->shared[i], fence);
>   			write_seqcount_end(&obj->seq);
> @@ -179,7 +180,8 @@ reservation_object_add_shared_replace(struct reservation_object *obj,
>   		check = rcu_dereference_protected(old->shared[i],
>   						reservation_object_held(obj));
>   
> -		if (check->context == fence->context ||
> +		if ((check->context == fence->context &&
> +			dma_fence_is_later(fence, check)) ||
We still need do more for !dma_fence_is_later(fence, check)   case, in 
which, we will don't need add new fence to resv slot.

if ((check->context == fence->context) && dma_fence_is_later(fence, check))
         fobj->shared_count = j;
         RCU_INIT_POINTER(fobj->shared[fobj->shared_count], fence);
         fobj->shared_count++;
} else {
         dma_fence_put(fence);
}


Regards,
David Zhou
>   		    dma_fence_is_signaled(check))
>   			RCU_INIT_POINTER(fobj->shared[--k], check);
>   		else
Liu, Monk March 6, 2018, 5:59 a.m. UTC | #2
>   

> -		if (check->context == fence->context ||

> +		if ((check->context == fence->context &&

> +			dma_fence_is_later(fence, check)) ||

We still need do more for !dma_fence_is_later(fence, check)   case, in which, we will don't need add new fence to resv slot.

if ((check->context == fence->context) && dma_fence_is_later(fence, check))
         fobj->shared_count = j;
         RCU_INIT_POINTER(fobj->shared[fobj->shared_count], fence);
         fobj->shared_count++;
} else {
         dma_fence_put(fence);
}

No you cannot do that, check is changed and not the one you want,
Besides, we don't need to consider the case you mentioned, take only one fence in obj->staged for example:

You add a fence whose context is equal to this fence (check), so current logic will put this check into fobj->shared[++j], so in the end
Obj->fence will point to fobj, and original old would be rcu_kfree() 

No additional action actually needed...

/Monk

-----Original Message-----
From: Zhou, David(ChunMing) 

Sent: 2018年3月6日 12:25
To: Liu, Monk <Monk.Liu@amd.com>; dri-devel@freedesktop.org
Subject: Re: [PATCH] dma-buf/reservation: should keep later one in add fence(v2)



On 2018年03月06日 11:53, Monk Liu wrote:
> v2:

> still check context first to avoid warning from dma_fence_is_later 

> apply this fix in add_shared_replace as well

>

> Change-Id: If6a979ba9fd6c923b82212f35f07a9ff31c86767

> Signed-off-by: Monk Liu <Monk.Liu@amd.com>

> ---

>   drivers/dma-buf/reservation.c | 6 ++++--

>   1 file changed, 4 insertions(+), 2 deletions(-)

>

> diff --git a/drivers/dma-buf/reservation.c 

> b/drivers/dma-buf/reservation.c index 314eb10..c6e3c86 100644

> --- a/drivers/dma-buf/reservation.c

> +++ b/drivers/dma-buf/reservation.c

> @@ -118,7 +118,8 @@ reservation_object_add_shared_inplace(struct reservation_object *obj,

>   		old_fence = rcu_dereference_protected(fobj->shared[i],

>   						reservation_object_held(obj));

>   

> -		if (old_fence->context == fence->context) {

> +		if (old_fence->context == fence->context &&

> +			dma_fence_is_later(fence, old_fence)) {

>   			/* memory barrier is added by write_seqcount_begin */

>   			RCU_INIT_POINTER(fobj->shared[i], fence);

>   			write_seqcount_end(&obj->seq);

> @@ -179,7 +180,8 @@ reservation_object_add_shared_replace(struct reservation_object *obj,

>   		check = rcu_dereference_protected(old->shared[i],

>   						reservation_object_held(obj));

>   

> -		if (check->context == fence->context ||

> +		if ((check->context == fence->context &&

> +			dma_fence_is_later(fence, check)) ||

We still need do more for !dma_fence_is_later(fence, check)   case, in which, we will don't need add new fence to resv slot.

if ((check->context == fence->context) && dma_fence_is_later(fence, check))
         fobj->shared_count = j;
         RCU_INIT_POINTER(fobj->shared[fobj->shared_count], fence);
         fobj->shared_count++;
} else {
         dma_fence_put(fence);
}


Regards,
David Zhou
>   		    dma_fence_is_signaled(check))

>   			RCU_INIT_POINTER(fobj->shared[--k], check);

>   		else
Chunming Zhou March 6, 2018, 6:07 a.m. UTC | #3
On 2018年03月06日 13:59, Liu, Monk wrote:
>>    
>> -		if (check->context == fence->context ||
>> +		if ((check->context == fence->context &&
>> +			dma_fence_is_later(fence, check)) ||
> We still need do more for !dma_fence_is_later(fence, check)   case, in which, we will don't need add new fence to resv slot.
>
> if ((check->context == fence->context) && dma_fence_is_later(fence, check))
>           fobj->shared_count = j;
>           RCU_INIT_POINTER(fobj->shared[fobj->shared_count], fence);
>           fobj->shared_count++;
> } else {
>           dma_fence_put(fence);
> }
>
> No you cannot do that, check is changed and not the one you want,
> Besides, we don't need to consider the case you mentioned, take only one fence in obj->staged for example:
>
> You add a fence whose context is equal to this fence (check), so current logic will put this check into fobj->shared[++j],
Yes, if !dma_fence_is_later(fence, check), then 'check' will be put to 
fobj->shared[++j], so we don't need add new fence to resv slot, don't we?

Regards,
David Zhou
> so in the end
> Obj->fence will point to fobj, and original old would be rcu_kfree()
>
> No additional action actually needed...
>
> /Monk
>
> -----Original Message-----
> From: Zhou, David(ChunMing)
> Sent: 2018年3月6日 12:25
> To: Liu, Monk <Monk.Liu@amd.com>; dri-devel@freedesktop.org
> Subject: Re: [PATCH] dma-buf/reservation: should keep later one in add fence(v2)
>
>
>
> On 2018年03月06日 11:53, Monk Liu wrote:
>> v2:
>> still check context first to avoid warning from dma_fence_is_later
>> apply this fix in add_shared_replace as well
>>
>> Change-Id: If6a979ba9fd6c923b82212f35f07a9ff31c86767
>> Signed-off-by: Monk Liu <Monk.Liu@amd.com>
>> ---
>>    drivers/dma-buf/reservation.c | 6 ++++--
>>    1 file changed, 4 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/dma-buf/reservation.c
>> b/drivers/dma-buf/reservation.c index 314eb10..c6e3c86 100644
>> --- a/drivers/dma-buf/reservation.c
>> +++ b/drivers/dma-buf/reservation.c
>> @@ -118,7 +118,8 @@ reservation_object_add_shared_inplace(struct reservation_object *obj,
>>    		old_fence = rcu_dereference_protected(fobj->shared[i],
>>    						reservation_object_held(obj));
>>    
>> -		if (old_fence->context == fence->context) {
>> +		if (old_fence->context == fence->context &&
>> +			dma_fence_is_later(fence, old_fence)) {
>>    			/* memory barrier is added by write_seqcount_begin */
>>    			RCU_INIT_POINTER(fobj->shared[i], fence);
>>    			write_seqcount_end(&obj->seq);
>> @@ -179,7 +180,8 @@ reservation_object_add_shared_replace(struct reservation_object *obj,
>>    		check = rcu_dereference_protected(old->shared[i],
>>    						reservation_object_held(obj));
>>    
>> -		if (check->context == fence->context ||
>> +		if ((check->context == fence->context &&
>> +			dma_fence_is_later(fence, check)) ||
> We still need do more for !dma_fence_is_later(fence, check)   case, in which, we will don't need add new fence to resv slot.
>
> if ((check->context == fence->context) && dma_fence_is_later(fence, check))
>           fobj->shared_count = j;
>           RCU_INIT_POINTER(fobj->shared[fobj->shared_count], fence);
>           fobj->shared_count++;
> } else {
>           dma_fence_put(fence);
> }
>
>
> Regards,
> David Zhou
>>    		    dma_fence_is_signaled(check))
>>    			RCU_INIT_POINTER(fobj->shared[--k], check);
>>    		else
Liu, Monk March 6, 2018, 7:10 a.m. UTC | #4
Make sense, will give v3

-----Original Message-----
From: Zhou, David(ChunMing) 

Sent: 2018年3月6日 14:08
To: Liu, Monk <Monk.Liu@amd.com>; Zhou, David(ChunMing) <David1.Zhou@amd.com>; dri-devel@freedesktop.org
Subject: Re: [PATCH] dma-buf/reservation: should keep later one in add fence(v2)



On 2018年03月06日 13:59, Liu, Monk wrote:
>>    

>> -		if (check->context == fence->context ||

>> +		if ((check->context == fence->context &&

>> +			dma_fence_is_later(fence, check)) ||

> We still need do more for !dma_fence_is_later(fence, check)   case, in which, we will don't need add new fence to resv slot.

>

> if ((check->context == fence->context) && dma_fence_is_later(fence, check))

>           fobj->shared_count = j;

>           RCU_INIT_POINTER(fobj->shared[fobj->shared_count], fence);

>           fobj->shared_count++;

> } else {

>           dma_fence_put(fence);

> }

>

> No you cannot do that, check is changed and not the one you want, 

> Besides, we don't need to consider the case you mentioned, take only one fence in obj->staged for example:

>

> You add a fence whose context is equal to this fence (check), so 

> current logic will put this check into fobj->shared[++j],

Yes, if !dma_fence_is_later(fence, check), then 'check' will be put to 
fobj->shared[++j], so we don't need add new fence to resv slot, don't we?

Regards,
David Zhou
> so in the end

> Obj->fence will point to fobj, and original old would be rcu_kfree()

>

> No additional action actually needed...

>

> /Monk

>

> -----Original Message-----

> From: Zhou, David(ChunMing)

> Sent: 2018年3月6日 12:25

> To: Liu, Monk <Monk.Liu@amd.com>; dri-devel@freedesktop.org

> Subject: Re: [PATCH] dma-buf/reservation: should keep later one in add 

> fence(v2)

>

>

>

> On 2018年03月06日 11:53, Monk Liu wrote:

>> v2:

>> still check context first to avoid warning from dma_fence_is_later 

>> apply this fix in add_shared_replace as well

>>

>> Change-Id: If6a979ba9fd6c923b82212f35f07a9ff31c86767

>> Signed-off-by: Monk Liu <Monk.Liu@amd.com>

>> ---

>>    drivers/dma-buf/reservation.c | 6 ++++--

>>    1 file changed, 4 insertions(+), 2 deletions(-)

>>

>> diff --git a/drivers/dma-buf/reservation.c 

>> b/drivers/dma-buf/reservation.c index 314eb10..c6e3c86 100644

>> --- a/drivers/dma-buf/reservation.c

>> +++ b/drivers/dma-buf/reservation.c

>> @@ -118,7 +118,8 @@ reservation_object_add_shared_inplace(struct reservation_object *obj,

>>    		old_fence = rcu_dereference_protected(fobj->shared[i],

>>    						reservation_object_held(obj));

>>    

>> -		if (old_fence->context == fence->context) {

>> +		if (old_fence->context == fence->context &&

>> +			dma_fence_is_later(fence, old_fence)) {

>>    			/* memory barrier is added by write_seqcount_begin */

>>    			RCU_INIT_POINTER(fobj->shared[i], fence);

>>    			write_seqcount_end(&obj->seq);

>> @@ -179,7 +180,8 @@ reservation_object_add_shared_replace(struct reservation_object *obj,

>>    		check = rcu_dereference_protected(old->shared[i],

>>    						reservation_object_held(obj));

>>    

>> -		if (check->context == fence->context ||

>> +		if ((check->context == fence->context &&

>> +			dma_fence_is_later(fence, check)) ||

> We still need do more for !dma_fence_is_later(fence, check)   case, in which, we will don't need add new fence to resv slot.

>

> if ((check->context == fence->context) && dma_fence_is_later(fence, check))

>           fobj->shared_count = j;

>           RCU_INIT_POINTER(fobj->shared[fobj->shared_count], fence);

>           fobj->shared_count++;

> } else {

>           dma_fence_put(fence);

> }

>

>

> Regards,

> David Zhou

>>    		    dma_fence_is_signaled(check))

>>    			RCU_INIT_POINTER(fobj->shared[--k], check);

>>    		else
Chris Wilson March 6, 2018, 8:24 a.m. UTC | #5
Quoting Monk Liu (2018-03-06 03:53:10)
> v2:
> still check context first to avoid warning from dma_fence_is_later
> apply this fix in add_shared_replace as well
> 
> Change-Id: If6a979ba9fd6c923b82212f35f07a9ff31c86767
> Signed-off-by: Monk Liu <Monk.Liu@amd.com>
> ---
>  drivers/dma-buf/reservation.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/dma-buf/reservation.c b/drivers/dma-buf/reservation.c
> index 314eb10..c6e3c86 100644
> --- a/drivers/dma-buf/reservation.c
> +++ b/drivers/dma-buf/reservation.c
> @@ -118,7 +118,8 @@ reservation_object_add_shared_inplace(struct reservation_object *obj,
>                 old_fence = rcu_dereference_protected(fobj->shared[i],
>                                                 reservation_object_held(obj));
>  
> -               if (old_fence->context == fence->context) {
> +               if (old_fence->context == fence->context &&
> +                       dma_fence_is_later(fence, old_fence)) {

This should be true by construction. Adding an older fence on the same
context is a programming bug, imo. Between different callers the resv
should have been locked and the fenced operations serialised, from the
same caller, you shouldn't be handling more than one output fence?
-Chris
Liu, Monk March 6, 2018, 10:37 a.m. UTC | #6
okay
diff mbox

Patch

diff --git a/drivers/dma-buf/reservation.c b/drivers/dma-buf/reservation.c
index 314eb10..c6e3c86 100644
--- a/drivers/dma-buf/reservation.c
+++ b/drivers/dma-buf/reservation.c
@@ -118,7 +118,8 @@  reservation_object_add_shared_inplace(struct reservation_object *obj,
 		old_fence = rcu_dereference_protected(fobj->shared[i],
 						reservation_object_held(obj));
 
-		if (old_fence->context == fence->context) {
+		if (old_fence->context == fence->context &&
+			dma_fence_is_later(fence, old_fence)) {
 			/* memory barrier is added by write_seqcount_begin */
 			RCU_INIT_POINTER(fobj->shared[i], fence);
 			write_seqcount_end(&obj->seq);
@@ -179,7 +180,8 @@  reservation_object_add_shared_replace(struct reservation_object *obj,
 		check = rcu_dereference_protected(old->shared[i],
 						reservation_object_held(obj));
 
-		if (check->context == fence->context ||
+		if ((check->context == fence->context &&
+			dma_fence_is_later(fence, check)) ||
 		    dma_fence_is_signaled(check))
 			RCU_INIT_POINTER(fobj->shared[--k], check);
 		else