aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0396-drm-amdgpu-RCU-protected-amdgpu_fence_release.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/0396-drm-amdgpu-RCU-protected-amdgpu_fence_release.patch')
-rw-r--r--common/recipes-kernel/linux/files/0396-drm-amdgpu-RCU-protected-amdgpu_fence_release.patch59
1 files changed, 59 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0396-drm-amdgpu-RCU-protected-amdgpu_fence_release.patch b/common/recipes-kernel/linux/files/0396-drm-amdgpu-RCU-protected-amdgpu_fence_release.patch
new file mode 100644
index 00000000..fc3e54aa
--- /dev/null
+++ b/common/recipes-kernel/linux/files/0396-drm-amdgpu-RCU-protected-amdgpu_fence_release.patch
@@ -0,0 +1,59 @@
+From 352824dfbfbff5328210e72402abe1a934113ce0 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
+Date: Tue, 15 Mar 2016 13:40:17 +0100
+Subject: [PATCH 0396/1110] drm/amdgpu: RCU protected amdgpu_fence_release
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+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>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 23 ++++++++++++++++++++++-
+ 1 file changed, 22 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
+index d8bbe85..ec73ab1 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
+@@ -638,12 +638,33 @@ static bool amdgpu_fence_enable_signaling(struct fence *f)
+ return true;
+ }
+
+-static void amdgpu_fence_release(struct fence *f)
++/**
++ * amdgpu_fence_free - free up the fence memory
++ *
++ * @rcu: RCU callback head
++ *
++ * Free up the fence memory after the RCU grace period.
++ */
++static void amdgpu_fence_free(struct rcu_head *rcu)
+ {
++ struct fence *f = container_of(rcu, struct fence, rcu);
+ struct amdgpu_fence *fence = to_amdgpu_fence(f);
+ kmem_cache_free(amdgpu_fence_slab, fence);
+ }
+
++/**
++ * amdgpu_fence_release - callback that fence can be freed
++ *
++ * @fence: fence
++ *
++ * This function is called when the reference count becomes zero.
++ * It just RCU schedules freeing up the fence.
++ */
++static void amdgpu_fence_release(struct fence *f)
++{
++ call_rcu(&f->rcu, amdgpu_fence_free);
++}
++
+ static const struct fence_ops amdgpu_fence_ops = {
+ .get_driver_name = amdgpu_fence_get_driver_name,
+ .get_timeline_name = amdgpu_fence_get_timeline_name,
+--
+2.7.4
+