aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2016-03-15 08:58:14 -0400
committerAlex Deucher <alexander.deucher@amd.com>2016-03-16 17:59:01 -0400
commit189e0fb763045aecc39c43100cd489c8756f3413 (patch)
tree5104f7bb1fb4ac333052ed87c8d1528a28e8abfb /drivers/gpu
parentb44135351a3a5cfc60f5b6729445311c2d5e141c (diff)
drm/amdgpu: RCU protected amd_sched_fence_release
Fences must be freed RCU protected, otherwise the reservation_object_*_rcu() functions can run into problems. Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/amd/scheduler/sched_fence.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/scheduler/sched_fence.c b/drivers/gpu/drm/amd/scheduler/sched_fence.c
index 87c78eecea64..dc115aea352b 100644
--- a/drivers/gpu/drm/amd/scheduler/sched_fence.c
+++ b/drivers/gpu/drm/amd/scheduler/sched_fence.c
@@ -84,12 +84,33 @@ static bool amd_sched_fence_enable_signaling(struct fence *f)
84 return true; 84 return true;
85} 85}
86 86
87static void amd_sched_fence_release(struct fence *f) 87/**
88 * amd_sched_fence_free - free up the fence memory
89 *
90 * @rcu: RCU callback head
91 *
92 * Free up the fence memory after the RCU grace period.
93 */
94static void amd_sched_fence_free(struct rcu_head *rcu)
88{ 95{
96 struct fence *f = container_of(rcu, struct fence, rcu);
89 struct amd_sched_fence *fence = to_amd_sched_fence(f); 97 struct amd_sched_fence *fence = to_amd_sched_fence(f);
90 kmem_cache_free(sched_fence_slab, fence); 98 kmem_cache_free(sched_fence_slab, fence);
91} 99}
92 100
101/**
102 * amd_sched_fence_release - callback that fence can be freed
103 *
104 * @fence: fence
105 *
106 * This function is called when the reference count becomes zero.
107 * It just RCU schedules freeing up the fence.
108 */
109static void amd_sched_fence_release(struct fence *f)
110{
111 call_rcu(&f->rcu, amd_sched_fence_free);
112}
113
93const struct fence_ops amd_sched_fence_ops = { 114const struct fence_ops amd_sched_fence_ops = {
94 .get_driver_name = amd_sched_fence_get_driver_name, 115 .get_driver_name = amd_sched_fence_get_driver_name,
95 .get_timeline_name = amd_sched_fence_get_timeline_name, 116 .get_timeline_name = amd_sched_fence_get_timeline_name,