mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-07 13:13:57 +08:00
drm/sched: 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 Signed-off-by: Emily Deng <Emily.Deng@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
806f043f02
commit
52bf20f414
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user