[PATCH] dma-buf: keep the signaling time of merged fences

Christian König ckoenig.leichtzumerken at gmail.com
Wed Jun 21 08:36:45 UTC 2023


Hi guys,

can I get a quick rb for this?

Going to add a Fixes tag before pushing.

Thanks,
Christian.

Am 21.06.23 um 09:57 schrieb Jessie Hao:
> Hi Christian,
> After applying the patch, the below android CTS cases can pass:
> CtsDeqpTestCases dEQP-EGL.functional.get_frame_timestamps*
> Thanks for taking care of this.
>
> Tested-by: Jessie Hao <juan.hao at nxp.com>
>
> -----Original Message-----
> From: Christian König <ckoenig.leichtzumerken at gmail.com>
> Sent: Wednesday, June 21, 2023 3:32 PM
> To: Jessie Hao <juan.hao at nxp.com>; dri-devel at lists.freedesktop.org
> Cc: Christian König <christian.koenig at amd.com>; stable at vger.kernel.org
> Subject: [PATCH] dma-buf: keep the signaling time of merged fences
>
>
> Some Android CTS is testing for that.
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
> CC: stable at vger.kernel.org
> ---
>   drivers/dma-buf/dma-fence-unwrap.c | 11 +++++++++--
>   drivers/dma-buf/dma-fence.c        |  5 +++--
>   drivers/gpu/drm/drm_syncobj.c      |  2 +-
>   include/linux/dma-fence.h          |  2 +-
>   4 files changed, 14 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/dma-buf/dma-fence-unwrap.c b/drivers/dma-buf/dma-fence-unwrap.c
> index 7002bca792ff..06eb91306c01 100644
> --- a/drivers/dma-buf/dma-fence-unwrap.c
> +++ b/drivers/dma-buf/dma-fence-unwrap.c
> @@ -66,18 +66,25 @@ struct dma_fence *__dma_fence_unwrap_merge(unsigned int num_fences,  {
>          struct dma_fence_array *result;
>          struct dma_fence *tmp, **array;
> +       ktime_t timestamp;
>          unsigned int i;
>          size_t count;
>
>          count = 0;
> +       timestamp = ns_to_ktime(0);
>          for (i = 0; i < num_fences; ++i) {
> -               dma_fence_unwrap_for_each(tmp, &iter[i], fences[i])
> +               dma_fence_unwrap_for_each(tmp, &iter[i], fences[i]) {
>                          if (!dma_fence_is_signaled(tmp))
>                                  ++count;
> +                       else if (test_bit(DMA_FENCE_FLAG_TIMESTAMP_BIT,
> +                                         &tmp->flags) &&
> +                                ktime_after(tmp->timestamp, timestamp))
> +                               timestamp = tmp->timestamp;
> +               }
>          }
>
>          if (count == 0)
> -               return dma_fence_get_stub();
> +               return dma_fence_allocate_private_stub(timestamp);
>
>          array = kmalloc_array(count, sizeof(*array), GFP_KERNEL);
>          if (!array)
> diff --git a/drivers/dma-buf/dma-fence.c b/drivers/dma-buf/dma-fence.c index f177c56269bb..ad076f208760 100644
> --- a/drivers/dma-buf/dma-fence.c
> +++ b/drivers/dma-buf/dma-fence.c
> @@ -150,10 +150,11 @@ EXPORT_SYMBOL(dma_fence_get_stub);
>
>   /**
>    * dma_fence_allocate_private_stub - return a private, signaled fence
> + * @timestamp: timestamp when the fence was signaled
>    *
>    * Return a newly allocated and signaled stub fence.
>    */
> -struct dma_fence *dma_fence_allocate_private_stub(void)
> +struct dma_fence *dma_fence_allocate_private_stub(ktime_t timestamp)
>   {
>          struct dma_fence *fence;
>
> @@ -169,7 +170,7 @@ struct dma_fence *dma_fence_allocate_private_stub(void)
>          set_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT,
>                  &fence->flags);
>
> -       dma_fence_signal(fence);
> +       dma_fence_signal_timestamp(fence, timestamp);
>
>          return fence;
>   }
> diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c index 0c2be8360525..04589a35eb09 100644
> --- a/drivers/gpu/drm/drm_syncobj.c
> +++ b/drivers/gpu/drm/drm_syncobj.c
> @@ -353,7 +353,7 @@ EXPORT_SYMBOL(drm_syncobj_replace_fence);
>    */
>   static int drm_syncobj_assign_null_handle(struct drm_syncobj *syncobj)  {
> -       struct dma_fence *fence = dma_fence_allocate_private_stub();
> +       struct dma_fence *fence =
> + dma_fence_allocate_private_stub(ktime_get());
>
>          if (IS_ERR(fence))
>                  return PTR_ERR(fence);
> diff --git a/include/linux/dma-fence.h b/include/linux/dma-fence.h index d54b595a0fe0..0d678e9a7b24 100644
> --- a/include/linux/dma-fence.h
> +++ b/include/linux/dma-fence.h
> @@ -606,7 +606,7 @@ static inline signed long dma_fence_wait(struct dma_fence *fence, bool intr)  void dma_fence_set_deadline(struct dma_fence *fence, ktime_t deadline);
>
>   struct dma_fence *dma_fence_get_stub(void); -struct dma_fence *dma_fence_allocate_private_stub(void);
> +struct dma_fence *dma_fence_allocate_private_stub(ktime_t timestamp);
>   u64 dma_fence_context_alloc(unsigned num);
>
>   extern const struct dma_fence_ops dma_fence_array_ops;
> --
> 2.34.1
>



More information about the dri-devel mailing list