[PATCH] drm/amdgpu: fix dma_fence_wait without reference
Chunming Zhou
zhoucm1 at amd.com
Fri Aug 16 13:58:18 UTC 2019
Reviewed-by: Chunming Zhou <david1.zhou at amd.com>
在 2019/8/16 21:21, Christian König 写道:
> We need to grab a reference to the fence we wait for.
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | 27 ++++++++++++++-----------
> 1 file changed, 15 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
> index f539a2a92774..7398b4850649 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
> @@ -534,21 +534,24 @@ int amdgpu_ctx_wait_prev_fence(struct amdgpu_ctx *ctx,
> struct drm_sched_entity *entity)
> {
> struct amdgpu_ctx_entity *centity = to_amdgpu_ctx_entity(entity);
> - unsigned idx = centity->sequence & (amdgpu_sched_jobs - 1);
> - struct dma_fence *other = centity->fences[idx];
> + struct dma_fence *other;
> + unsigned idx;
> + long r;
>
> - if (other) {
> - signed long r;
> - r = dma_fence_wait(other, true);
> - if (r < 0) {
> - if (r != -ERESTARTSYS)
> - DRM_ERROR("Error (%ld) waiting for fence!\n", r);
> + spin_lock(&ctx->ring_lock);
> + idx = centity->sequence & (amdgpu_sched_jobs - 1);
> + other = dma_fence_get(centity->fences[idx]);
> + spin_unlock(&ctx->ring_lock);
>
> - return r;
> - }
> - }
> + if (!other)
> + return 0;
>
> - return 0;
> + r = dma_fence_wait(other, true);
> + if (r < 0 && r != -ERESTARTSYS)
> + DRM_ERROR("Error (%ld) waiting for fence!\n", r);
> +
> + dma_fence_put(other);
> + return r;
> }
>
> void amdgpu_ctx_mgr_init(struct amdgpu_ctx_mgr *mgr)
More information about the amd-gfx
mailing list