[PATCH] drm/amdgpu: add rcu_barrier after entity fini

Deng, Emily Emily.Deng at amd.com
Wed May 23 05:25:08 UTC 2018


Ping ......

> -----Original Message-----
> From: Emily Deng [mailto:Emily.Deng at amd.com]
> Sent: Monday, May 21, 2018 4:09 PM
> To: amd-gfx at lists.freedesktop.org
> Cc: Deng, Emily <Emily.Deng at amd.com>
> Subject: [PATCH] drm/amdgpu: add rcu_barrier after entity fini
> 
> To free the fence from the amdgpu_fence_slab, need twice call_rcu, to
> avoid the amdgpu_fence_slab_fini call
> kmem_cache_destroy(amdgpu_fence_slab) before
> kmem_cache_free(amdgpu_fence_slab, fence), add rcu_barrier after
> drm_sched_entity_fini.
> 
> The kmem_cache_free(amdgpu_fence_slab, fence)'s call trace as below:
> 1.drm_sched_entity_fini ->
> drm_sched_entity_cleanup ->
> dma_fence_put(entity->last_scheduled) ->
> drm_sched_fence_release_finished ->
> drm_sched_fence_release_scheduled -> call_rcu(&fence->finished.rcu,
> drm_sched_fence_free)
> 
> 2.drm_sched_fence_free ->
> dma_fence_put(fence->parent) ->
> amdgpu_fence_release ->
> call_rcu(&f->rcu, amdgpu_fence_free) ->
> kmem_cache_free(amdgpu_fence_slab, fence);
> 
> v2:put the barrier before the kmem_cache_destroy v3:put the
> dma_fence_put(fence->parent) before call_rcu in
> drm_sched_fence_release_scheduled
> 
> Change-Id: I8dcadd3372f97e72461bf46b41cc26d90f09b8df
> Signed-off-by: Emily Deng <Emily.Deng at amd.com>
> ---
>  drivers/gpu/drm/scheduler/sched_fence.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/scheduler/sched_fence.c
> b/drivers/gpu/drm/scheduler/sched_fence.c
> index 786b47f..df44616 100644
> --- a/drivers/gpu/drm/scheduler/sched_fence.c
> +++ b/drivers/gpu/drm/scheduler/sched_fence.c
> @@ -98,7 +98,6 @@ static void drm_sched_fence_free(struct rcu_head *rcu)
>  	struct dma_fence *f = container_of(rcu, struct dma_fence, rcu);
>  	struct drm_sched_fence *fence = to_drm_sched_fence(f);
> 
> -	dma_fence_put(fence->parent);
>  	kmem_cache_free(sched_fence_slab, fence);  }
> 
> @@ -114,6 +113,7 @@ static void
> drm_sched_fence_release_scheduled(struct dma_fence *f)  {
>  	struct drm_sched_fence *fence = to_drm_sched_fence(f);
> 
> +	dma_fence_put(fence->parent);
>  	call_rcu(&fence->finished.rcu, drm_sched_fence_free);  }
> 
> --
> 2.7.4



More information about the amd-gfx mailing list