diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0430-drm-amdgpu-fence-wait-old-rcu-slot.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0430-drm-amdgpu-fence-wait-old-rcu-slot.patch | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0430-drm-amdgpu-fence-wait-old-rcu-slot.patch b/common/recipes-kernel/linux/files/0430-drm-amdgpu-fence-wait-old-rcu-slot.patch new file mode 100644 index 00000000..732eb63a --- /dev/null +++ b/common/recipes-kernel/linux/files/0430-drm-amdgpu-fence-wait-old-rcu-slot.patch @@ -0,0 +1,48 @@ +From f85e931c028faa6d279fa2d5741ec365a9ca4085 Mon Sep 17 00:00:00 2001 +From: Chunming Zhou <David1.Zhou@amd.com> +Date: Thu, 31 Mar 2016 11:07:14 +0800 +Subject: [PATCH 0430/1110] drm/amdgpu: fence wait old rcu slot +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +since the rcu slot was initialized to be num_hw_submission, +if command submission doesn't use scheduler, this limitation +will be invalid like uvd test. + +Signed-off-by: Chunming Zhou <David1.Zhou@amd.com> +Reviewed-by: Christian König <christian.koenig@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c +index 4303b44..d81f1f4 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c +@@ -121,7 +121,7 @@ int amdgpu_fence_emit(struct amdgpu_ring *ring, struct fence **f) + { + struct amdgpu_device *adev = ring->adev; + struct amdgpu_fence *fence; +- struct fence **ptr; ++ struct fence *old, **ptr; + uint32_t seq; + + fence = kmem_cache_alloc(amdgpu_fence_slab, GFP_KERNEL); +@@ -141,7 +141,11 @@ int amdgpu_fence_emit(struct amdgpu_ring *ring, struct fence **f) + /* This function can't be called concurrently anyway, otherwise + * emitting the fence would mess up the hardware ring buffer. + */ +- BUG_ON(rcu_dereference_protected(*ptr, 1)); ++ old = rcu_dereference_protected(*ptr, 1); ++ if (old && !fence_is_signaled(old)) { ++ DRM_INFO("rcu slot is busy\n"); ++ fence_wait(old, false); ++ } + + rcu_assign_pointer(*ptr, fence_get(&fence->base)); + +-- +2.7.4 + |