Am 15.04.25 um 16:18 schrieb Arvind Yadav:
> Mesa passes shared bo, fence syncobj to userq_ioctl.
> There can be duplicates here or some fences that are old.
> This patch is remove duplicates fence and only keep
> the most recent fence for each context.
>
> Cc: Alex Deucher <alexander.deuc...@amd.com>
> Cc: Christian König <christian.koe...@amd.com>
> Cc: Sunil Khatri <sunil.kha...@amd.com>
> Cc: Arunpravin Paneer Selvam <arunpravin.paneersel...@amd.com>
> Signed-off-by: Arvind Yadav <arvind.ya...@amd.com>
> ---
>  .../gpu/drm/amd/amdgpu/amdgpu_userq_fence.c   | 37 +++++++++++++++++++
>  1 file changed, 37 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
> index a4953d668972..9a09d545ceb5 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
> @@ -25,6 +25,7 @@
>  #include <linux/kref.h>
>  #include <linux/slab.h>
>  #include <linux/dma-fence-unwrap.h>
> +#include <linux/sort.h>
>  
>  #include <drm/drm_exec.h>
>  #include <drm/drm_syncobj.h>
> @@ -584,6 +585,24 @@ int amdgpu_userq_signal_ioctl(struct drm_device *dev, 
> void *data,
>  #endif
>  
>  #ifdef CONFIG_DRM_AMDGPU_NAVI3X_USERQ
> +static int fence_cmp(const void *_a, const void *_b)
> +{
> +     struct dma_fence *a = *(struct dma_fence **)_a;
> +     struct dma_fence *b = *(struct dma_fence **)_b;
> +
> +     if (a->context < b->context)
> +             return -1;
> +     else if (a->context > b->context)
> +             return 1;
> +
> +     if (dma_fence_is_later(b, a))
> +             return 1;
> +     else if (dma_fence_is_later(a, b))
> +             return -1;
> +
> +     return 0;
> +}
> +
>  int amdgpu_userq_wait_ioctl(struct drm_device *dev, void *data,
>                           struct drm_file *filp)
>  {
> @@ -840,6 +859,24 @@ int amdgpu_userq_wait_ioctl(struct drm_device *dev, void 
> *data,
>                       fences[num_fences++] = fence;
>               }
>  
> +             if (num_fences > 1) {
> +                     int j = 0;
> +
> +                     sort(fences, num_fences, sizeof(*fences), fence_cmp, 
> NULL);
> +
> +                     /*
> +                      * Only keep the most recent fence for each context.
> +                      */
> +                     for (int i = 1; i < num_fences; i++) {
> +                             if (fences[i]->context == fences[j]->context)
> +                                     dma_fence_put(fences[i]);
> +                             else
> +                                     fences[++j] = fences[i];
> +                     }
> +
> +                     num_fences = ++j;
> +             }
> +

We already have the same code in drivers/dma-buf/dma-fence-unwrap.c.

I suggest to export this code from drivers/dma-buf/dma-fence-unwrap.c and just 
use it here as well.

Something like num_fences = dma_fence_shrink_array(fences, num_fences)

Regards,
Christian.

>               for (i = 0, cnt = 0; i < num_fences; i++) {
>                       struct amdgpu_userq_fence_driver *fence_drv;
>                       struct amdgpu_userq_fence *userq_fence;

Reply via email to