diff mbox series

dma-buf: fix check in dma_resv_add_fence

Message ID 20231115093035.1889-1-christian.koenig@amd.com (mailing list archive)
State New
Headers show
Series dma-buf: fix check in dma_resv_add_fence | expand

Commit Message

Christian König Nov. 15, 2023, 9:30 a.m. UTC
It's valid to add the same fence multiple times to a dma-resv object and
we shouldn't need one extra slot for each.

Signed-off-by: Christian König <christian.koenig@amd.com>
Fixes: a3f7c10a269d5 ("dma-buf/dma-resv: check if the new fence is really later")
Cc: stable@vger.kernel.org # v5.19+
---
 drivers/dma-buf/dma-resv.c |  2 +-
 include/linux/dma-fence.h  | 15 +++++++++++++++
 2 files changed, 16 insertions(+), 1 deletion(-)

Comments

Christian König Nov. 27, 2023, 1:24 p.m. UTC | #1
Ping? Can I get an rb or acked-by for that?

Thanks,
Christian.

Am 15.11.23 um 10:30 schrieb Christian König:
> It's valid to add the same fence multiple times to a dma-resv object and
> we shouldn't need one extra slot for each.
>
> Signed-off-by: Christian König <christian.koenig@amd.com>
> Fixes: a3f7c10a269d5 ("dma-buf/dma-resv: check if the new fence is really later")
> Cc: stable@vger.kernel.org # v5.19+
> ---
>   drivers/dma-buf/dma-resv.c |  2 +-
>   include/linux/dma-fence.h  | 15 +++++++++++++++
>   2 files changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/dma-buf/dma-resv.c b/drivers/dma-buf/dma-resv.c
> index 38b4110378de..eb8b733065b2 100644
> --- a/drivers/dma-buf/dma-resv.c
> +++ b/drivers/dma-buf/dma-resv.c
> @@ -301,7 +301,7 @@ void dma_resv_add_fence(struct dma_resv *obj, struct dma_fence *fence,
>   
>   		dma_resv_list_entry(fobj, i, obj, &old, &old_usage);
>   		if ((old->context == fence->context && old_usage >= usage &&
> -		     dma_fence_is_later(fence, old)) ||
> +		     dma_fence_is_later_or_same(fence, old)) ||
>   		    dma_fence_is_signaled(old)) {
>   			dma_resv_list_set(fobj, i, fence, usage);
>   			dma_fence_put(old);
> diff --git a/include/linux/dma-fence.h b/include/linux/dma-fence.h
> index ebe78bd3d121..b3772edca2e6 100644
> --- a/include/linux/dma-fence.h
> +++ b/include/linux/dma-fence.h
> @@ -498,6 +498,21 @@ static inline bool dma_fence_is_later(struct dma_fence *f1,
>   	return __dma_fence_is_later(f1->seqno, f2->seqno, f1->ops);
>   }
>   
> +/**
> + * dma_fence_is_later_or_same - return true if f1 is later or same as f2
> + * @f1: the first fence from the same context
> + * @f2: the second fence from the same context
> + *
> + * Returns true if f1 is chronologically later than f2 or the same fence. Both
> + * fences must be from the same context, since a seqno is not re-used across
> + * contexts.
> + */
> +static inline bool dma_fence_is_later_or_same(struct dma_fence *f1,
> +					      struct dma_fence *f2)
> +{
> +	return f1 == f2 || dma_fence_is_later(f1, f2);
> +}
> +
>   /**
>    * dma_fence_later - return the chronologically later fence
>    * @f1:	the first fence from the same context
Thomas Hellström (Intel) Nov. 27, 2023, 4:47 p.m. UTC | #2
On 11/27/23 14:24, Christian König wrote:
> Ping? Can I get an rb or acked-by for that?
>
> Thanks,
> Christian.
>
> Am 15.11.23 um 10:30 schrieb Christian König:
>> It's valid to add the same fence multiple times to a dma-resv object and
>> we shouldn't need one extra slot for each.
>>
>> Signed-off-by: Christian König <christian.koenig@amd.com>
>> Fixes: a3f7c10a269d5 ("dma-buf/dma-resv: check if the new fence is 
>> really later")
>> Cc: stable@vger.kernel.org # v5.19+


Reviewed-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>


>> ---
>>   drivers/dma-buf/dma-resv.c |  2 +-
>>   include/linux/dma-fence.h  | 15 +++++++++++++++
>>   2 files changed, 16 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/dma-buf/dma-resv.c b/drivers/dma-buf/dma-resv.c
>> index 38b4110378de..eb8b733065b2 100644
>> --- a/drivers/dma-buf/dma-resv.c
>> +++ b/drivers/dma-buf/dma-resv.c
>> @@ -301,7 +301,7 @@ void dma_resv_add_fence(struct dma_resv *obj, 
>> struct dma_fence *fence,
>>             dma_resv_list_entry(fobj, i, obj, &old, &old_usage);
>>           if ((old->context == fence->context && old_usage >= usage &&
>> -             dma_fence_is_later(fence, old)) ||
>> +             dma_fence_is_later_or_same(fence, old)) ||
>>               dma_fence_is_signaled(old)) {
>>               dma_resv_list_set(fobj, i, fence, usage);
>>               dma_fence_put(old);
>> diff --git a/include/linux/dma-fence.h b/include/linux/dma-fence.h
>> index ebe78bd3d121..b3772edca2e6 100644
>> --- a/include/linux/dma-fence.h
>> +++ b/include/linux/dma-fence.h
>> @@ -498,6 +498,21 @@ static inline bool dma_fence_is_later(struct 
>> dma_fence *f1,
>>       return __dma_fence_is_later(f1->seqno, f2->seqno, f1->ops);
>>   }
>>   +/**
>> + * dma_fence_is_later_or_same - return true if f1 is later or same 
>> as f2
>> + * @f1: the first fence from the same context
>> + * @f2: the second fence from the same context
>> + *
>> + * Returns true if f1 is chronologically later than f2 or the same 
>> fence. Both
>> + * fences must be from the same context, since a seqno is not 
>> re-used across
>> + * contexts.
>> + */
>> +static inline bool dma_fence_is_later_or_same(struct dma_fence *f1,
>> +                          struct dma_fence *f2)
>> +{
>> +    return f1 == f2 || dma_fence_is_later(f1, f2);
>> +}
>> +
>>   /**
>>    * dma_fence_later - return the chronologically later fence
>>    * @f1:    the first fence from the same context
>
> _______________________________________________
> Linaro-mm-sig mailing list -- linaro-mm-sig@lists.linaro.org
> To unsubscribe send an email to linaro-mm-sig-leave@lists.linaro.org
diff mbox series

Patch

diff --git a/drivers/dma-buf/dma-resv.c b/drivers/dma-buf/dma-resv.c
index 38b4110378de..eb8b733065b2 100644
--- a/drivers/dma-buf/dma-resv.c
+++ b/drivers/dma-buf/dma-resv.c
@@ -301,7 +301,7 @@  void dma_resv_add_fence(struct dma_resv *obj, struct dma_fence *fence,
 
 		dma_resv_list_entry(fobj, i, obj, &old, &old_usage);
 		if ((old->context == fence->context && old_usage >= usage &&
-		     dma_fence_is_later(fence, old)) ||
+		     dma_fence_is_later_or_same(fence, old)) ||
 		    dma_fence_is_signaled(old)) {
 			dma_resv_list_set(fobj, i, fence, usage);
 			dma_fence_put(old);
diff --git a/include/linux/dma-fence.h b/include/linux/dma-fence.h
index ebe78bd3d121..b3772edca2e6 100644
--- a/include/linux/dma-fence.h
+++ b/include/linux/dma-fence.h
@@ -498,6 +498,21 @@  static inline bool dma_fence_is_later(struct dma_fence *f1,
 	return __dma_fence_is_later(f1->seqno, f2->seqno, f1->ops);
 }
 
+/**
+ * dma_fence_is_later_or_same - return true if f1 is later or same as f2
+ * @f1: the first fence from the same context
+ * @f2: the second fence from the same context
+ *
+ * Returns true if f1 is chronologically later than f2 or the same fence. Both
+ * fences must be from the same context, since a seqno is not re-used across
+ * contexts.
+ */
+static inline bool dma_fence_is_later_or_same(struct dma_fence *f1,
+					      struct dma_fence *f2)
+{
+	return f1 == f2 || dma_fence_is_later(f1, f2);
+}
+
 /**
  * dma_fence_later - return the chronologically later fence
  * @f1:	the first fence from the same context