Reviewed-by: Chunming Zhou <david1.zhou@xxxxxxx> 在 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@xxxxxxx> > --- > 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) _______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx