On 17.09.25 11:59, David Rosca wrote:
> drm_syncobj_find_fence returns fence chain for timeline syncobjs.
> Scheduler expects normal fences as job dependencies to be able to
> determine whether the fences come from the same entity or sched
> and skip waiting on them.
> With fence chain as job dependency, the fence will always be
> waited on forcing CPU round-trip before starting the job.
> 
> Signed-off-by: David Rosca <[email protected]>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 10 ++++++++--
>  1 file changed, 8 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> index 2e93d570153c..779c11227a53 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> @@ -29,6 +29,7 @@
>  #include <linux/pagemap.h>
>  #include <linux/sync_file.h>
>  #include <linux/dma-buf.h>
> +#include <linux/dma-fence-unwrap.h>
>  
>  #include <drm/amdgpu_drm.h>
>  #include <drm/drm_syncobj.h>
> @@ -450,7 +451,8 @@ static int amdgpu_syncobj_lookup_and_add(struct 
> amdgpu_cs_parser *p,
>                                        uint32_t handle, u64 point,
>                                        u64 flags)
>  {
> -     struct dma_fence *fence;
> +     struct dma_fence *fence, *f;
> +     struct dma_fence_unwrap iter;
>       int r;
>  
>       r = drm_syncobj_find_fence(p->filp, handle, point, flags, &fence);
> @@ -460,7 +462,11 @@ static int amdgpu_syncobj_lookup_and_add(struct 
> amdgpu_cs_parser *p,
>               return r;
>       }
>  
> -     r = amdgpu_sync_fence(&p->sync, fence, GFP_KERNEL);
> +     dma_fence_unwrap_for_each(f, &iter, fence) {
> +             if (!r)
> +                     r = amdgpu_sync_fence(&p->sync, f, GFP_KERNEL);

You should probably add an dma_fence_unwrap_cleanup() function which drops 
iter->chain and sets it to NULL and then code this like:

r = ...
if (r) {
        dma_fence_unwrap_cleanup(..);
        return r;
}

> +     }
> +
>       dma_fence_put(fence);

That is superfluous now, fence was consumed by dma_fence_unwrap_for_each().

Regards,
Christian.

>       return r;
>  }

Reply via email to